blob: 16a39896b0c41d5736c23522823458d864fbb451 [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 Rossum47dfa4a2003-04-25 05:48:32 +0000321 def testIPv4toString(self):
322 from socket import inet_aton as f, inet_pton, AF_INET
323 g = lambda a: inet_pton(AF_INET, a)
324
325 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
326 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
327 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
328 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
329
330 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
331 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
332 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
333
334 def testIPv6toString(self):
335 try:
336 from socket import inet_pton, AF_INET6, has_ipv6
337 if not has_ipv6:
338 return
339 except ImportError:
340 return
341 f = lambda a: inet_pton(AF_INET6, a)
342
343 self.assertEquals('\x00' * 16, f('::'))
344 self.assertEquals('\x00' * 16, f('0::0'))
345 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
346 self.assertEquals(
347 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
348 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
349 )
350
351 def testStringToIPv4(self):
352 from socket import inet_ntoa as f, inet_ntop, AF_INET
353 g = lambda a: inet_ntop(AF_INET, a)
354
355 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
356 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
357 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
358 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
359
360 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
361 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
362 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
363
364 def testStringToIPv6(self):
365 try:
366 from socket import inet_ntop, AF_INET6, has_ipv6
367 if not has_ipv6:
368 return
369 except ImportError:
370 return
371 f = lambda a: inet_ntop(AF_INET6, a)
372
373 self.assertEquals('::', f('\x00' * 16))
374 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
375 self.assertEquals(
376 'aef:b01:506:1001:ffff:9997:55:170',
377 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
378 )
379
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000380 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000381
Guido van Rossum24e4af82002-06-12 19:18:08 +0000382 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000383 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000385 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000386 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000387 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000388
389 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000390 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000391 # We know a socket should start without reuse==0
392 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
393 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000394 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000395
396 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000397 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000398 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
399 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
400 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000401 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000402
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000403 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000404 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000405 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
406 sock.settimeout(1)
407 sock.close()
408 self.assertRaises(socket.error, sock.send, "spam")
409
Guido van Rossum24e4af82002-06-12 19:18:08 +0000410class BasicTCPTest(SocketConnectedTest):
411
412 def __init__(self, methodName='runTest'):
413 SocketConnectedTest.__init__(self, methodName=methodName)
414
415 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000416 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000417 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000418 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000419
420 def _testRecv(self):
421 self.serv_conn.send(MSG)
422
423 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000424 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000425 seg1 = self.cli_conn.recv(len(MSG) - 3)
426 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000427 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000428 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000429
430 def _testOverFlowRecv(self):
431 self.serv_conn.send(MSG)
432
433 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000434 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000435 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000436 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000437
438 def _testRecvFrom(self):
439 self.serv_conn.send(MSG)
440
441 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000442 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000443 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
444 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000445 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000446 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000447
448 def _testOverFlowRecvFrom(self):
449 self.serv_conn.send(MSG)
450
451 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000452 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000453 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000454 while 1:
455 read = self.cli_conn.recv(1024)
456 if not read:
457 break
Guido van Rossume531e292002-08-08 20:28:34 +0000458 msg += read
459 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000460
461 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000462 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000463 self.serv_conn.sendall(big_chunk)
464
465 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000466 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000467 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000468 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000469 fd = self.cli_conn.fileno()
470 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
471 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000472 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000473
474 def _testFromFd(self):
475 self.serv_conn.send(MSG)
476
477 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000478 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000479 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000480 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000481
482 def _testShutdown(self):
483 self.serv_conn.send(MSG)
484 self.serv_conn.shutdown(2)
485
486class BasicUDPTest(ThreadedUDPSocketTest):
487
488 def __init__(self, methodName='runTest'):
489 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
490
491 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000492 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000493 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000494 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495
496 def _testSendtoAndRecv(self):
497 self.cli.sendto(MSG, 0, (HOST, PORT))
498
Guido van Rossum1c938012002-06-12 21:17:20 +0000499 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000500 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000501 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000502 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000503
Guido van Rossum1c938012002-06-12 21:17:20 +0000504 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000505 self.cli.sendto(MSG, 0, (HOST, PORT))
506
507class NonBlockingTCPTests(ThreadedTCPSocketTest):
508
509 def __init__(self, methodName='runTest'):
510 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
511
512 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000513 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000514 self.serv.setblocking(0)
515 start = time.time()
516 try:
517 self.serv.accept()
518 except socket.error:
519 pass
520 end = time.time()
521 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
522
523 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000524 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000525
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000527 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000528 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000529 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530 conn, addr = self.serv.accept()
531 except socket.error:
532 pass
533 else:
534 self.fail("Error trying to do non-blocking accept.")
535 read, write, err = select.select([self.serv], [], [])
536 if self.serv in read:
537 conn, addr = self.serv.accept()
538 else:
539 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000540
Guido van Rossum24e4af82002-06-12 19:18:08 +0000541 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000542 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000543 self.cli.connect((HOST, PORT))
544
545 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000546 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000547 conn, addr = self.serv.accept()
548
549 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000550 self.cli.settimeout(10)
551 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552
553 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000554 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000555 conn, addr = self.serv.accept()
556 conn.setblocking(0)
557 try:
558 msg = conn.recv(len(MSG))
559 except socket.error:
560 pass
561 else:
562 self.fail("Error trying to do non-blocking recv.")
563 read, write, err = select.select([conn], [], [])
564 if conn in read:
565 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000566 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000567 else:
568 self.fail("Error during select call to non-blocking socket.")
569
570 def _testRecv(self):
571 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000572 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573 self.cli.send(MSG)
574
575class FileObjectClassTestCase(SocketConnectedTest):
576
Guido van Rossume9f66142002-08-07 15:46:19 +0000577 bufsize = -1 # Use default buffer size
578
Guido van Rossum24e4af82002-06-12 19:18:08 +0000579 def __init__(self, methodName='runTest'):
580 SocketConnectedTest.__init__(self, methodName=methodName)
581
582 def setUp(self):
583 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000584 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000585
586 def tearDown(self):
587 self.serv_file.close()
588 self.serv_file = None
589 SocketConnectedTest.tearDown(self)
590
591 def clientSetUp(self):
592 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000593 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000594
595 def clientTearDown(self):
596 self.cli_file.close()
597 self.cli_file = None
598 SocketConnectedTest.clientTearDown(self)
599
600 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000601 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000602 first_seg = self.serv_file.read(len(MSG)-3)
603 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000604 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000605 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000606
607 def _testSmallRead(self):
608 self.cli_file.write(MSG)
609 self.cli_file.flush()
610
Guido van Rossum8c943832002-08-08 01:00:28 +0000611 def testFullRead(self):
612 # read until EOF
613 msg = self.serv_file.read()
614 self.assertEqual(msg, MSG)
615
616 def _testFullRead(self):
617 self.cli_file.write(MSG)
618 self.cli_file.close()
619
Guido van Rossum24e4af82002-06-12 19:18:08 +0000620 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000621 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622 buf = ''
623 while 1:
624 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000625 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000626 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000627 buf += char
628 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000629
630 def _testUnbufferedRead(self):
631 self.cli_file.write(MSG)
632 self.cli_file.flush()
633
634 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000635 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000636 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000637 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000638
639 def _testReadline(self):
640 self.cli_file.write(MSG)
641 self.cli_file.flush()
642
Guido van Rossume9f66142002-08-07 15:46:19 +0000643class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
644
645 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000646
Guido van Rossume9f66142002-08-07 15:46:19 +0000647 In this case (and in this case only), it should be possible to
648 create a file object, read a line from it, create another file
649 object, read another line from it, without loss of data in the
650 first file object's buffer. Note that httplib relies on this
651 when reading multiple requests from the same socket."""
652
653 bufsize = 0 # Use unbuffered mode
654
655 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000656 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000657 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000658 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000659 self.serv_file = self.cli_conn.makefile('rb', 0)
660 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000661 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000662
663 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000664 self.cli_file.write("A. " + MSG)
665 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000666 self.cli_file.flush()
667
Guido van Rossum8c943832002-08-08 01:00:28 +0000668class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
669
670 bufsize = 1 # Default-buffered for reading; line-buffered for writing
671
672
673class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
674
675 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000676
Guido van Rossumb995eb72002-07-31 16:08:40 +0000677def test_main():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000678 suite = unittest.TestSuite()
Guido van Rossum29bf9152002-08-07 16:03:06 +0000679 suite.addTest(unittest.makeSuite(GeneralModuleTests))
680 suite.addTest(unittest.makeSuite(BasicTCPTest))
Jack Jansen522e7692002-09-06 21:57:50 +0000681 if sys.platform != 'mac':
682 suite.addTest(unittest.makeSuite(BasicUDPTest))
Guido van Rossum29bf9152002-08-07 16:03:06 +0000683 suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684 suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
Guido van Rossume9f66142002-08-07 15:46:19 +0000685 suite.addTest(unittest.makeSuite(UnbufferedFileObjectClassTestCase))
Guido van Rossum8c943832002-08-08 01:00:28 +0000686 suite.addTest(unittest.makeSuite(LineBufferedFileObjectClassTestCase))
687 suite.addTest(unittest.makeSuite(SmallBufferedFileObjectClassTestCase))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000688 test_support.run_suite(suite)
689
690if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000691 test_main()