blob: bca1c6cabd12da9ab71f8ed33ba5c3115a5317e0 [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()
Guido van Rossum71e02942002-12-26 16:55:15 +0000223 try:
224 ip = socket.gethostbyname(hostname)
225 except socket.error:
226 # Probably name lookup wasn't set up right; skip this test
227 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000228 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000229 try:
230 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
231 except socket.error:
232 # Probably a similar problem as above; skip this test
233 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000234 all_host_names = [hname] + aliases
235 fqhn = socket.getfqdn()
236 if not fqhn in all_host_names:
237 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000238
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000239 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000240 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000241 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000242 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000243 try:
244 # On some versions, this loses a reference
245 orig = sys.getrefcount(__name__)
246 socket.getnameinfo(__name__,0)
247 except SystemError:
248 if sys.getrefcount(__name__) <> orig:
249 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000250
Guido van Rossum24e4af82002-06-12 19:18:08 +0000251 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000252 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000253 try:
254 # On some versions, this crashes the interpreter.
255 socket.getnameinfo(('x', 0, 0, 0), 0)
256 except socket.error:
257 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000258
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000259 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000260 # This just checks that htons etc. are their own inverse,
261 # when looking at the lower 16 or 32 bits.
262 sizes = {socket.htonl: 32, socket.ntohl: 32,
263 socket.htons: 16, socket.ntohs: 16}
264 for func, size in sizes.items():
265 mask = (1L<<size) - 1
266 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
267 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000268
Guido van Rossuma2627af2002-09-14 00:58:46 +0000269 swapped = func(mask)
270 self.assertEqual(swapped & mask, mask)
271 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000272
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 def testGetServByName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000274 # Testing getservbyname()
Skip Montanarof4433302002-08-02 15:52:30 +0000275 # try a few protocols - not everyone has telnet enabled
276 found = 0
277 for proto in ("telnet", "ssh", "www", "ftp"):
278 try:
279 socket.getservbyname(proto, 'tcp')
280 found = 1
281 break
282 except socket.error:
283 pass
284 try:
285 socket.getservbyname(proto, 'udp')
286 found = 1
287 break
288 except socket.error:
289 pass
290 if not found:
291 raise socket.error
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000293 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000294 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000295 # The default timeout should initially be None
296 self.assertEqual(socket.getdefaulttimeout(), None)
297 s = socket.socket()
298 self.assertEqual(s.gettimeout(), None)
299 s.close()
300
301 # Set the default timeout to 10, and see if it propagates
302 socket.setdefaulttimeout(10)
303 self.assertEqual(socket.getdefaulttimeout(), 10)
304 s = socket.socket()
305 self.assertEqual(s.gettimeout(), 10)
306 s.close()
307
308 # Reset the default timeout to None, and see if it propagates
309 socket.setdefaulttimeout(None)
310 self.assertEqual(socket.getdefaulttimeout(), None)
311 s = socket.socket()
312 self.assertEqual(s.gettimeout(), None)
313 s.close()
314
315 # Check that setting it to an invalid value raises ValueError
316 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
317
318 # Check that setting it to an invalid type raises TypeError
319 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
320
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000321 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000322
Guido van Rossum24e4af82002-06-12 19:18:08 +0000323 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000324 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000326 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000327 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000328 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000329
330 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000331 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332 # We know a socket should start without reuse==0
333 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
334 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000335 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000336
337 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000338 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000339 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
340 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
341 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000342 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000343
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000344 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000345 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000346 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
347 sock.settimeout(1)
348 sock.close()
349 self.assertRaises(socket.error, sock.send, "spam")
350
Guido van Rossum24e4af82002-06-12 19:18:08 +0000351class BasicTCPTest(SocketConnectedTest):
352
353 def __init__(self, methodName='runTest'):
354 SocketConnectedTest.__init__(self, methodName=methodName)
355
356 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000357 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000359 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000360
361 def _testRecv(self):
362 self.serv_conn.send(MSG)
363
364 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000365 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000366 seg1 = self.cli_conn.recv(len(MSG) - 3)
367 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000368 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000369 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000370
371 def _testOverFlowRecv(self):
372 self.serv_conn.send(MSG)
373
374 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000375 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000377 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378
379 def _testRecvFrom(self):
380 self.serv_conn.send(MSG)
381
382 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000383 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
385 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000386 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000387 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000388
389 def _testOverFlowRecvFrom(self):
390 self.serv_conn.send(MSG)
391
392 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000393 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000394 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000395 while 1:
396 read = self.cli_conn.recv(1024)
397 if not read:
398 break
Guido van Rossume531e292002-08-08 20:28:34 +0000399 msg += read
400 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000401
402 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000403 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000404 self.serv_conn.sendall(big_chunk)
405
406 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000407 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000408 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000409 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000410 fd = self.cli_conn.fileno()
411 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
412 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000413 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000414
415 def _testFromFd(self):
416 self.serv_conn.send(MSG)
417
418 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000419 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000420 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000421 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000422
423 def _testShutdown(self):
424 self.serv_conn.send(MSG)
425 self.serv_conn.shutdown(2)
426
427class BasicUDPTest(ThreadedUDPSocketTest):
428
429 def __init__(self, methodName='runTest'):
430 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
431
432 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000433 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000434 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000435 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000436
437 def _testSendtoAndRecv(self):
438 self.cli.sendto(MSG, 0, (HOST, PORT))
439
Guido van Rossum1c938012002-06-12 21:17:20 +0000440 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000441 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000442 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000443 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000444
Guido van Rossum1c938012002-06-12 21:17:20 +0000445 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000446 self.cli.sendto(MSG, 0, (HOST, PORT))
447
448class NonBlockingTCPTests(ThreadedTCPSocketTest):
449
450 def __init__(self, methodName='runTest'):
451 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
452
453 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000454 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000455 self.serv.setblocking(0)
456 start = time.time()
457 try:
458 self.serv.accept()
459 except socket.error:
460 pass
461 end = time.time()
462 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
463
464 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000465 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000466
Guido van Rossum24e4af82002-06-12 19:18:08 +0000467 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000468 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000469 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000470 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000471 conn, addr = self.serv.accept()
472 except socket.error:
473 pass
474 else:
475 self.fail("Error trying to do non-blocking accept.")
476 read, write, err = select.select([self.serv], [], [])
477 if self.serv in read:
478 conn, addr = self.serv.accept()
479 else:
480 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000481
Guido van Rossum24e4af82002-06-12 19:18:08 +0000482 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000483 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000484 self.cli.connect((HOST, PORT))
485
486 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000487 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488 conn, addr = self.serv.accept()
489
490 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000491 self.cli.settimeout(10)
492 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000493
494 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000495 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496 conn, addr = self.serv.accept()
497 conn.setblocking(0)
498 try:
499 msg = conn.recv(len(MSG))
500 except socket.error:
501 pass
502 else:
503 self.fail("Error trying to do non-blocking recv.")
504 read, write, err = select.select([conn], [], [])
505 if conn in read:
506 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000507 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000508 else:
509 self.fail("Error during select call to non-blocking socket.")
510
511 def _testRecv(self):
512 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000513 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000514 self.cli.send(MSG)
515
516class FileObjectClassTestCase(SocketConnectedTest):
517
Guido van Rossume9f66142002-08-07 15:46:19 +0000518 bufsize = -1 # Use default buffer size
519
Guido van Rossum24e4af82002-06-12 19:18:08 +0000520 def __init__(self, methodName='runTest'):
521 SocketConnectedTest.__init__(self, methodName=methodName)
522
523 def setUp(self):
524 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000525 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526
527 def tearDown(self):
528 self.serv_file.close()
529 self.serv_file = None
530 SocketConnectedTest.tearDown(self)
531
532 def clientSetUp(self):
533 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000534 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535
536 def clientTearDown(self):
537 self.cli_file.close()
538 self.cli_file = None
539 SocketConnectedTest.clientTearDown(self)
540
541 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000542 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000543 first_seg = self.serv_file.read(len(MSG)-3)
544 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000545 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000546 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000547
548 def _testSmallRead(self):
549 self.cli_file.write(MSG)
550 self.cli_file.flush()
551
Guido van Rossum8c943832002-08-08 01:00:28 +0000552 def testFullRead(self):
553 # read until EOF
554 msg = self.serv_file.read()
555 self.assertEqual(msg, MSG)
556
557 def _testFullRead(self):
558 self.cli_file.write(MSG)
559 self.cli_file.close()
560
Guido van Rossum24e4af82002-06-12 19:18:08 +0000561 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000562 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563 buf = ''
564 while 1:
565 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000566 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000567 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000568 buf += char
569 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000570
571 def _testUnbufferedRead(self):
572 self.cli_file.write(MSG)
573 self.cli_file.flush()
574
575 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000576 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000577 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000578 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000579
580 def _testReadline(self):
581 self.cli_file.write(MSG)
582 self.cli_file.flush()
583
Guido van Rossume9f66142002-08-07 15:46:19 +0000584class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
585
586 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000587
Guido van Rossume9f66142002-08-07 15:46:19 +0000588 In this case (and in this case only), it should be possible to
589 create a file object, read a line from it, create another file
590 object, read another line from it, without loss of data in the
591 first file object's buffer. Note that httplib relies on this
592 when reading multiple requests from the same socket."""
593
594 bufsize = 0 # Use unbuffered mode
595
596 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000597 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000598 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000599 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000600 self.serv_file = self.cli_conn.makefile('rb', 0)
601 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000602 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000603
604 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000605 self.cli_file.write("A. " + MSG)
606 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000607 self.cli_file.flush()
608
Guido van Rossum8c943832002-08-08 01:00:28 +0000609class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
610
611 bufsize = 1 # Default-buffered for reading; line-buffered for writing
612
613
614class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
615
616 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000617
Guido van Rossumb995eb72002-07-31 16:08:40 +0000618def test_main():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619 suite = unittest.TestSuite()
Guido van Rossum29bf9152002-08-07 16:03:06 +0000620 suite.addTest(unittest.makeSuite(GeneralModuleTests))
621 suite.addTest(unittest.makeSuite(BasicTCPTest))
Jack Jansen522e7692002-09-06 21:57:50 +0000622 if sys.platform != 'mac':
623 suite.addTest(unittest.makeSuite(BasicUDPTest))
Guido van Rossum29bf9152002-08-07 16:03:06 +0000624 suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000625 suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
Guido van Rossume9f66142002-08-07 15:46:19 +0000626 suite.addTest(unittest.makeSuite(UnbufferedFileObjectClassTestCase))
Guido van Rossum8c943832002-08-08 01:00:28 +0000627 suite.addTest(unittest.makeSuite(LineBufferedFileObjectClassTestCase))
628 suite.addTest(unittest.makeSuite(SmallBufferedFileObjectClassTestCase))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000629 test_support.run_suite(suite)
630
631if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000632 test_main()