blob: a2b8489434099d2fa81a57e0dff92658c4d0f2ea [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
Skip Montanarof4433302002-08-02 15:52:30 +0000276 for proto in ("telnet", "ssh", "www", "ftp"):
277 try:
278 socket.getservbyname(proto, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000279 break
280 except socket.error:
281 pass
282 try:
283 socket.getservbyname(proto, 'udp')
Skip Montanarof4433302002-08-02 15:52:30 +0000284 break
285 except socket.error:
286 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000287 else:
288 raise socket.error
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000290 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000291 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000292 # The default timeout should initially be None
293 self.assertEqual(socket.getdefaulttimeout(), None)
294 s = socket.socket()
295 self.assertEqual(s.gettimeout(), None)
296 s.close()
297
298 # Set the default timeout to 10, and see if it propagates
299 socket.setdefaulttimeout(10)
300 self.assertEqual(socket.getdefaulttimeout(), 10)
301 s = socket.socket()
302 self.assertEqual(s.gettimeout(), 10)
303 s.close()
304
305 # Reset the default timeout to None, and see if it propagates
306 socket.setdefaulttimeout(None)
307 self.assertEqual(socket.getdefaulttimeout(), None)
308 s = socket.socket()
309 self.assertEqual(s.gettimeout(), None)
310 s.close()
311
312 # Check that setting it to an invalid value raises ValueError
313 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
314
315 # Check that setting it to an invalid type raises TypeError
316 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
317
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000318 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000319 if not hasattr(socket, 'inet_pton'):
320 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000321 from socket import inet_aton as f, inet_pton, AF_INET
322 g = lambda a: inet_pton(AF_INET, a)
323
324 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
325 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
326 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
327 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
328
329 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
330 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
331 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000332
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000333 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000334 if not hasattr(socket, 'inet_pton'):
335 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000336 try:
337 from socket import inet_pton, AF_INET6, has_ipv6
338 if not has_ipv6:
339 return
340 except ImportError:
341 return
342 f = lambda a: inet_pton(AF_INET6, a)
343
344 self.assertEquals('\x00' * 16, f('::'))
345 self.assertEquals('\x00' * 16, f('0::0'))
346 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
347 self.assertEquals(
348 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
349 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
350 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000351
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000352 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000353 if not hasattr(socket, 'inet_ntop'):
354 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000355 from socket import inet_ntoa as f, inet_ntop, AF_INET
356 g = lambda a: inet_ntop(AF_INET, a)
357
358 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
359 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
360 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
361 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000362
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000363 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
364 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
365 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
366
367 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000368 if not hasattr(socket, 'inet_ntop'):
369 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000370 try:
371 from socket import inet_ntop, AF_INET6, has_ipv6
372 if not has_ipv6:
373 return
374 except ImportError:
375 return
376 f = lambda a: inet_ntop(AF_INET6, a)
377
378 self.assertEquals('::', f('\x00' * 16))
379 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
380 self.assertEquals(
381 'aef:b01:506:1001:ffff:9997:55:170',
382 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
383 )
384
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000385 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000386
Guido van Rossum24e4af82002-06-12 19:18:08 +0000387 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000388 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000389 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000390 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000391 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000392 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000393
394 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000395 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000396 # We know a socket should start without reuse==0
397 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
398 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000399 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000400
401 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000402 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000403 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
404 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
405 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000406 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000407
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000408 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000409 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000410 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
411 sock.settimeout(1)
412 sock.close()
413 self.assertRaises(socket.error, sock.send, "spam")
414
Guido van Rossum24e4af82002-06-12 19:18:08 +0000415class BasicTCPTest(SocketConnectedTest):
416
417 def __init__(self, methodName='runTest'):
418 SocketConnectedTest.__init__(self, methodName=methodName)
419
420 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000421 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000422 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000423 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000424
425 def _testRecv(self):
426 self.serv_conn.send(MSG)
427
428 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000429 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000430 seg1 = self.cli_conn.recv(len(MSG) - 3)
431 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000432 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000433 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000434
435 def _testOverFlowRecv(self):
436 self.serv_conn.send(MSG)
437
438 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000439 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000440 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000441 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000442
443 def _testRecvFrom(self):
444 self.serv_conn.send(MSG)
445
446 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000447 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000448 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
449 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000450 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000451 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000452
453 def _testOverFlowRecvFrom(self):
454 self.serv_conn.send(MSG)
455
456 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000457 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000458 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000459 while 1:
460 read = self.cli_conn.recv(1024)
461 if not read:
462 break
Guido van Rossume531e292002-08-08 20:28:34 +0000463 msg += read
464 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465
466 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000467 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000468 self.serv_conn.sendall(big_chunk)
469
470 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000471 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000472 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000473 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000474 fd = self.cli_conn.fileno()
475 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
476 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000477 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000478
479 def _testFromFd(self):
480 self.serv_conn.send(MSG)
481
482 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000483 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000484 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000485 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000486
487 def _testShutdown(self):
488 self.serv_conn.send(MSG)
489 self.serv_conn.shutdown(2)
490
491class BasicUDPTest(ThreadedUDPSocketTest):
492
493 def __init__(self, methodName='runTest'):
494 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
495
496 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000497 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000498 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000499 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500
501 def _testSendtoAndRecv(self):
502 self.cli.sendto(MSG, 0, (HOST, PORT))
503
Guido van Rossum1c938012002-06-12 21:17:20 +0000504 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000505 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000506 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000507 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000508
Guido van Rossum1c938012002-06-12 21:17:20 +0000509 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510 self.cli.sendto(MSG, 0, (HOST, PORT))
511
512class NonBlockingTCPTests(ThreadedTCPSocketTest):
513
514 def __init__(self, methodName='runTest'):
515 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
516
517 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000518 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519 self.serv.setblocking(0)
520 start = time.time()
521 try:
522 self.serv.accept()
523 except socket.error:
524 pass
525 end = time.time()
526 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
527
528 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000529 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000530
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000532 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000534 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535 conn, addr = self.serv.accept()
536 except socket.error:
537 pass
538 else:
539 self.fail("Error trying to do non-blocking accept.")
540 read, write, err = select.select([self.serv], [], [])
541 if self.serv in read:
542 conn, addr = self.serv.accept()
543 else:
544 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000545
Guido van Rossum24e4af82002-06-12 19:18:08 +0000546 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000547 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000548 self.cli.connect((HOST, PORT))
549
550 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000551 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552 conn, addr = self.serv.accept()
553
554 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000555 self.cli.settimeout(10)
556 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557
558 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000559 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 conn, addr = self.serv.accept()
561 conn.setblocking(0)
562 try:
563 msg = conn.recv(len(MSG))
564 except socket.error:
565 pass
566 else:
567 self.fail("Error trying to do non-blocking recv.")
568 read, write, err = select.select([conn], [], [])
569 if conn in read:
570 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000571 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572 else:
573 self.fail("Error during select call to non-blocking socket.")
574
575 def _testRecv(self):
576 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000577 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 self.cli.send(MSG)
579
580class FileObjectClassTestCase(SocketConnectedTest):
581
Guido van Rossume9f66142002-08-07 15:46:19 +0000582 bufsize = -1 # Use default buffer size
583
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 def __init__(self, methodName='runTest'):
585 SocketConnectedTest.__init__(self, methodName=methodName)
586
587 def setUp(self):
588 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000589 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590
591 def tearDown(self):
592 self.serv_file.close()
593 self.serv_file = None
594 SocketConnectedTest.tearDown(self)
595
596 def clientSetUp(self):
597 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000598 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000599
600 def clientTearDown(self):
601 self.cli_file.close()
602 self.cli_file = None
603 SocketConnectedTest.clientTearDown(self)
604
605 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000606 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000607 first_seg = self.serv_file.read(len(MSG)-3)
608 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000609 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000610 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611
612 def _testSmallRead(self):
613 self.cli_file.write(MSG)
614 self.cli_file.flush()
615
Guido van Rossum8c943832002-08-08 01:00:28 +0000616 def testFullRead(self):
617 # read until EOF
618 msg = self.serv_file.read()
619 self.assertEqual(msg, MSG)
620
621 def _testFullRead(self):
622 self.cli_file.write(MSG)
623 self.cli_file.close()
624
Guido van Rossum24e4af82002-06-12 19:18:08 +0000625 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000626 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000627 buf = ''
628 while 1:
629 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000630 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000631 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000632 buf += char
633 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000634
635 def _testUnbufferedRead(self):
636 self.cli_file.write(MSG)
637 self.cli_file.flush()
638
639 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000640 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000642 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000643
644 def _testReadline(self):
645 self.cli_file.write(MSG)
646 self.cli_file.flush()
647
Guido van Rossume9f66142002-08-07 15:46:19 +0000648class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
649
650 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000651
Guido van Rossume9f66142002-08-07 15:46:19 +0000652 In this case (and in this case only), it should be possible to
653 create a file object, read a line from it, create another file
654 object, read another line from it, without loss of data in the
655 first file object's buffer. Note that httplib relies on this
656 when reading multiple requests from the same socket."""
657
658 bufsize = 0 # Use unbuffered mode
659
660 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000661 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000662 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000663 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000664 self.serv_file = self.cli_conn.makefile('rb', 0)
665 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000666 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000667
668 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000669 self.cli_file.write("A. " + MSG)
670 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000671 self.cli_file.flush()
672
Guido van Rossum8c943832002-08-08 01:00:28 +0000673class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
674
675 bufsize = 1 # Default-buffered for reading; line-buffered for writing
676
677
678class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
679
680 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000681
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000682class TCPTimeoutTest(SocketTCPTest):
683
684 def testTCPTimeout(self):
685 def raise_timeout(*args, **kwargs):
686 self.serv.settimeout(1.0)
687 self.serv.accept()
688 self.failUnlessRaises(socket.timeout, raise_timeout,
689 "Error generating a timeout exception (TCP)")
690
691 def testTimeoutZero(self):
692 ok = False
693 try:
694 self.serv.settimeout(0.0)
695 foo = self.serv.accept()
696 except socket.timeout:
697 self.fail("caught timeout instead of error (TCP)")
698 except socket.error:
699 ok = True
700 except:
701 self.fail("caught unexpected exception (TCP)")
702 if not ok:
703 self.fail("accept() returned success when we did not expect it")
704
705class UDPTimeoutTest(SocketTCPTest):
706
707 def testUDPTimeout(self):
708 def raise_timeout(*args, **kwargs):
709 self.serv.settimeout(1.0)
710 self.serv.recv(1024)
711 self.failUnlessRaises(socket.timeout, raise_timeout,
712 "Error generating a timeout exception (UDP)")
713
714 def testTimeoutZero(self):
715 ok = False
716 try:
717 self.serv.settimeout(0.0)
718 foo = self.serv.recv(1024)
719 except socket.timeout:
720 self.fail("caught timeout instead of error (UDP)")
721 except socket.error:
722 ok = True
723 except:
724 self.fail("caught unexpected exception (UDP)")
725 if not ok:
726 self.fail("recv() returned success when we did not expect it")
727
728class TestExceptions(unittest.TestCase):
729
730 def testExceptionTree(self):
731 self.assert_(issubclass(socket.error, Exception))
732 self.assert_(issubclass(socket.herror, socket.error))
733 self.assert_(issubclass(socket.gaierror, socket.error))
734 self.assert_(issubclass(socket.timeout, socket.error))
735
736
Guido van Rossumb995eb72002-07-31 16:08:40 +0000737def test_main():
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000738 tests = [GeneralModuleTests, BasicTCPTest, TCPTimeoutTest, TestExceptions]
Jack Jansen522e7692002-09-06 21:57:50 +0000739 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000740 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000741
742 tests.extend([
743 NonBlockingTCPTests,
744 FileObjectClassTestCase,
745 UnbufferedFileObjectClassTestCase,
746 LineBufferedFileObjectClassTestCase,
747 SmallBufferedFileObjectClassTestCase
748 ])
749 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750
751if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000752 test_main()