blob: 8ba2cebeb7d8958ceae0bd65b667f1ec244a03a9 [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
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000014
Guido van Rossum24e4af82002-06-12 19:18:08 +000015PORT = 50007
16HOST = 'localhost'
Guido van Rossum7d0a8262007-05-21 23:13:11 +000017MSG = b'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Guido van Rossum24e4af82002-06-12 19:18:08 +000019class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000020
Guido van Rossum24e4af82002-06-12 19:18:08 +000021 def setUp(self):
22 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
23 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000024 global PORT
25 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000026 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000027
Guido van Rossum24e4af82002-06-12 19:18:08 +000028 def tearDown(self):
29 self.serv.close()
30 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000031
Guido van Rossum24e4af82002-06-12 19:18:08 +000032class SocketUDPTest(unittest.TestCase):
33
34 def setUp(self):
35 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
36 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000037 global PORT
38 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000039
40 def tearDown(self):
41 self.serv.close()
42 self.serv = None
43
44class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000045 """Threadable Test class
46
47 The ThreadableTest class makes it easy to create a threaded
48 client/server pair from an existing unit test. To create a
49 new threaded class from an existing unit test, use multiple
50 inheritance:
51
52 class NewClass (OldClass, ThreadableTest):
53 pass
54
55 This class defines two new fixture functions with obvious
56 purposes for overriding:
57
58 clientSetUp ()
59 clientTearDown ()
60
61 Any new test functions within the class must then define
62 tests in pairs, where the test name is preceeded with a
63 '_' to indicate the client portion of the test. Ex:
64
65 def testFoo(self):
66 # Server portion
67
68 def _testFoo(self):
69 # Client portion
70
71 Any exceptions raised by the clients during their tests
72 are caught and transferred to the main thread to alert
73 the testing framework.
74
75 Note, the server setup function cannot call any blocking
76 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000077 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000078 the blocking call (such as in setting up a client/server
79 connection and performing the accept() in setUp().
80 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000081
82 def __init__(self):
83 # Swap the true setup function
84 self.__setUp = self.setUp
85 self.__tearDown = self.tearDown
86 self.setUp = self._setUp
87 self.tearDown = self._tearDown
88
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000089 def serverExplicitReady(self):
90 """This method allows the server to explicitly indicate that
91 it wants the client thread to proceed. This is useful if the
92 server is about to execute a blocking routine that is
93 dependent upon the client thread during its setup routine."""
94 self.server_ready.set()
95
Guido van Rossum24e4af82002-06-12 19:18:08 +000096 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000097 self.server_ready = threading.Event()
98 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000099 self.done = threading.Event()
100 self.queue = Queue.Queue(1)
101
102 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000103 methodname = self.id()
104 i = methodname.rfind('.')
105 methodname = methodname[i+1:]
106 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000107 self.client_thread = thread.start_new_thread(
108 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000109
110 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 if not self.server_ready.isSet():
112 self.server_ready.set()
113 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000114
115 def _tearDown(self):
116 self.__tearDown()
117 self.done.wait()
118
119 if not self.queue.empty():
120 msg = self.queue.get()
121 self.fail(msg)
122
123 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000124 self.server_ready.wait()
125 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000126 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000127 if not hasattr(test_func, '__call__'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000128 raise TypeError, "test_func must be a callable function"
129 try:
130 test_func()
Guido van Rossumb940e112007-01-10 16:19:56 +0000131 except Exception as strerror:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000132 self.queue.put(strerror)
133 self.clientTearDown()
134
135 def clientSetUp(self):
136 raise NotImplementedError, "clientSetUp must be implemented."
137
138 def clientTearDown(self):
139 self.done.set()
140 thread.exit()
141
142class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
143
144 def __init__(self, methodName='runTest'):
145 SocketTCPTest.__init__(self, methodName=methodName)
146 ThreadableTest.__init__(self)
147
148 def clientSetUp(self):
149 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
150
151 def clientTearDown(self):
152 self.cli.close()
153 self.cli = None
154 ThreadableTest.clientTearDown(self)
155
156class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
157
158 def __init__(self, methodName='runTest'):
159 SocketUDPTest.__init__(self, methodName=methodName)
160 ThreadableTest.__init__(self)
161
162 def clientSetUp(self):
163 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
164
165class SocketConnectedTest(ThreadedTCPSocketTest):
166
167 def __init__(self, methodName='runTest'):
168 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
169
170 def setUp(self):
171 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000172 # Indicate explicitly we're ready for the client thread to
173 # proceed and then perform the blocking call to accept
174 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175 conn, addr = self.serv.accept()
176 self.cli_conn = conn
177
178 def tearDown(self):
179 self.cli_conn.close()
180 self.cli_conn = None
181 ThreadedTCPSocketTest.tearDown(self)
182
183 def clientSetUp(self):
184 ThreadedTCPSocketTest.clientSetUp(self)
185 self.cli.connect((HOST, PORT))
186 self.serv_conn = self.cli
187
188 def clientTearDown(self):
189 self.serv_conn.close()
190 self.serv_conn = None
191 ThreadedTCPSocketTest.clientTearDown(self)
192
Dave Cole331708b2004-08-09 04:51:41 +0000193class SocketPairTest(unittest.TestCase, ThreadableTest):
194
195 def __init__(self, methodName='runTest'):
196 unittest.TestCase.__init__(self, methodName=methodName)
197 ThreadableTest.__init__(self)
198
199 def setUp(self):
200 self.serv, self.cli = socket.socketpair()
201
202 def tearDown(self):
203 self.serv.close()
204 self.serv = None
205
206 def clientSetUp(self):
207 pass
208
209 def clientTearDown(self):
210 self.cli.close()
211 self.cli = None
212 ThreadableTest.clientTearDown(self)
213
Tim Peters494aaee2004-08-09 18:54:11 +0000214
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215#######################################################################
216## Begin Tests
217
218class GeneralModuleTests(unittest.TestCase):
219
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000220 def test_repr(self):
221 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
222 self.assert_(repr(s).startswith("<socket.socket object"))
223
Raymond Hettinger027bb632004-05-31 03:09:25 +0000224 def test_weakref(self):
225 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
226 p = proxy(s)
227 self.assertEqual(p.fileno(), s.fileno())
228 s.close()
229 s = None
230 try:
231 p.fileno()
232 except ReferenceError:
233 pass
234 else:
235 self.fail('Socket proxy still exists')
236
Guido van Rossum24e4af82002-06-12 19:18:08 +0000237 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000238 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000239 def raise_error(*args, **kwargs):
240 raise socket.error
241 def raise_herror(*args, **kwargs):
242 raise socket.herror
243 def raise_gaierror(*args, **kwargs):
244 raise socket.gaierror
245 self.failUnlessRaises(socket.error, raise_error,
246 "Error raising socket exception.")
247 self.failUnlessRaises(socket.error, raise_herror,
248 "Error raising socket exception.")
249 self.failUnlessRaises(socket.error, raise_gaierror,
250 "Error raising socket exception.")
251
252 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000253 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000254 socket.AF_INET
255 socket.SOCK_STREAM
256 socket.SOCK_DGRAM
257 socket.SOCK_RAW
258 socket.SOCK_RDM
259 socket.SOCK_SEQPACKET
260 socket.SOL_SOCKET
261 socket.SO_REUSEADDR
262
Guido van Rossum654c11e2002-06-13 20:24:17 +0000263 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000264 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000265 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000266 try:
267 ip = socket.gethostbyname(hostname)
268 except socket.error:
269 # Probably name lookup wasn't set up right; skip this test
270 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000271 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000272 try:
273 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
274 except socket.error:
275 # Probably a similar problem as above; skip this test
276 return
Brett Cannon01668a12005-03-11 00:04:17 +0000277 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000278 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000279 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000280 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000281
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000282 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000283 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000284 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000285 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286 try:
287 # On some versions, this loses a reference
288 orig = sys.getrefcount(__name__)
289 socket.getnameinfo(__name__,0)
290 except SystemError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000291 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000293
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000295 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296 try:
297 # On some versions, this crashes the interpreter.
298 socket.getnameinfo(('x', 0, 0, 0), 0)
299 except socket.error:
300 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000301
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000302 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000303 # This just checks that htons etc. are their own inverse,
304 # when looking at the lower 16 or 32 bits.
305 sizes = {socket.htonl: 32, socket.ntohl: 32,
306 socket.htons: 16, socket.ntohs: 16}
307 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000308 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000309 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
310 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000311
Guido van Rossuma2627af2002-09-14 00:58:46 +0000312 swapped = func(mask)
313 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000314 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000315
Guido van Rossum018919a2007-01-15 00:07:32 +0000316 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000317 good_values = [ 1, 2, 3, 1, 2, 3 ]
318 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000319 for k in good_values:
320 socket.ntohl(k)
321 socket.ntohs(k)
322 socket.htonl(k)
323 socket.htons(k)
324 for k in bad_values:
325 self.assertRaises(OverflowError, socket.ntohl, k)
326 self.assertRaises(OverflowError, socket.ntohs, k)
327 self.assertRaises(OverflowError, socket.htonl, k)
328 self.assertRaises(OverflowError, socket.htons, k)
329
Barry Warsaw11b91a02004-06-28 00:50:43 +0000330 def testGetServBy(self):
331 eq = self.assertEqual
332 # Find one service that exists, then check all the related interfaces.
333 # I've ordered this by protocols that have both a tcp and udp
334 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000335 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Chang4e422812005-07-17 02:36:59 +0000336 'freebsd7', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000337 # avoid the 'echo' service on this platform, as there is an
338 # assumption breaking non-standard port/protocol entry
339 services = ('daytime', 'qotd', 'domain')
340 else:
341 services = ('echo', 'daytime', 'domain')
342 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000343 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000344 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000345 break
346 except socket.error:
347 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000348 else:
349 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000350 # Try same call with optional protocol omitted
351 port2 = socket.getservbyname(service)
352 eq(port, port2)
353 # Try udp, but don't barf it it doesn't exist
354 try:
355 udpport = socket.getservbyname(service, 'udp')
356 except socket.error:
357 udpport = None
358 else:
359 eq(udpport, port)
360 # Now make sure the lookup by port returns the same service name
361 eq(socket.getservbyport(port2), service)
362 eq(socket.getservbyport(port, 'tcp'), service)
363 if udpport is not None:
364 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000365
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000366 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000367 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000368 # The default timeout should initially be None
369 self.assertEqual(socket.getdefaulttimeout(), None)
370 s = socket.socket()
371 self.assertEqual(s.gettimeout(), None)
372 s.close()
373
374 # Set the default timeout to 10, and see if it propagates
375 socket.setdefaulttimeout(10)
376 self.assertEqual(socket.getdefaulttimeout(), 10)
377 s = socket.socket()
378 self.assertEqual(s.gettimeout(), 10)
379 s.close()
380
381 # Reset the default timeout to None, and see if it propagates
382 socket.setdefaulttimeout(None)
383 self.assertEqual(socket.getdefaulttimeout(), None)
384 s = socket.socket()
385 self.assertEqual(s.gettimeout(), None)
386 s.close()
387
388 # Check that setting it to an invalid value raises ValueError
389 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
390
391 # Check that setting it to an invalid type raises TypeError
392 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
393
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000394 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000395 if not hasattr(socket, 'inet_pton'):
396 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000397 from socket import inet_aton as f, inet_pton, AF_INET
398 g = lambda a: inet_pton(AF_INET, a)
399
Guido van Rossumb5b22702007-05-18 18:55:53 +0000400 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
401 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
402 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
403 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
404 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000405
Guido van Rossumb5b22702007-05-18 18:55:53 +0000406 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
407 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
408 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
409 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000410
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000411 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000412 if not hasattr(socket, 'inet_pton'):
413 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000414 try:
415 from socket import inet_pton, AF_INET6, has_ipv6
416 if not has_ipv6:
417 return
418 except ImportError:
419 return
420 f = lambda a: inet_pton(AF_INET6, a)
421
422 self.assertEquals('\x00' * 16, f('::'))
423 self.assertEquals('\x00' * 16, f('0::0'))
424 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
425 self.assertEquals(
426 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
427 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
428 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000429
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000430 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000431 if not hasattr(socket, 'inet_ntop'):
432 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000433 from socket import inet_ntoa as f, inet_ntop, AF_INET
434 g = lambda a: inet_ntop(AF_INET, a)
435
Guido van Rossumb5b22702007-05-18 18:55:53 +0000436 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
437 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
438 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
439 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000440
Guido van Rossumb5b22702007-05-18 18:55:53 +0000441 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
442 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
443 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000444
445 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000446 if not hasattr(socket, 'inet_ntop'):
447 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000448 try:
449 from socket import inet_ntop, AF_INET6, has_ipv6
450 if not has_ipv6:
451 return
452 except ImportError:
453 return
454 f = lambda a: inet_ntop(AF_INET6, a)
455
456 self.assertEquals('::', f('\x00' * 16))
457 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
458 self.assertEquals(
459 'aef:b01:506:1001:ffff:9997:55:170',
460 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
461 )
462
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000463 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000464
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000466 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000467 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000468 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000469 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000470 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
471 # it reasonable to get the host's addr in addition to 0.0.0.0.
472 # At least for eCos. This is required for the S/390 to pass.
473 my_ip_addr = socket.gethostbyname(socket.gethostname())
474 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
475 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000476
477 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000478 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000479 # We know a socket should start without reuse==0
480 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
481 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000482 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000483
484 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000485 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000486 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
487 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
488 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000489 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000490
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000491 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000492 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000493 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
494 sock.settimeout(1)
495 sock.close()
496 self.assertRaises(socket.error, sock.send, "spam")
497
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000498 def testNewAttributes(self):
499 # testing .family, .type and .protocol
500 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
501 self.assertEqual(sock.family, socket.AF_INET)
502 self.assertEqual(sock.type, socket.SOCK_STREAM)
503 self.assertEqual(sock.proto, 0)
504 sock.close()
505
Guido van Rossum24e4af82002-06-12 19:18:08 +0000506class BasicTCPTest(SocketConnectedTest):
507
508 def __init__(self, methodName='runTest'):
509 SocketConnectedTest.__init__(self, methodName=methodName)
510
511 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000512 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000514 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000515
516 def _testRecv(self):
517 self.serv_conn.send(MSG)
518
519 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000520 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521 seg1 = self.cli_conn.recv(len(MSG) - 3)
522 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000523 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000524 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525
526 def _testOverFlowRecv(self):
527 self.serv_conn.send(MSG)
528
529 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000530 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000532 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533
534 def _testRecvFrom(self):
535 self.serv_conn.send(MSG)
536
537 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000538 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
540 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000541 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000542 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000543
544 def _testOverFlowRecvFrom(self):
545 self.serv_conn.send(MSG)
546
547 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000548 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000549 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000550 while 1:
551 read = self.cli_conn.recv(1024)
552 if not read:
553 break
Guido van Rossume531e292002-08-08 20:28:34 +0000554 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000555 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000556
557 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000558 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000559 self.serv_conn.sendall(big_chunk)
560
561 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000562 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000563 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000564 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565 fd = self.cli_conn.fileno()
566 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
567 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000568 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000569
570 def _testFromFd(self):
571 self.serv_conn.send(MSG)
572
573 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000574 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000576 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000577
578 def _testShutdown(self):
579 self.serv_conn.send(MSG)
580 self.serv_conn.shutdown(2)
581
582class BasicUDPTest(ThreadedUDPSocketTest):
583
584 def __init__(self, methodName='runTest'):
585 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
586
587 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000588 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000589 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000590 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000591
592 def _testSendtoAndRecv(self):
593 self.cli.sendto(MSG, 0, (HOST, PORT))
594
Guido van Rossum1c938012002-06-12 21:17:20 +0000595 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000596 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000598 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000599
Guido van Rossum1c938012002-06-12 21:17:20 +0000600 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000601 self.cli.sendto(MSG, 0, (HOST, PORT))
602
Guido van Rossumd8faa362007-04-27 19:54:29 +0000603 def testRecvFromNegative(self):
604 # Negative lengths passed to recvfrom should give ValueError.
605 self.assertRaises(ValueError, self.serv.recvfrom, -1)
606
607 def _testRecvFromNegative(self):
608 self.cli.sendto(MSG, 0, (HOST, PORT))
609
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000610class TCPCloserTest(ThreadedTCPSocketTest):
611
612 def testClose(self):
613 conn, addr = self.serv.accept()
614 conn.close()
615
616 sd = self.cli
617 read, write, err = select.select([sd], [], [], 1.0)
618 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000619 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000620
621 def _testClose(self):
622 self.cli.connect((HOST, PORT))
623 time.sleep(1.0)
624
Dave Cole331708b2004-08-09 04:51:41 +0000625class BasicSocketPairTest(SocketPairTest):
626
627 def __init__(self, methodName='runTest'):
628 SocketPairTest.__init__(self, methodName=methodName)
629
630 def testRecv(self):
631 msg = self.serv.recv(1024)
632 self.assertEqual(msg, MSG)
633
634 def _testRecv(self):
635 self.cli.send(MSG)
636
637 def testSend(self):
638 self.serv.send(MSG)
639
640 def _testSend(self):
641 msg = self.cli.recv(1024)
642 self.assertEqual(msg, MSG)
643
Guido van Rossum24e4af82002-06-12 19:18:08 +0000644class NonBlockingTCPTests(ThreadedTCPSocketTest):
645
646 def __init__(self, methodName='runTest'):
647 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
648
649 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000650 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000651 self.serv.setblocking(0)
652 start = time.time()
653 try:
654 self.serv.accept()
655 except socket.error:
656 pass
657 end = time.time()
658 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
659
660 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000661 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000662
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000664 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000665 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000666 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667 conn, addr = self.serv.accept()
668 except socket.error:
669 pass
670 else:
671 self.fail("Error trying to do non-blocking accept.")
672 read, write, err = select.select([self.serv], [], [])
673 if self.serv in read:
674 conn, addr = self.serv.accept()
675 else:
676 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000677
Guido van Rossum24e4af82002-06-12 19:18:08 +0000678 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000679 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000680 self.cli.connect((HOST, PORT))
681
682 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000683 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684 conn, addr = self.serv.accept()
685
686 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000687 self.cli.settimeout(10)
688 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689
690 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000691 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000692 conn, addr = self.serv.accept()
693 conn.setblocking(0)
694 try:
695 msg = conn.recv(len(MSG))
696 except socket.error:
697 pass
698 else:
699 self.fail("Error trying to do non-blocking recv.")
700 read, write, err = select.select([conn], [], [])
701 if conn in read:
702 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000703 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000704 else:
705 self.fail("Error during select call to non-blocking socket.")
706
707 def _testRecv(self):
708 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000709 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710 self.cli.send(MSG)
711
712class FileObjectClassTestCase(SocketConnectedTest):
713
Guido van Rossume9f66142002-08-07 15:46:19 +0000714 bufsize = -1 # Use default buffer size
715
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716 def __init__(self, methodName='runTest'):
717 SocketConnectedTest.__init__(self, methodName=methodName)
718
719 def setUp(self):
720 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000721 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000722
723 def tearDown(self):
724 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000725 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000726 self.serv_file = None
727 SocketConnectedTest.tearDown(self)
728
729 def clientSetUp(self):
730 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000731 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732
733 def clientTearDown(self):
734 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000735 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000736 self.cli_file = None
737 SocketConnectedTest.clientTearDown(self)
738
739 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000740 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741 first_seg = self.serv_file.read(len(MSG)-3)
742 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000743 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000744 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000745
746 def _testSmallRead(self):
747 self.cli_file.write(MSG)
748 self.cli_file.flush()
749
Guido van Rossum8c943832002-08-08 01:00:28 +0000750 def testFullRead(self):
751 # read until EOF
752 msg = self.serv_file.read()
753 self.assertEqual(msg, MSG)
754
755 def _testFullRead(self):
756 self.cli_file.write(MSG)
757 self.cli_file.close()
758
Guido van Rossum24e4af82002-06-12 19:18:08 +0000759 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000760 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000761 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762 while 1:
763 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000764 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000766 buf += char
767 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768
769 def _testUnbufferedRead(self):
770 self.cli_file.write(MSG)
771 self.cli_file.flush()
772
773 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000774 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000776 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777
778 def _testReadline(self):
779 self.cli_file.write(MSG)
780 self.cli_file.flush()
781
Tim Peters116d83c2004-03-28 02:20:45 +0000782 def testClosedAttr(self):
783 self.assert_(not self.serv_file.closed)
784
785 def _testClosedAttr(self):
786 self.assert_(not self.cli_file.closed)
787
Guido van Rossume9f66142002-08-07 15:46:19 +0000788class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
789
790 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000791
Guido van Rossume9f66142002-08-07 15:46:19 +0000792 In this case (and in this case only), it should be possible to
793 create a file object, read a line from it, create another file
794 object, read another line from it, without loss of data in the
795 first file object's buffer. Note that httplib relies on this
796 when reading multiple requests from the same socket."""
797
798 bufsize = 0 # Use unbuffered mode
799
800 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000801 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000802 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000803 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000804 self.serv_file = self.cli_conn.makefile('rb', 0)
805 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000806 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000807
808 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000809 self.cli_file.write(b"A. " + MSG)
810 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000811 self.cli_file.flush()
812
Guido van Rossum8c943832002-08-08 01:00:28 +0000813class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
814
815 bufsize = 1 # Default-buffered for reading; line-buffered for writing
816
817
818class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
819
820 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000821
Thomas Woutersb2137042007-02-01 18:02:27 +0000822
Guido van Rossumd8faa362007-04-27 19:54:29 +0000823class NetworkConnectionTest(object):
824 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000825
Guido van Rossumd8faa362007-04-27 19:54:29 +0000826 def clientSetUp(self):
827 self.cli = socket.create_connection((HOST, PORT))
828 self.serv_conn = self.cli
829
830class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
831 """Tests that NetworkConnection does not break existing TCP functionality.
832 """
833
834class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000835
Guido van Rossumd8faa362007-04-27 19:54:29 +0000836 def testWithoutServer(self):
837 self.failUnlessRaises(socket.error, lambda: socket.create_connection((HOST, PORT)))
838
839class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
840
841 def __init__(self, methodName='runTest'):
842 SocketTCPTest.__init__(self, methodName=methodName)
843 ThreadableTest.__init__(self)
844
845 def clientSetUp(self):
846 pass
847
848 def clientTearDown(self):
849 self.cli.close()
850 self.cli = None
851 ThreadableTest.clientTearDown(self)
852
853 def _justAccept(self):
854 conn, addr = self.serv.accept()
855
856 testFamily = _justAccept
857 def _testFamily(self):
858 self.cli = socket.create_connection((HOST, PORT), timeout=30)
859 self.assertEqual(self.cli.family, 2)
860
861 testTimeoutDefault = _justAccept
862 def _testTimeoutDefault(self):
863 self.cli = socket.create_connection((HOST, PORT))
864 self.assertTrue(self.cli.gettimeout() is None)
865
866 testTimeoutValueNamed = _justAccept
867 def _testTimeoutValueNamed(self):
868 self.cli = socket.create_connection((HOST, PORT), timeout=30)
869 self.assertEqual(self.cli.gettimeout(), 30)
870
871 testTimeoutValueNonamed = _justAccept
872 def _testTimeoutValueNonamed(self):
873 self.cli = socket.create_connection((HOST, PORT), 30)
874 self.assertEqual(self.cli.gettimeout(), 30)
875
876 testTimeoutNone = _justAccept
877 def _testTimeoutNone(self):
878 previous = socket.getdefaulttimeout()
879 socket.setdefaulttimeout(30)
880 try:
881 self.cli = socket.create_connection((HOST, PORT), timeout=None)
882 finally:
883 socket.setdefaulttimeout(previous)
884 self.assertEqual(self.cli.gettimeout(), 30)
885
886
887class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
888
889 def __init__(self, methodName='runTest'):
890 SocketTCPTest.__init__(self, methodName=methodName)
891 ThreadableTest.__init__(self)
892
893 def clientSetUp(self):
894 pass
895
896 def clientTearDown(self):
897 self.cli.close()
898 self.cli = None
899 ThreadableTest.clientTearDown(self)
900
901 def testInsideTimeout(self):
902 conn, addr = self.serv.accept()
903 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000904 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000905 testOutsideTimeout = testInsideTimeout
906
907 def _testInsideTimeout(self):
908 self.cli = sock = socket.create_connection((HOST, PORT))
909 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000910 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000911
912 def _testOutsideTimeout(self):
913 self.cli = sock = socket.create_connection((HOST, PORT), timeout=1)
914 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
915
916
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000917class TCPTimeoutTest(SocketTCPTest):
918
919 def testTCPTimeout(self):
920 def raise_timeout(*args, **kwargs):
921 self.serv.settimeout(1.0)
922 self.serv.accept()
923 self.failUnlessRaises(socket.timeout, raise_timeout,
924 "Error generating a timeout exception (TCP)")
925
926 def testTimeoutZero(self):
927 ok = False
928 try:
929 self.serv.settimeout(0.0)
930 foo = self.serv.accept()
931 except socket.timeout:
932 self.fail("caught timeout instead of error (TCP)")
933 except socket.error:
934 ok = True
935 except:
936 self.fail("caught unexpected exception (TCP)")
937 if not ok:
938 self.fail("accept() returned success when we did not expect it")
939
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000940 def testInterruptedTimeout(self):
941 # XXX I don't know how to do this test on MSWindows or any other
942 # plaform that doesn't support signal.alarm() or os.kill(), though
943 # the bug should have existed on all platforms.
944 if not hasattr(signal, "alarm"):
945 return # can only test on *nix
946 self.serv.settimeout(5.0) # must be longer than alarm
947 class Alarm(Exception):
948 pass
949 def alarm_handler(signal, frame):
950 raise Alarm
951 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
952 try:
953 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
954 try:
955 foo = self.serv.accept()
956 except socket.timeout:
957 self.fail("caught timeout instead of Alarm")
958 except Alarm:
959 pass
960 except:
961 self.fail("caught other exception instead of Alarm")
962 else:
963 self.fail("nothing caught")
964 signal.alarm(0) # shut off alarm
965 except Alarm:
966 self.fail("got Alarm in wrong place")
967 finally:
968 # no alarm can be pending. Safe to restore old handler.
969 signal.signal(signal.SIGALRM, old_alarm)
970
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000971class UDPTimeoutTest(SocketTCPTest):
972
973 def testUDPTimeout(self):
974 def raise_timeout(*args, **kwargs):
975 self.serv.settimeout(1.0)
976 self.serv.recv(1024)
977 self.failUnlessRaises(socket.timeout, raise_timeout,
978 "Error generating a timeout exception (UDP)")
979
980 def testTimeoutZero(self):
981 ok = False
982 try:
983 self.serv.settimeout(0.0)
984 foo = self.serv.recv(1024)
985 except socket.timeout:
986 self.fail("caught timeout instead of error (UDP)")
987 except socket.error:
988 ok = True
989 except:
990 self.fail("caught unexpected exception (UDP)")
991 if not ok:
992 self.fail("recv() returned success when we did not expect it")
993
994class TestExceptions(unittest.TestCase):
995
996 def testExceptionTree(self):
997 self.assert_(issubclass(socket.error, Exception))
998 self.assert_(issubclass(socket.herror, socket.error))
999 self.assert_(issubclass(socket.gaierror, socket.error))
1000 self.assert_(issubclass(socket.timeout, socket.error))
1001
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001002class TestLinuxAbstractNamespace(unittest.TestCase):
1003
1004 UNIX_PATH_MAX = 108
1005
1006 def testLinuxAbstractNamespace(self):
1007 address = "\x00python-test-hello\x00\xff"
1008 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1009 s1.bind(address)
1010 s1.listen(1)
1011 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1012 s2.connect(s1.getsockname())
1013 s1.accept()
1014 self.assertEqual(s1.getsockname(), address)
1015 self.assertEqual(s2.getpeername(), address)
1016
1017 def testMaxName(self):
1018 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1019 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1020 s.bind(address)
1021 self.assertEqual(s.getsockname(), address)
1022
1023 def testNameOverflow(self):
1024 address = "\x00" + "h" * self.UNIX_PATH_MAX
1025 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1026 self.assertRaises(socket.error, s.bind, address)
1027
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001028
Thomas Wouters477c8d52006-05-27 19:21:47 +00001029class BufferIOTest(SocketConnectedTest):
1030 """
1031 Test the buffer versions of socket.recv() and socket.send().
1032 """
1033 def __init__(self, methodName='runTest'):
1034 SocketConnectedTest.__init__(self, methodName=methodName)
1035
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001036 def testRecvInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001037 buf = b" "*1024
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001038 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001039 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001040 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001041 self.assertEqual(msg, MSG)
1042
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001043 def _testRecvInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001044 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001045 self.serv_conn.send(buf)
1046
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001047 def testRecvFromInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001048 buf = b" "*1024
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001049 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001050 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001051 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001052 self.assertEqual(msg, MSG)
1053
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001054 def _testRecvFromInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001055 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001056 self.serv_conn.send(buf)
1057
Guido van Rossumb995eb72002-07-31 16:08:40 +00001058def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001059 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001060 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001061 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001062 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001063
1064 tests.extend([
1065 NonBlockingTCPTests,
1066 FileObjectClassTestCase,
1067 UnbufferedFileObjectClassTestCase,
1068 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001069 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001070 NetworkConnectionNoServer,
1071 NetworkConnectionAttributesTest,
1072 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001073 ])
Dave Cole331708b2004-08-09 04:51:41 +00001074 if hasattr(socket, "socketpair"):
1075 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001076 if sys.platform == 'linux2':
1077 tests.append(TestLinuxAbstractNamespace)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001078
1079 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001080 test_support.run_unittest(*tests)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001081 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082
1083if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001084 test_main()