blob: adeca569e46fb21b75a7000c8173e44d39cb27d8 [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
Barry Warsaw11b91a02004-06-28 00:50:43 +0000287 def testGetServBy(self):
288 eq = self.assertEqual
289 # Find one service that exists, then check all the related interfaces.
290 # I've ordered this by protocols that have both a tcp and udp
291 # protocol, at least for modern Linuxes.
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000292 if sys.platform in ('freebsd4', 'freebsd5'):
293 # avoid the 'echo' service on this platform, as there is an
294 # assumption breaking non-standard port/protocol entry
295 services = ('daytime', 'qotd', 'domain')
296 else:
297 services = ('echo', 'daytime', 'domain')
298 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000299 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000300 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000301 break
302 except socket.error:
303 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000304 else:
305 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000306 # Try same call with optional protocol omitted
307 port2 = socket.getservbyname(service)
308 eq(port, port2)
309 # Try udp, but don't barf it it doesn't exist
310 try:
311 udpport = socket.getservbyname(service, 'udp')
312 except socket.error:
313 udpport = None
314 else:
315 eq(udpport, port)
316 # Now make sure the lookup by port returns the same service name
317 eq(socket.getservbyport(port2), service)
318 eq(socket.getservbyport(port, 'tcp'), service)
319 if udpport is not None:
320 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000321
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000322 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000323 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000324 # The default timeout should initially be None
325 self.assertEqual(socket.getdefaulttimeout(), None)
326 s = socket.socket()
327 self.assertEqual(s.gettimeout(), None)
328 s.close()
329
330 # Set the default timeout to 10, and see if it propagates
331 socket.setdefaulttimeout(10)
332 self.assertEqual(socket.getdefaulttimeout(), 10)
333 s = socket.socket()
334 self.assertEqual(s.gettimeout(), 10)
335 s.close()
336
337 # Reset the default timeout to None, and see if it propagates
338 socket.setdefaulttimeout(None)
339 self.assertEqual(socket.getdefaulttimeout(), None)
340 s = socket.socket()
341 self.assertEqual(s.gettimeout(), None)
342 s.close()
343
344 # Check that setting it to an invalid value raises ValueError
345 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
346
347 # Check that setting it to an invalid type raises TypeError
348 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
349
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000350 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000351 if not hasattr(socket, 'inet_pton'):
352 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000353 from socket import inet_aton as f, inet_pton, AF_INET
354 g = lambda a: inet_pton(AF_INET, a)
355
356 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
357 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
358 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
359 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
360
361 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
362 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
363 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000364
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000365 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000366 if not hasattr(socket, 'inet_pton'):
367 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000368 try:
369 from socket import inet_pton, AF_INET6, has_ipv6
370 if not has_ipv6:
371 return
372 except ImportError:
373 return
374 f = lambda a: inet_pton(AF_INET6, a)
375
376 self.assertEquals('\x00' * 16, f('::'))
377 self.assertEquals('\x00' * 16, f('0::0'))
378 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
379 self.assertEquals(
380 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
381 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
382 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000383
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000384 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000385 if not hasattr(socket, 'inet_ntop'):
386 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000387 from socket import inet_ntoa as f, inet_ntop, AF_INET
388 g = lambda a: inet_ntop(AF_INET, a)
389
390 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
391 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
392 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
393 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000394
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000395 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
396 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
397 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
398
399 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000400 if not hasattr(socket, 'inet_ntop'):
401 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000402 try:
403 from socket import inet_ntop, AF_INET6, has_ipv6
404 if not has_ipv6:
405 return
406 except ImportError:
407 return
408 f = lambda a: inet_ntop(AF_INET6, a)
409
410 self.assertEquals('::', f('\x00' * 16))
411 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
412 self.assertEquals(
413 'aef:b01:506:1001:ffff:9997:55:170',
414 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
415 )
416
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000417 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000418
Guido van Rossum24e4af82002-06-12 19:18:08 +0000419 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000420 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000421 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000422 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000423 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000424 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000425
426 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000427 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000428 # We know a socket should start without reuse==0
429 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
430 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000431 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000432
433 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000434 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000435 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
436 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
437 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000438 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000439
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000440 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000441 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000442 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
443 sock.settimeout(1)
444 sock.close()
445 self.assertRaises(socket.error, sock.send, "spam")
446
Guido van Rossum24e4af82002-06-12 19:18:08 +0000447class BasicTCPTest(SocketConnectedTest):
448
449 def __init__(self, methodName='runTest'):
450 SocketConnectedTest.__init__(self, methodName=methodName)
451
452 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000453 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000454 msg = self.cli_conn.recv(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 _testRecv(self):
458 self.serv_conn.send(MSG)
459
460 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000461 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000462 seg1 = self.cli_conn.recv(len(MSG) - 3)
463 seg2 = self.cli_conn.recv(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 _testOverFlowRecv(self):
468 self.serv_conn.send(MSG)
469
470 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000471 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000472 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000473 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000474
475 def _testRecvFrom(self):
476 self.serv_conn.send(MSG)
477
478 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000479 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000480 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
481 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000482 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000483 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000484
485 def _testOverFlowRecvFrom(self):
486 self.serv_conn.send(MSG)
487
488 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000489 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000490 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000491 while 1:
492 read = self.cli_conn.recv(1024)
493 if not read:
494 break
Guido van Rossume531e292002-08-08 20:28:34 +0000495 msg += read
496 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000497
498 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000499 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500 self.serv_conn.sendall(big_chunk)
501
502 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000503 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000504 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000505 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000506 fd = self.cli_conn.fileno()
507 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
508 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000509 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510
511 def _testFromFd(self):
512 self.serv_conn.send(MSG)
513
514 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000515 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000516 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000517 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000518
519 def _testShutdown(self):
520 self.serv_conn.send(MSG)
521 self.serv_conn.shutdown(2)
522
523class BasicUDPTest(ThreadedUDPSocketTest):
524
525 def __init__(self, methodName='runTest'):
526 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
527
528 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000529 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000531 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532
533 def _testSendtoAndRecv(self):
534 self.cli.sendto(MSG, 0, (HOST, PORT))
535
Guido van Rossum1c938012002-06-12 21:17:20 +0000536 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000537 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000539 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540
Guido van Rossum1c938012002-06-12 21:17:20 +0000541 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000542 self.cli.sendto(MSG, 0, (HOST, PORT))
543
544class NonBlockingTCPTests(ThreadedTCPSocketTest):
545
546 def __init__(self, methodName='runTest'):
547 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
548
549 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000550 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000551 self.serv.setblocking(0)
552 start = time.time()
553 try:
554 self.serv.accept()
555 except socket.error:
556 pass
557 end = time.time()
558 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
559
560 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000561 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000562
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000564 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000566 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000567 conn, addr = self.serv.accept()
568 except socket.error:
569 pass
570 else:
571 self.fail("Error trying to do non-blocking accept.")
572 read, write, err = select.select([self.serv], [], [])
573 if self.serv in read:
574 conn, addr = self.serv.accept()
575 else:
576 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000577
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000579 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000580 self.cli.connect((HOST, PORT))
581
582 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000583 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 conn, addr = self.serv.accept()
585
586 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000587 self.cli.settimeout(10)
588 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000589
590 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000591 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000592 conn, addr = self.serv.accept()
593 conn.setblocking(0)
594 try:
595 msg = conn.recv(len(MSG))
596 except socket.error:
597 pass
598 else:
599 self.fail("Error trying to do non-blocking recv.")
600 read, write, err = select.select([conn], [], [])
601 if conn in read:
602 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000603 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 else:
605 self.fail("Error during select call to non-blocking socket.")
606
607 def _testRecv(self):
608 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000609 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000610 self.cli.send(MSG)
611
612class FileObjectClassTestCase(SocketConnectedTest):
613
Guido van Rossume9f66142002-08-07 15:46:19 +0000614 bufsize = -1 # Use default buffer size
615
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616 def __init__(self, methodName='runTest'):
617 SocketConnectedTest.__init__(self, methodName=methodName)
618
619 def setUp(self):
620 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000621 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622
623 def tearDown(self):
624 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000625 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000626 self.serv_file = None
627 SocketConnectedTest.tearDown(self)
628
629 def clientSetUp(self):
630 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000631 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000632
633 def clientTearDown(self):
634 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000635 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000636 self.cli_file = None
637 SocketConnectedTest.clientTearDown(self)
638
639 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000640 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641 first_seg = self.serv_file.read(len(MSG)-3)
642 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000643 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000644 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645
646 def _testSmallRead(self):
647 self.cli_file.write(MSG)
648 self.cli_file.flush()
649
Guido van Rossum8c943832002-08-08 01:00:28 +0000650 def testFullRead(self):
651 # read until EOF
652 msg = self.serv_file.read()
653 self.assertEqual(msg, MSG)
654
655 def _testFullRead(self):
656 self.cli_file.write(MSG)
657 self.cli_file.close()
658
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000660 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661 buf = ''
662 while 1:
663 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000664 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000665 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000666 buf += char
667 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000668
669 def _testUnbufferedRead(self):
670 self.cli_file.write(MSG)
671 self.cli_file.flush()
672
673 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000674 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000675 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000676 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000677
678 def _testReadline(self):
679 self.cli_file.write(MSG)
680 self.cli_file.flush()
681
Tim Peters116d83c2004-03-28 02:20:45 +0000682 def testClosedAttr(self):
683 self.assert_(not self.serv_file.closed)
684
685 def _testClosedAttr(self):
686 self.assert_(not self.cli_file.closed)
687
Guido van Rossume9f66142002-08-07 15:46:19 +0000688class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
689
690 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000691
Guido van Rossume9f66142002-08-07 15:46:19 +0000692 In this case (and in this case only), it should be possible to
693 create a file object, read a line from it, create another file
694 object, read another line from it, without loss of data in the
695 first file object's buffer. Note that httplib relies on this
696 when reading multiple requests from the same socket."""
697
698 bufsize = 0 # Use unbuffered mode
699
700 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000701 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000702 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000703 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000704 self.serv_file = self.cli_conn.makefile('rb', 0)
705 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000706 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000707
708 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000709 self.cli_file.write("A. " + MSG)
710 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000711 self.cli_file.flush()
712
Guido van Rossum8c943832002-08-08 01:00:28 +0000713class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
714
715 bufsize = 1 # Default-buffered for reading; line-buffered for writing
716
717
718class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
719
720 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000721
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000722class TCPTimeoutTest(SocketTCPTest):
723
724 def testTCPTimeout(self):
725 def raise_timeout(*args, **kwargs):
726 self.serv.settimeout(1.0)
727 self.serv.accept()
728 self.failUnlessRaises(socket.timeout, raise_timeout,
729 "Error generating a timeout exception (TCP)")
730
731 def testTimeoutZero(self):
732 ok = False
733 try:
734 self.serv.settimeout(0.0)
735 foo = self.serv.accept()
736 except socket.timeout:
737 self.fail("caught timeout instead of error (TCP)")
738 except socket.error:
739 ok = True
740 except:
741 self.fail("caught unexpected exception (TCP)")
742 if not ok:
743 self.fail("accept() returned success when we did not expect it")
744
745class UDPTimeoutTest(SocketTCPTest):
746
747 def testUDPTimeout(self):
748 def raise_timeout(*args, **kwargs):
749 self.serv.settimeout(1.0)
750 self.serv.recv(1024)
751 self.failUnlessRaises(socket.timeout, raise_timeout,
752 "Error generating a timeout exception (UDP)")
753
754 def testTimeoutZero(self):
755 ok = False
756 try:
757 self.serv.settimeout(0.0)
758 foo = self.serv.recv(1024)
759 except socket.timeout:
760 self.fail("caught timeout instead of error (UDP)")
761 except socket.error:
762 ok = True
763 except:
764 self.fail("caught unexpected exception (UDP)")
765 if not ok:
766 self.fail("recv() returned success when we did not expect it")
767
768class TestExceptions(unittest.TestCase):
769
770 def testExceptionTree(self):
771 self.assert_(issubclass(socket.error, Exception))
772 self.assert_(issubclass(socket.herror, socket.error))
773 self.assert_(issubclass(socket.gaierror, socket.error))
774 self.assert_(issubclass(socket.timeout, socket.error))
775
776
Guido van Rossumb995eb72002-07-31 16:08:40 +0000777def test_main():
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000778 tests = [GeneralModuleTests, BasicTCPTest, TCPTimeoutTest, TestExceptions]
Jack Jansen522e7692002-09-06 21:57:50 +0000779 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000780 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000781
782 tests.extend([
783 NonBlockingTCPTests,
784 FileObjectClassTestCase,
785 UnbufferedFileObjectClassTestCase,
786 LineBufferedFileObjectClassTestCase,
787 SmallBufferedFileObjectClassTestCase
788 ])
789 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790
791if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000792 test_main()