blob: 6e2f80c407bd7395d96ad0a3639d82b24326143a [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
Raymond Hettinger027bb632004-05-31 03:09:25 +000012from weakref import proxy
Barry Warsawcf3d4b51997-01-03 20:03:32 +000013
Guido van Rossum24e4af82002-06-12 19:18:08 +000014PORT = 50007
15HOST = 'localhost'
16MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Guido van Rossum24e4af82002-06-12 19:18:08 +000018class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000019
Guido van Rossum24e4af82002-06-12 19:18:08 +000020 def setUp(self):
21 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
22 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
23 self.serv.bind((HOST, PORT))
24 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Guido van Rossum24e4af82002-06-12 19:18:08 +000026 def tearDown(self):
27 self.serv.close()
28 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Guido van Rossum24e4af82002-06-12 19:18:08 +000030class SocketUDPTest(unittest.TestCase):
31
32 def setUp(self):
33 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
34 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
35 self.serv.bind((HOST, PORT))
36
37 def tearDown(self):
38 self.serv.close()
39 self.serv = None
40
41class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000042 """Threadable Test class
43
44 The ThreadableTest class makes it easy to create a threaded
45 client/server pair from an existing unit test. To create a
46 new threaded class from an existing unit test, use multiple
47 inheritance:
48
49 class NewClass (OldClass, ThreadableTest):
50 pass
51
52 This class defines two new fixture functions with obvious
53 purposes for overriding:
54
55 clientSetUp ()
56 clientTearDown ()
57
58 Any new test functions within the class must then define
59 tests in pairs, where the test name is preceeded with a
60 '_' to indicate the client portion of the test. Ex:
61
62 def testFoo(self):
63 # Server portion
64
65 def _testFoo(self):
66 # Client portion
67
68 Any exceptions raised by the clients during their tests
69 are caught and transferred to the main thread to alert
70 the testing framework.
71
72 Note, the server setup function cannot call any blocking
73 functions that rely on the client thread during setup,
74 unless serverExplicityReady() is called just before
75 the blocking call (such as in setting up a client/server
76 connection and performing the accept() in setUp().
77 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000078
79 def __init__(self):
80 # Swap the true setup function
81 self.__setUp = self.setUp
82 self.__tearDown = self.tearDown
83 self.setUp = self._setUp
84 self.tearDown = self._tearDown
85
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000086 def serverExplicitReady(self):
87 """This method allows the server to explicitly indicate that
88 it wants the client thread to proceed. This is useful if the
89 server is about to execute a blocking routine that is
90 dependent upon the client thread during its setup routine."""
91 self.server_ready.set()
92
Guido van Rossum24e4af82002-06-12 19:18:08 +000093 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000094 self.server_ready = threading.Event()
95 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000096 self.done = threading.Event()
97 self.queue = Queue.Queue(1)
98
99 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000100 methodname = self.id()
101 i = methodname.rfind('.')
102 methodname = methodname[i+1:]
103 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000104 self.client_thread = thread.start_new_thread(
105 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000106
107 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000108 if not self.server_ready.isSet():
109 self.server_ready.set()
110 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000111
112 def _tearDown(self):
113 self.__tearDown()
114 self.done.wait()
115
116 if not self.queue.empty():
117 msg = self.queue.get()
118 self.fail(msg)
119
120 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000121 self.server_ready.wait()
122 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123 self.clientSetUp()
124 if not callable(test_func):
125 raise TypeError, "test_func must be a callable function"
126 try:
127 test_func()
128 except Exception, strerror:
129 self.queue.put(strerror)
130 self.clientTearDown()
131
132 def clientSetUp(self):
133 raise NotImplementedError, "clientSetUp must be implemented."
134
135 def clientTearDown(self):
136 self.done.set()
137 thread.exit()
138
139class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
140
141 def __init__(self, methodName='runTest'):
142 SocketTCPTest.__init__(self, methodName=methodName)
143 ThreadableTest.__init__(self)
144
145 def clientSetUp(self):
146 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
147
148 def clientTearDown(self):
149 self.cli.close()
150 self.cli = None
151 ThreadableTest.clientTearDown(self)
152
153class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
154
155 def __init__(self, methodName='runTest'):
156 SocketUDPTest.__init__(self, methodName=methodName)
157 ThreadableTest.__init__(self)
158
159 def clientSetUp(self):
160 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
161
162class SocketConnectedTest(ThreadedTCPSocketTest):
163
164 def __init__(self, methodName='runTest'):
165 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
166
167 def setUp(self):
168 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000169 # Indicate explicitly we're ready for the client thread to
170 # proceed and then perform the blocking call to accept
171 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172 conn, addr = self.serv.accept()
173 self.cli_conn = conn
174
175 def tearDown(self):
176 self.cli_conn.close()
177 self.cli_conn = None
178 ThreadedTCPSocketTest.tearDown(self)
179
180 def clientSetUp(self):
181 ThreadedTCPSocketTest.clientSetUp(self)
182 self.cli.connect((HOST, PORT))
183 self.serv_conn = self.cli
184
185 def clientTearDown(self):
186 self.serv_conn.close()
187 self.serv_conn = None
188 ThreadedTCPSocketTest.clientTearDown(self)
189
190#######################################################################
191## Begin Tests
192
193class GeneralModuleTests(unittest.TestCase):
194
Raymond Hettinger027bb632004-05-31 03:09:25 +0000195 def test_weakref(self):
196 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
197 p = proxy(s)
198 self.assertEqual(p.fileno(), s.fileno())
199 s.close()
200 s = None
201 try:
202 p.fileno()
203 except ReferenceError:
204 pass
205 else:
206 self.fail('Socket proxy still exists')
207
Guido van Rossum24e4af82002-06-12 19:18:08 +0000208 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000209 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000210 def raise_error(*args, **kwargs):
211 raise socket.error
212 def raise_herror(*args, **kwargs):
213 raise socket.herror
214 def raise_gaierror(*args, **kwargs):
215 raise socket.gaierror
216 self.failUnlessRaises(socket.error, raise_error,
217 "Error raising socket exception.")
218 self.failUnlessRaises(socket.error, raise_herror,
219 "Error raising socket exception.")
220 self.failUnlessRaises(socket.error, raise_gaierror,
221 "Error raising socket exception.")
222
223 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000224 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000225 socket.AF_INET
226 socket.SOCK_STREAM
227 socket.SOCK_DGRAM
228 socket.SOCK_RAW
229 socket.SOCK_RDM
230 socket.SOCK_SEQPACKET
231 socket.SOL_SOCKET
232 socket.SO_REUSEADDR
233
Guido van Rossum654c11e2002-06-13 20:24:17 +0000234 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000235 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000236 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000237 try:
238 ip = socket.gethostbyname(hostname)
239 except socket.error:
240 # Probably name lookup wasn't set up right; skip this test
241 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000242 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000243 try:
244 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
245 except socket.error:
246 # Probably a similar problem as above; skip this test
247 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000248 all_host_names = [hname] + aliases
249 fqhn = socket.getfqdn()
250 if not fqhn in all_host_names:
251 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000252
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000253 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000254 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000255 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000256 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000257 try:
258 # On some versions, this loses a reference
259 orig = sys.getrefcount(__name__)
260 socket.getnameinfo(__name__,0)
261 except SystemError:
262 if sys.getrefcount(__name__) <> orig:
263 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000264
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000266 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267 try:
268 # On some versions, this crashes the interpreter.
269 socket.getnameinfo(('x', 0, 0, 0), 0)
270 except socket.error:
271 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000272
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000273 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000274 # This just checks that htons etc. are their own inverse,
275 # when looking at the lower 16 or 32 bits.
276 sizes = {socket.htonl: 32, socket.ntohl: 32,
277 socket.htons: 16, socket.ntohs: 16}
278 for func, size in sizes.items():
279 mask = (1L<<size) - 1
280 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
281 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000282
Guido van Rossuma2627af2002-09-14 00:58:46 +0000283 swapped = func(mask)
284 self.assertEqual(swapped & mask, mask)
285 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000286
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287 def testGetServByName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000288 # Testing getservbyname()
Skip Montanarof4433302002-08-02 15:52:30 +0000289 # try a few protocols - not everyone has telnet enabled
Skip Montanarof4433302002-08-02 15:52:30 +0000290 for proto in ("telnet", "ssh", "www", "ftp"):
291 try:
292 socket.getservbyname(proto, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000293 break
294 except socket.error:
295 pass
296 try:
297 socket.getservbyname(proto, 'udp')
Skip Montanarof4433302002-08-02 15:52:30 +0000298 break
299 except socket.error:
300 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000301 else:
302 raise socket.error
Guido van Rossum24e4af82002-06-12 19:18:08 +0000303
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000304 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000305 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000306 # The default timeout should initially be None
307 self.assertEqual(socket.getdefaulttimeout(), None)
308 s = socket.socket()
309 self.assertEqual(s.gettimeout(), None)
310 s.close()
311
312 # Set the default timeout to 10, and see if it propagates
313 socket.setdefaulttimeout(10)
314 self.assertEqual(socket.getdefaulttimeout(), 10)
315 s = socket.socket()
316 self.assertEqual(s.gettimeout(), 10)
317 s.close()
318
319 # Reset the default timeout to None, and see if it propagates
320 socket.setdefaulttimeout(None)
321 self.assertEqual(socket.getdefaulttimeout(), None)
322 s = socket.socket()
323 self.assertEqual(s.gettimeout(), None)
324 s.close()
325
326 # Check that setting it to an invalid value raises ValueError
327 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
328
329 # Check that setting it to an invalid type raises TypeError
330 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
331
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000332 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000333 if not hasattr(socket, 'inet_pton'):
334 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000335 from socket import inet_aton as f, inet_pton, AF_INET
336 g = lambda a: inet_pton(AF_INET, a)
337
338 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
339 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
340 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
341 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
342
343 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
344 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
345 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000346
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000347 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000348 if not hasattr(socket, 'inet_pton'):
349 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000350 try:
351 from socket import inet_pton, AF_INET6, has_ipv6
352 if not has_ipv6:
353 return
354 except ImportError:
355 return
356 f = lambda a: inet_pton(AF_INET6, a)
357
358 self.assertEquals('\x00' * 16, f('::'))
359 self.assertEquals('\x00' * 16, f('0::0'))
360 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
361 self.assertEquals(
362 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
363 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
364 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000365
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000366 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000367 if not hasattr(socket, 'inet_ntop'):
368 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000369 from socket import inet_ntoa as f, inet_ntop, AF_INET
370 g = lambda a: inet_ntop(AF_INET, a)
371
372 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
373 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
374 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
375 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000376
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000377 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
378 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
379 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
380
381 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000382 if not hasattr(socket, 'inet_ntop'):
383 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000384 try:
385 from socket import inet_ntop, AF_INET6, has_ipv6
386 if not has_ipv6:
387 return
388 except ImportError:
389 return
390 f = lambda a: inet_ntop(AF_INET6, a)
391
392 self.assertEquals('::', f('\x00' * 16))
393 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
394 self.assertEquals(
395 'aef:b01:506:1001:ffff:9997:55:170',
396 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
397 )
398
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000399 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000400
Guido van Rossum24e4af82002-06-12 19:18:08 +0000401 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000402 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000403 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000404 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000405 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000406 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000407
408 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000409 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000410 # We know a socket should start without reuse==0
411 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
412 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000413 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000414
415 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000416 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000417 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
418 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
419 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000420 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000421
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000422 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000423 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000424 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
425 sock.settimeout(1)
426 sock.close()
427 self.assertRaises(socket.error, sock.send, "spam")
428
Guido van Rossum24e4af82002-06-12 19:18:08 +0000429class BasicTCPTest(SocketConnectedTest):
430
431 def __init__(self, methodName='runTest'):
432 SocketConnectedTest.__init__(self, methodName=methodName)
433
434 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000435 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000436 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000437 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000438
439 def _testRecv(self):
440 self.serv_conn.send(MSG)
441
442 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000443 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000444 seg1 = self.cli_conn.recv(len(MSG) - 3)
445 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000446 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000447 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000448
449 def _testOverFlowRecv(self):
450 self.serv_conn.send(MSG)
451
452 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000453 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000454 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000455 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000456
457 def _testRecvFrom(self):
458 self.serv_conn.send(MSG)
459
460 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000461 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000462 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
463 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000464 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000465 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000466
467 def _testOverFlowRecvFrom(self):
468 self.serv_conn.send(MSG)
469
470 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000471 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000472 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000473 while 1:
474 read = self.cli_conn.recv(1024)
475 if not read:
476 break
Guido van Rossume531e292002-08-08 20:28:34 +0000477 msg += read
478 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000479
480 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000481 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000482 self.serv_conn.sendall(big_chunk)
483
484 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000485 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000486 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000487 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488 fd = self.cli_conn.fileno()
489 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
490 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000491 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000492
493 def _testFromFd(self):
494 self.serv_conn.send(MSG)
495
496 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000497 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000498 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000499 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500
501 def _testShutdown(self):
502 self.serv_conn.send(MSG)
503 self.serv_conn.shutdown(2)
504
505class BasicUDPTest(ThreadedUDPSocketTest):
506
507 def __init__(self, methodName='runTest'):
508 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
509
510 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000511 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000513 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000514
515 def _testSendtoAndRecv(self):
516 self.cli.sendto(MSG, 0, (HOST, PORT))
517
Guido van Rossum1c938012002-06-12 21:17:20 +0000518 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000519 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000520 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000521 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522
Guido van Rossum1c938012002-06-12 21:17:20 +0000523 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000524 self.cli.sendto(MSG, 0, (HOST, PORT))
525
526class NonBlockingTCPTests(ThreadedTCPSocketTest):
527
528 def __init__(self, methodName='runTest'):
529 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
530
531 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000532 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533 self.serv.setblocking(0)
534 start = time.time()
535 try:
536 self.serv.accept()
537 except socket.error:
538 pass
539 end = time.time()
540 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
541
542 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000543 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000544
Guido van Rossum24e4af82002-06-12 19:18:08 +0000545 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000546 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000547 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000548 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000549 conn, addr = self.serv.accept()
550 except socket.error:
551 pass
552 else:
553 self.fail("Error trying to do non-blocking accept.")
554 read, write, err = select.select([self.serv], [], [])
555 if self.serv in read:
556 conn, addr = self.serv.accept()
557 else:
558 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000559
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000561 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562 self.cli.connect((HOST, PORT))
563
564 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000565 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000566 conn, addr = self.serv.accept()
567
568 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000569 self.cli.settimeout(10)
570 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571
572 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000573 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000574 conn, addr = self.serv.accept()
575 conn.setblocking(0)
576 try:
577 msg = conn.recv(len(MSG))
578 except socket.error:
579 pass
580 else:
581 self.fail("Error trying to do non-blocking recv.")
582 read, write, err = select.select([conn], [], [])
583 if conn in read:
584 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000585 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000586 else:
587 self.fail("Error during select call to non-blocking socket.")
588
589 def _testRecv(self):
590 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000591 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000592 self.cli.send(MSG)
593
594class FileObjectClassTestCase(SocketConnectedTest):
595
Guido van Rossume9f66142002-08-07 15:46:19 +0000596 bufsize = -1 # Use default buffer size
597
Guido van Rossum24e4af82002-06-12 19:18:08 +0000598 def __init__(self, methodName='runTest'):
599 SocketConnectedTest.__init__(self, methodName=methodName)
600
601 def setUp(self):
602 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000603 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604
605 def tearDown(self):
606 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000607 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000608 self.serv_file = None
609 SocketConnectedTest.tearDown(self)
610
611 def clientSetUp(self):
612 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000613 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614
615 def clientTearDown(self):
616 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000617 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000618 self.cli_file = None
619 SocketConnectedTest.clientTearDown(self)
620
621 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000622 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000623 first_seg = self.serv_file.read(len(MSG)-3)
624 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000625 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000626 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000627
628 def _testSmallRead(self):
629 self.cli_file.write(MSG)
630 self.cli_file.flush()
631
Guido van Rossum8c943832002-08-08 01:00:28 +0000632 def testFullRead(self):
633 # read until EOF
634 msg = self.serv_file.read()
635 self.assertEqual(msg, MSG)
636
637 def _testFullRead(self):
638 self.cli_file.write(MSG)
639 self.cli_file.close()
640
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000642 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000643 buf = ''
644 while 1:
645 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000646 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000647 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000648 buf += char
649 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650
651 def _testUnbufferedRead(self):
652 self.cli_file.write(MSG)
653 self.cli_file.flush()
654
655 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000656 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000657 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000658 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659
660 def _testReadline(self):
661 self.cli_file.write(MSG)
662 self.cli_file.flush()
663
Tim Peters116d83c2004-03-28 02:20:45 +0000664 def testClosedAttr(self):
665 self.assert_(not self.serv_file.closed)
666
667 def _testClosedAttr(self):
668 self.assert_(not self.cli_file.closed)
669
Guido van Rossume9f66142002-08-07 15:46:19 +0000670class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
671
672 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000673
Guido van Rossume9f66142002-08-07 15:46:19 +0000674 In this case (and in this case only), it should be possible to
675 create a file object, read a line from it, create another file
676 object, read another line from it, without loss of data in the
677 first file object's buffer. Note that httplib relies on this
678 when reading multiple requests from the same socket."""
679
680 bufsize = 0 # Use unbuffered mode
681
682 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000683 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000684 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000685 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000686 self.serv_file = self.cli_conn.makefile('rb', 0)
687 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000688 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000689
690 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000691 self.cli_file.write("A. " + MSG)
692 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000693 self.cli_file.flush()
694
Guido van Rossum8c943832002-08-08 01:00:28 +0000695class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
696
697 bufsize = 1 # Default-buffered for reading; line-buffered for writing
698
699
700class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
701
702 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000703
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000704class TCPTimeoutTest(SocketTCPTest):
705
706 def testTCPTimeout(self):
707 def raise_timeout(*args, **kwargs):
708 self.serv.settimeout(1.0)
709 self.serv.accept()
710 self.failUnlessRaises(socket.timeout, raise_timeout,
711 "Error generating a timeout exception (TCP)")
712
713 def testTimeoutZero(self):
714 ok = False
715 try:
716 self.serv.settimeout(0.0)
717 foo = self.serv.accept()
718 except socket.timeout:
719 self.fail("caught timeout instead of error (TCP)")
720 except socket.error:
721 ok = True
722 except:
723 self.fail("caught unexpected exception (TCP)")
724 if not ok:
725 self.fail("accept() returned success when we did not expect it")
726
727class UDPTimeoutTest(SocketTCPTest):
728
729 def testUDPTimeout(self):
730 def raise_timeout(*args, **kwargs):
731 self.serv.settimeout(1.0)
732 self.serv.recv(1024)
733 self.failUnlessRaises(socket.timeout, raise_timeout,
734 "Error generating a timeout exception (UDP)")
735
736 def testTimeoutZero(self):
737 ok = False
738 try:
739 self.serv.settimeout(0.0)
740 foo = self.serv.recv(1024)
741 except socket.timeout:
742 self.fail("caught timeout instead of error (UDP)")
743 except socket.error:
744 ok = True
745 except:
746 self.fail("caught unexpected exception (UDP)")
747 if not ok:
748 self.fail("recv() returned success when we did not expect it")
749
750class TestExceptions(unittest.TestCase):
751
752 def testExceptionTree(self):
753 self.assert_(issubclass(socket.error, Exception))
754 self.assert_(issubclass(socket.herror, socket.error))
755 self.assert_(issubclass(socket.gaierror, socket.error))
756 self.assert_(issubclass(socket.timeout, socket.error))
757
758
Guido van Rossumb995eb72002-07-31 16:08:40 +0000759def test_main():
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000760 tests = [GeneralModuleTests, BasicTCPTest, TCPTimeoutTest, TestExceptions]
Jack Jansen522e7692002-09-06 21:57:50 +0000761 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000762 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000763
764 tests.extend([
765 NonBlockingTCPTests,
766 FileObjectClassTestCase,
767 UnbufferedFileObjectClassTestCase,
768 LineBufferedFileObjectClassTestCase,
769 SmallBufferedFileObjectClassTestCase
770 ])
771 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000772
773if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000774 test_main()