blob: 016dd3c55ef736b3d0fed8349b58b06431144a88 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001#!/usr/bin/env python
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00004from test import test_support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import time
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import thread, threading
10import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000011import sys
Barry Warsawcf3d4b51997-01-03 20:03:32 +000012
Guido van Rossum24e4af82002-06-12 19:18:08 +000013PORT = 50007
14HOST = 'localhost'
15MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000016
Guido van Rossum24e4af82002-06-12 19:18:08 +000017class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Guido van Rossum24e4af82002-06-12 19:18:08 +000019 def setUp(self):
20 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
21 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
22 self.serv.bind((HOST, PORT))
23 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000024
Guido van Rossum24e4af82002-06-12 19:18:08 +000025 def tearDown(self):
26 self.serv.close()
27 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000028
Guido van Rossum24e4af82002-06-12 19:18:08 +000029class SocketUDPTest(unittest.TestCase):
30
31 def setUp(self):
32 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
33 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
34 self.serv.bind((HOST, PORT))
35
36 def tearDown(self):
37 self.serv.close()
38 self.serv = None
39
40class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000041 """Threadable Test class
42
43 The ThreadableTest class makes it easy to create a threaded
44 client/server pair from an existing unit test. To create a
45 new threaded class from an existing unit test, use multiple
46 inheritance:
47
48 class NewClass (OldClass, ThreadableTest):
49 pass
50
51 This class defines two new fixture functions with obvious
52 purposes for overriding:
53
54 clientSetUp ()
55 clientTearDown ()
56
57 Any new test functions within the class must then define
58 tests in pairs, where the test name is preceeded with a
59 '_' to indicate the client portion of the test. Ex:
60
61 def testFoo(self):
62 # Server portion
63
64 def _testFoo(self):
65 # Client portion
66
67 Any exceptions raised by the clients during their tests
68 are caught and transferred to the main thread to alert
69 the testing framework.
70
71 Note, the server setup function cannot call any blocking
72 functions that rely on the client thread during setup,
73 unless serverExplicityReady() is called just before
74 the blocking call (such as in setting up a client/server
75 connection and performing the accept() in setUp().
76 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000077
78 def __init__(self):
79 # Swap the true setup function
80 self.__setUp = self.setUp
81 self.__tearDown = self.tearDown
82 self.setUp = self._setUp
83 self.tearDown = self._tearDown
84
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000085 def serverExplicitReady(self):
86 """This method allows the server to explicitly indicate that
87 it wants the client thread to proceed. This is useful if the
88 server is about to execute a blocking routine that is
89 dependent upon the client thread during its setup routine."""
90 self.server_ready.set()
91
Guido van Rossum24e4af82002-06-12 19:18:08 +000092 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000093 self.server_ready = threading.Event()
94 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000095 self.done = threading.Event()
96 self.queue = Queue.Queue(1)
97
98 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +000099 methodname = self.id()
100 i = methodname.rfind('.')
101 methodname = methodname[i+1:]
102 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000103 self.client_thread = thread.start_new_thread(
104 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000105
106 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000107 if not self.server_ready.isSet():
108 self.server_ready.set()
109 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000110
111 def _tearDown(self):
112 self.__tearDown()
113 self.done.wait()
114
115 if not self.queue.empty():
116 msg = self.queue.get()
117 self.fail(msg)
118
119 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000120 self.server_ready.wait()
121 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122 self.clientSetUp()
123 if not callable(test_func):
124 raise TypeError, "test_func must be a callable function"
125 try:
126 test_func()
127 except Exception, strerror:
128 self.queue.put(strerror)
129 self.clientTearDown()
130
131 def clientSetUp(self):
132 raise NotImplementedError, "clientSetUp must be implemented."
133
134 def clientTearDown(self):
135 self.done.set()
136 thread.exit()
137
138class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
139
140 def __init__(self, methodName='runTest'):
141 SocketTCPTest.__init__(self, methodName=methodName)
142 ThreadableTest.__init__(self)
143
144 def clientSetUp(self):
145 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
146
147 def clientTearDown(self):
148 self.cli.close()
149 self.cli = None
150 ThreadableTest.clientTearDown(self)
151
152class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
153
154 def __init__(self, methodName='runTest'):
155 SocketUDPTest.__init__(self, methodName=methodName)
156 ThreadableTest.__init__(self)
157
158 def clientSetUp(self):
159 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
160
161class SocketConnectedTest(ThreadedTCPSocketTest):
162
163 def __init__(self, methodName='runTest'):
164 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
165
166 def setUp(self):
167 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000168 # Indicate explicitly we're ready for the client thread to
169 # proceed and then perform the blocking call to accept
170 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000171 conn, addr = self.serv.accept()
172 self.cli_conn = conn
173
174 def tearDown(self):
175 self.cli_conn.close()
176 self.cli_conn = None
177 ThreadedTCPSocketTest.tearDown(self)
178
179 def clientSetUp(self):
180 ThreadedTCPSocketTest.clientSetUp(self)
181 self.cli.connect((HOST, PORT))
182 self.serv_conn = self.cli
183
184 def clientTearDown(self):
185 self.serv_conn.close()
186 self.serv_conn = None
187 ThreadedTCPSocketTest.clientTearDown(self)
188
189#######################################################################
190## Begin Tests
191
192class GeneralModuleTests(unittest.TestCase):
193
194 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000195 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000196 def raise_error(*args, **kwargs):
197 raise socket.error
198 def raise_herror(*args, **kwargs):
199 raise socket.herror
200 def raise_gaierror(*args, **kwargs):
201 raise socket.gaierror
202 self.failUnlessRaises(socket.error, raise_error,
203 "Error raising socket exception.")
204 self.failUnlessRaises(socket.error, raise_herror,
205 "Error raising socket exception.")
206 self.failUnlessRaises(socket.error, raise_gaierror,
207 "Error raising socket exception.")
208
209 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000210 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211 socket.AF_INET
212 socket.SOCK_STREAM
213 socket.SOCK_DGRAM
214 socket.SOCK_RAW
215 socket.SOCK_RDM
216 socket.SOCK_SEQPACKET
217 socket.SOL_SOCKET
218 socket.SO_REUSEADDR
219
Guido van Rossum654c11e2002-06-13 20:24:17 +0000220 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000221 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000222 hostname = socket.gethostname()
223 ip = socket.gethostbyname(hostname)
224 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
225 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
226 all_host_names = [hname] + aliases
227 fqhn = socket.getfqdn()
228 if not fqhn in all_host_names:
229 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000230
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000231 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000232 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000234 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000235 try:
236 # On some versions, this loses a reference
237 orig = sys.getrefcount(__name__)
238 socket.getnameinfo(__name__,0)
239 except SystemError:
240 if sys.getrefcount(__name__) <> orig:
241 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000242
Guido van Rossum24e4af82002-06-12 19:18:08 +0000243 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000244 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000245 try:
246 # On some versions, this crashes the interpreter.
247 socket.getnameinfo(('x', 0, 0, 0), 0)
248 except socket.error:
249 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000250
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000251 def testNtoH(self):
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000252 for func in socket.htonl, socket.ntohl:
Guido van Rossum558fc972002-08-12 22:01:24 +0000253 for i in (0, 1, ~0xffff, 2L):
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000254 self.assertEqual(i, func(func(i)))
255
256 biglong = 2**32L - 1
257 swapped = func(biglong)
258 self.assert_(swapped == biglong or swapped == -1)
259 self.assertRaises(OverflowError, func, 2L**34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000260
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261 def testGetServByName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000262 # Testing getservbyname()
Skip Montanarof4433302002-08-02 15:52:30 +0000263 # try a few protocols - not everyone has telnet enabled
264 found = 0
265 for proto in ("telnet", "ssh", "www", "ftp"):
266 try:
267 socket.getservbyname(proto, 'tcp')
268 found = 1
269 break
270 except socket.error:
271 pass
272 try:
273 socket.getservbyname(proto, 'udp')
274 found = 1
275 break
276 except socket.error:
277 pass
278 if not found:
279 raise socket.error
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000281 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000282 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000283 # The default timeout should initially be None
284 self.assertEqual(socket.getdefaulttimeout(), None)
285 s = socket.socket()
286 self.assertEqual(s.gettimeout(), None)
287 s.close()
288
289 # Set the default timeout to 10, and see if it propagates
290 socket.setdefaulttimeout(10)
291 self.assertEqual(socket.getdefaulttimeout(), 10)
292 s = socket.socket()
293 self.assertEqual(s.gettimeout(), 10)
294 s.close()
295
296 # Reset the default timeout to None, and see if it propagates
297 socket.setdefaulttimeout(None)
298 self.assertEqual(socket.getdefaulttimeout(), None)
299 s = socket.socket()
300 self.assertEqual(s.gettimeout(), None)
301 s.close()
302
303 # Check that setting it to an invalid value raises ValueError
304 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
305
306 # Check that setting it to an invalid type raises TypeError
307 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
308
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000309 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000310
Guido van Rossum24e4af82002-06-12 19:18:08 +0000311 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000312 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000313 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000314 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000316 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000317
318 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000319 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000320 # We know a socket should start without reuse==0
321 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
322 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000323 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000324
325 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000326 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000327 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
328 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
329 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000330 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000332 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000333 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000334 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
335 sock.settimeout(1)
336 sock.close()
337 self.assertRaises(socket.error, sock.send, "spam")
338
Guido van Rossum24e4af82002-06-12 19:18:08 +0000339class BasicTCPTest(SocketConnectedTest):
340
341 def __init__(self, methodName='runTest'):
342 SocketConnectedTest.__init__(self, methodName=methodName)
343
344 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000345 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000346 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000347 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000348
349 def _testRecv(self):
350 self.serv_conn.send(MSG)
351
352 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000353 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000354 seg1 = self.cli_conn.recv(len(MSG) - 3)
355 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000356 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000357 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358
359 def _testOverFlowRecv(self):
360 self.serv_conn.send(MSG)
361
362 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000363 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000364 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000365 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000366
367 def _testRecvFrom(self):
368 self.serv_conn.send(MSG)
369
370 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000371 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000372 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
373 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000374 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000375 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376
377 def _testOverFlowRecvFrom(self):
378 self.serv_conn.send(MSG)
379
380 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000381 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000382 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000383 while 1:
384 read = self.cli_conn.recv(1024)
385 if not read:
386 break
Guido van Rossume531e292002-08-08 20:28:34 +0000387 msg += read
388 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000389
390 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000391 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000392 self.serv_conn.sendall(big_chunk)
393
394 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000395 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000396 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000397 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000398 fd = self.cli_conn.fileno()
399 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
400 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000401 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000402
403 def _testFromFd(self):
404 self.serv_conn.send(MSG)
405
406 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000407 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000408 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000409 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000410
411 def _testShutdown(self):
412 self.serv_conn.send(MSG)
413 self.serv_conn.shutdown(2)
414
415class BasicUDPTest(ThreadedUDPSocketTest):
416
417 def __init__(self, methodName='runTest'):
418 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
419
420 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000421 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000422 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000423 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000424
425 def _testSendtoAndRecv(self):
426 self.cli.sendto(MSG, 0, (HOST, PORT))
427
Guido van Rossum1c938012002-06-12 21:17:20 +0000428 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000429 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000430 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000431 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000432
Guido van Rossum1c938012002-06-12 21:17:20 +0000433 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000434 self.cli.sendto(MSG, 0, (HOST, PORT))
435
436class NonBlockingTCPTests(ThreadedTCPSocketTest):
437
438 def __init__(self, methodName='runTest'):
439 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
440
441 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000442 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000443 self.serv.setblocking(0)
444 start = time.time()
445 try:
446 self.serv.accept()
447 except socket.error:
448 pass
449 end = time.time()
450 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
451
452 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000453 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000454
Guido van Rossum24e4af82002-06-12 19:18:08 +0000455 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000456 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000457 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000458 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000459 conn, addr = self.serv.accept()
460 except socket.error:
461 pass
462 else:
463 self.fail("Error trying to do non-blocking accept.")
464 read, write, err = select.select([self.serv], [], [])
465 if self.serv in read:
466 conn, addr = self.serv.accept()
467 else:
468 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000469
Guido van Rossum24e4af82002-06-12 19:18:08 +0000470 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000471 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000472 self.cli.connect((HOST, PORT))
473
474 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000475 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000476 conn, addr = self.serv.accept()
477
478 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000479 self.cli.settimeout(10)
480 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000481
482 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000483 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000484 conn, addr = self.serv.accept()
485 conn.setblocking(0)
486 try:
487 msg = conn.recv(len(MSG))
488 except socket.error:
489 pass
490 else:
491 self.fail("Error trying to do non-blocking recv.")
492 read, write, err = select.select([conn], [], [])
493 if conn in read:
494 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000495 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496 else:
497 self.fail("Error during select call to non-blocking socket.")
498
499 def _testRecv(self):
500 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000501 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000502 self.cli.send(MSG)
503
504class FileObjectClassTestCase(SocketConnectedTest):
505
Guido van Rossume9f66142002-08-07 15:46:19 +0000506 bufsize = -1 # Use default buffer size
507
Guido van Rossum24e4af82002-06-12 19:18:08 +0000508 def __init__(self, methodName='runTest'):
509 SocketConnectedTest.__init__(self, methodName=methodName)
510
511 def setUp(self):
512 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000513 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000514
515 def tearDown(self):
516 self.serv_file.close()
517 self.serv_file = None
518 SocketConnectedTest.tearDown(self)
519
520 def clientSetUp(self):
521 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000522 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000523
524 def clientTearDown(self):
525 self.cli_file.close()
526 self.cli_file = None
527 SocketConnectedTest.clientTearDown(self)
528
529 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000530 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531 first_seg = self.serv_file.read(len(MSG)-3)
532 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000533 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000534 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535
536 def _testSmallRead(self):
537 self.cli_file.write(MSG)
538 self.cli_file.flush()
539
Guido van Rossum8c943832002-08-08 01:00:28 +0000540 def testFullRead(self):
541 # read until EOF
542 msg = self.serv_file.read()
543 self.assertEqual(msg, MSG)
544
545 def _testFullRead(self):
546 self.cli_file.write(MSG)
547 self.cli_file.close()
548
Guido van Rossum24e4af82002-06-12 19:18:08 +0000549 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000550 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000551 buf = ''
552 while 1:
553 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000554 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000555 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000556 buf += char
557 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000558
559 def _testUnbufferedRead(self):
560 self.cli_file.write(MSG)
561 self.cli_file.flush()
562
563 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000564 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000566 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000567
568 def _testReadline(self):
569 self.cli_file.write(MSG)
570 self.cli_file.flush()
571
Guido van Rossume9f66142002-08-07 15:46:19 +0000572class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
573
574 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000575
Guido van Rossume9f66142002-08-07 15:46:19 +0000576 In this case (and in this case only), it should be possible to
577 create a file object, read a line from it, create another file
578 object, read another line from it, without loss of data in the
579 first file object's buffer. Note that httplib relies on this
580 when reading multiple requests from the same socket."""
581
582 bufsize = 0 # Use unbuffered mode
583
584 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000585 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000586 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000587 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000588 self.serv_file = self.cli_conn.makefile('rb', 0)
589 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000590 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000591
592 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000593 self.cli_file.write("A. " + MSG)
594 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000595 self.cli_file.flush()
596
Guido van Rossum8c943832002-08-08 01:00:28 +0000597class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
598
599 bufsize = 1 # Default-buffered for reading; line-buffered for writing
600
601
602class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
603
604 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000605
Guido van Rossumb995eb72002-07-31 16:08:40 +0000606def test_main():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000607 suite = unittest.TestSuite()
Guido van Rossum29bf9152002-08-07 16:03:06 +0000608 suite.addTest(unittest.makeSuite(GeneralModuleTests))
609 suite.addTest(unittest.makeSuite(BasicTCPTest))
Jack Jansen522e7692002-09-06 21:57:50 +0000610 if sys.platform != 'mac':
611 suite.addTest(unittest.makeSuite(BasicUDPTest))
Guido van Rossum29bf9152002-08-07 16:03:06 +0000612 suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613 suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
Guido van Rossume9f66142002-08-07 15:46:19 +0000614 suite.addTest(unittest.makeSuite(UnbufferedFileObjectClassTestCase))
Guido van Rossum8c943832002-08-08 01:00:28 +0000615 suite.addTest(unittest.makeSuite(LineBufferedFileObjectClassTestCase))
616 suite.addTest(unittest.makeSuite(SmallBufferedFileObjectClassTestCase))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617 test_support.run_suite(suite)
618
619if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000620 test_main()