blob: b9650e76631b492493818222f15ea1641389da9c [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):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000322 if not hasattr(socket, 'inet_pton'):
323 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000324 from socket import inet_aton as f, inet_pton, AF_INET
325 g = lambda a: inet_pton(AF_INET, a)
326
327 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
328 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
329 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
330 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
331
332 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
333 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
334 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
335
336 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000337 if not hasattr(socket, 'inet_pton'):
338 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000339 try:
340 from socket import inet_pton, AF_INET6, has_ipv6
341 if not has_ipv6:
342 return
343 except ImportError:
344 return
345 f = lambda a: inet_pton(AF_INET6, a)
346
347 self.assertEquals('\x00' * 16, f('::'))
348 self.assertEquals('\x00' * 16, f('0::0'))
349 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
350 self.assertEquals(
351 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
352 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
353 )
354
355 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000356 if not hasattr(socket, 'inet_ntop'):
357 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000358 from socket import inet_ntoa as f, inet_ntop, AF_INET
359 g = lambda a: inet_ntop(AF_INET, a)
360
361 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
362 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
363 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
364 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
365
366 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
367 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
368 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
369
370 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000371 if not hasattr(socket, 'inet_ntop'):
372 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000373 try:
374 from socket import inet_ntop, AF_INET6, has_ipv6
375 if not has_ipv6:
376 return
377 except ImportError:
378 return
379 f = lambda a: inet_ntop(AF_INET6, a)
380
381 self.assertEquals('::', f('\x00' * 16))
382 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
383 self.assertEquals(
384 'aef:b01:506:1001:ffff:9997:55:170',
385 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
386 )
387
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000388 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000389
Guido van Rossum24e4af82002-06-12 19:18:08 +0000390 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000391 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000392 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000393 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000394 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000395 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000396
397 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000398 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000399 # We know a socket should start without reuse==0
400 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
401 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000402 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000403
404 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000405 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000406 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
407 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
408 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000409 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000410
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000411 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000412 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000413 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
414 sock.settimeout(1)
415 sock.close()
416 self.assertRaises(socket.error, sock.send, "spam")
417
Guido van Rossum24e4af82002-06-12 19:18:08 +0000418class BasicTCPTest(SocketConnectedTest):
419
420 def __init__(self, methodName='runTest'):
421 SocketConnectedTest.__init__(self, methodName=methodName)
422
423 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000424 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000425 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000426 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000427
428 def _testRecv(self):
429 self.serv_conn.send(MSG)
430
431 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000432 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000433 seg1 = self.cli_conn.recv(len(MSG) - 3)
434 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000435 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000436 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000437
438 def _testOverFlowRecv(self):
439 self.serv_conn.send(MSG)
440
441 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000442 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000443 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000444 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000445
446 def _testRecvFrom(self):
447 self.serv_conn.send(MSG)
448
449 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000450 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000451 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
452 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000453 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000454 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000455
456 def _testOverFlowRecvFrom(self):
457 self.serv_conn.send(MSG)
458
459 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000460 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000461 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000462 while 1:
463 read = self.cli_conn.recv(1024)
464 if not read:
465 break
Guido van Rossume531e292002-08-08 20:28:34 +0000466 msg += read
467 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000468
469 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000470 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000471 self.serv_conn.sendall(big_chunk)
472
473 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000474 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000475 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000476 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000477 fd = self.cli_conn.fileno()
478 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
479 msg = sock.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 _testFromFd(self):
483 self.serv_conn.send(MSG)
484
485 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000486 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000487 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000488 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000489
490 def _testShutdown(self):
491 self.serv_conn.send(MSG)
492 self.serv_conn.shutdown(2)
493
494class BasicUDPTest(ThreadedUDPSocketTest):
495
496 def __init__(self, methodName='runTest'):
497 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
498
499 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000500 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000501 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000502 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000503
504 def _testSendtoAndRecv(self):
505 self.cli.sendto(MSG, 0, (HOST, PORT))
506
Guido van Rossum1c938012002-06-12 21:17:20 +0000507 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000508 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000509 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000510 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000511
Guido van Rossum1c938012002-06-12 21:17:20 +0000512 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513 self.cli.sendto(MSG, 0, (HOST, PORT))
514
515class NonBlockingTCPTests(ThreadedTCPSocketTest):
516
517 def __init__(self, methodName='runTest'):
518 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
519
520 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000521 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522 self.serv.setblocking(0)
523 start = time.time()
524 try:
525 self.serv.accept()
526 except socket.error:
527 pass
528 end = time.time()
529 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
530
531 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000532 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000533
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000535 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000536 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000537 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538 conn, addr = self.serv.accept()
539 except socket.error:
540 pass
541 else:
542 self.fail("Error trying to do non-blocking accept.")
543 read, write, err = select.select([self.serv], [], [])
544 if self.serv in read:
545 conn, addr = self.serv.accept()
546 else:
547 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000548
Guido van Rossum24e4af82002-06-12 19:18:08 +0000549 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000550 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000551 self.cli.connect((HOST, PORT))
552
553 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000554 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000555 conn, addr = self.serv.accept()
556
557 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000558 self.cli.settimeout(10)
559 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560
561 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000562 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563 conn, addr = self.serv.accept()
564 conn.setblocking(0)
565 try:
566 msg = conn.recv(len(MSG))
567 except socket.error:
568 pass
569 else:
570 self.fail("Error trying to do non-blocking recv.")
571 read, write, err = select.select([conn], [], [])
572 if conn in read:
573 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000574 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575 else:
576 self.fail("Error during select call to non-blocking socket.")
577
578 def _testRecv(self):
579 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000580 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000581 self.cli.send(MSG)
582
583class FileObjectClassTestCase(SocketConnectedTest):
584
Guido van Rossume9f66142002-08-07 15:46:19 +0000585 bufsize = -1 # Use default buffer size
586
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587 def __init__(self, methodName='runTest'):
588 SocketConnectedTest.__init__(self, methodName=methodName)
589
590 def setUp(self):
591 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000592 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000593
594 def tearDown(self):
595 self.serv_file.close()
596 self.serv_file = None
597 SocketConnectedTest.tearDown(self)
598
599 def clientSetUp(self):
600 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000601 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000602
603 def clientTearDown(self):
604 self.cli_file.close()
605 self.cli_file = None
606 SocketConnectedTest.clientTearDown(self)
607
608 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000609 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000610 first_seg = self.serv_file.read(len(MSG)-3)
611 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000612 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000613 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614
615 def _testSmallRead(self):
616 self.cli_file.write(MSG)
617 self.cli_file.flush()
618
Guido van Rossum8c943832002-08-08 01:00:28 +0000619 def testFullRead(self):
620 # read until EOF
621 msg = self.serv_file.read()
622 self.assertEqual(msg, MSG)
623
624 def _testFullRead(self):
625 self.cli_file.write(MSG)
626 self.cli_file.close()
627
Guido van Rossum24e4af82002-06-12 19:18:08 +0000628 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000629 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000630 buf = ''
631 while 1:
632 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000633 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000634 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000635 buf += char
636 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000637
638 def _testUnbufferedRead(self):
639 self.cli_file.write(MSG)
640 self.cli_file.flush()
641
642 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000643 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000644 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000645 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000646
647 def _testReadline(self):
648 self.cli_file.write(MSG)
649 self.cli_file.flush()
650
Guido van Rossume9f66142002-08-07 15:46:19 +0000651class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
652
653 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000654
Guido van Rossume9f66142002-08-07 15:46:19 +0000655 In this case (and in this case only), it should be possible to
656 create a file object, read a line from it, create another file
657 object, read another line from it, without loss of data in the
658 first file object's buffer. Note that httplib relies on this
659 when reading multiple requests from the same socket."""
660
661 bufsize = 0 # Use unbuffered mode
662
663 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000664 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000665 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000666 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000667 self.serv_file = self.cli_conn.makefile('rb', 0)
668 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000669 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000670
671 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000672 self.cli_file.write("A. " + MSG)
673 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000674 self.cli_file.flush()
675
Guido van Rossum8c943832002-08-08 01:00:28 +0000676class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
677
678 bufsize = 1 # Default-buffered for reading; line-buffered for writing
679
680
681class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
682
683 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000684
Guido van Rossumb995eb72002-07-31 16:08:40 +0000685def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000686 tests = [ GeneralModuleTests, BasicTCPTest ]
Jack Jansen522e7692002-09-06 21:57:50 +0000687 if sys.platform != 'mac':
Walter Dörwald21d3a322003-05-01 17:45:56 +0000688 tests.append(BasicUDPTest)
689
690 tests.extend([
691 NonBlockingTCPTests,
692 FileObjectClassTestCase,
693 UnbufferedFileObjectClassTestCase,
694 LineBufferedFileObjectClassTestCase,
695 SmallBufferedFileObjectClassTestCase
696 ])
697 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000698
699if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000700 test_main()