blob: db8947bfa7a9a34487e041f074a1e6e714a2425b [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
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import thread, threading
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00009import time
10import traceback
Guido van Rossum24e4af82002-06-12 19:18:08 +000011import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000012import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000013import os
Martin Blais2856e5f2006-05-26 12:03:27 +000014import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000015from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000016import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Amaury Forgeot d'Arc5e08e8b2008-03-29 13:47:05 +000018# Temporary hack to see why test_socket hangs on one buildbot
19if os.environ.get('COMPUTERNAME') == "GRAPE":
20 def verbose_write(arg):
21 print >>sys.__stdout__, arg
22else:
23 def verbose_write(arg):
24 pass
25
Guido van Rossum24e4af82002-06-12 19:18:08 +000026PORT = 50007
27HOST = 'localhost'
28MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Guido van Rossum24e4af82002-06-12 19:18:08 +000030class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000031
Guido van Rossum24e4af82002-06-12 19:18:08 +000032 def setUp(self):
Amaury Forgeot d'Arc5e08e8b2008-03-29 13:47:05 +000033 verbose_write(self)
Guido van Rossum24e4af82002-06-12 19:18:08 +000034 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
35 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000036 global PORT
37 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000038 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000039
Guido van Rossum24e4af82002-06-12 19:18:08 +000040 def tearDown(self):
41 self.serv.close()
42 self.serv = None
Amaury Forgeot d'Arc5e08e8b2008-03-29 13:47:05 +000043 verbose_write(str(self) + " done")
Barry Warsawcf3d4b51997-01-03 20:03:32 +000044
Guido van Rossum24e4af82002-06-12 19:18:08 +000045class SocketUDPTest(unittest.TestCase):
46
47 def setUp(self):
Amaury Forgeot d'Arc5e08e8b2008-03-29 13:47:05 +000048 verbose_write(self)
Guido van Rossum24e4af82002-06-12 19:18:08 +000049 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
50 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000051 global PORT
52 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000053
54 def tearDown(self):
55 self.serv.close()
56 self.serv = None
Amaury Forgeot d'Arc5e08e8b2008-03-29 13:47:05 +000057 verbose_write(str(self) + " done")
Guido van Rossum24e4af82002-06-12 19:18:08 +000058
59class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000060 """Threadable Test class
61
62 The ThreadableTest class makes it easy to create a threaded
63 client/server pair from an existing unit test. To create a
64 new threaded class from an existing unit test, use multiple
65 inheritance:
66
67 class NewClass (OldClass, ThreadableTest):
68 pass
69
70 This class defines two new fixture functions with obvious
71 purposes for overriding:
72
73 clientSetUp ()
74 clientTearDown ()
75
76 Any new test functions within the class must then define
77 tests in pairs, where the test name is preceeded with a
78 '_' to indicate the client portion of the test. Ex:
79
80 def testFoo(self):
81 # Server portion
82
83 def _testFoo(self):
84 # Client portion
85
86 Any exceptions raised by the clients during their tests
87 are caught and transferred to the main thread to alert
88 the testing framework.
89
90 Note, the server setup function cannot call any blocking
91 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000092 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000093 the blocking call (such as in setting up a client/server
94 connection and performing the accept() in setUp().
95 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000096
97 def __init__(self):
98 # Swap the true setup function
99 self.__setUp = self.setUp
100 self.__tearDown = self.tearDown
101 self.setUp = self._setUp
102 self.tearDown = self._tearDown
103
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000104 def serverExplicitReady(self):
105 """This method allows the server to explicitly indicate that
106 it wants the client thread to proceed. This is useful if the
107 server is about to execute a blocking routine that is
108 dependent upon the client thread during its setup routine."""
109 self.server_ready.set()
110
Guido van Rossum24e4af82002-06-12 19:18:08 +0000111 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 self.server_ready = threading.Event()
113 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000114 self.done = threading.Event()
115 self.queue = Queue.Queue(1)
116
117 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000118 methodname = self.id()
119 i = methodname.rfind('.')
120 methodname = methodname[i+1:]
121 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000122 self.client_thread = thread.start_new_thread(
123 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000124
125 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000126 if not self.server_ready.isSet():
127 self.server_ready.set()
128 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000129
130 def _tearDown(self):
131 self.__tearDown()
132 self.done.wait()
133
134 if not self.queue.empty():
135 msg = self.queue.get()
136 self.fail(msg)
137
138 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000139 self.server_ready.wait()
140 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000141 self.clientSetUp()
142 if not callable(test_func):
143 raise TypeError, "test_func must be a callable function"
144 try:
145 test_func()
146 except Exception, strerror:
147 self.queue.put(strerror)
148 self.clientTearDown()
149
150 def clientSetUp(self):
151 raise NotImplementedError, "clientSetUp must be implemented."
152
153 def clientTearDown(self):
154 self.done.set()
155 thread.exit()
156
157class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
158
159 def __init__(self, methodName='runTest'):
160 SocketTCPTest.__init__(self, methodName=methodName)
161 ThreadableTest.__init__(self)
162
163 def clientSetUp(self):
164 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
165
166 def clientTearDown(self):
167 self.cli.close()
168 self.cli = None
169 ThreadableTest.clientTearDown(self)
170
171class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
172
173 def __init__(self, methodName='runTest'):
174 SocketUDPTest.__init__(self, methodName=methodName)
175 ThreadableTest.__init__(self)
176
177 def clientSetUp(self):
178 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
179
180class SocketConnectedTest(ThreadedTCPSocketTest):
181
182 def __init__(self, methodName='runTest'):
183 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
184
185 def setUp(self):
186 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000187 # Indicate explicitly we're ready for the client thread to
188 # proceed and then perform the blocking call to accept
189 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000190 conn, addr = self.serv.accept()
191 self.cli_conn = conn
192
193 def tearDown(self):
194 self.cli_conn.close()
195 self.cli_conn = None
196 ThreadedTCPSocketTest.tearDown(self)
197
198 def clientSetUp(self):
199 ThreadedTCPSocketTest.clientSetUp(self)
200 self.cli.connect((HOST, PORT))
201 self.serv_conn = self.cli
202
203 def clientTearDown(self):
204 self.serv_conn.close()
205 self.serv_conn = None
206 ThreadedTCPSocketTest.clientTearDown(self)
207
Dave Cole331708b2004-08-09 04:51:41 +0000208class SocketPairTest(unittest.TestCase, ThreadableTest):
209
210 def __init__(self, methodName='runTest'):
211 unittest.TestCase.__init__(self, methodName=methodName)
212 ThreadableTest.__init__(self)
213
214 def setUp(self):
215 self.serv, self.cli = socket.socketpair()
216
217 def tearDown(self):
218 self.serv.close()
219 self.serv = None
220
221 def clientSetUp(self):
222 pass
223
224 def clientTearDown(self):
225 self.cli.close()
226 self.cli = None
227 ThreadableTest.clientTearDown(self)
228
Tim Peters494aaee2004-08-09 18:54:11 +0000229
Guido van Rossum24e4af82002-06-12 19:18:08 +0000230#######################################################################
231## Begin Tests
232
233class GeneralModuleTests(unittest.TestCase):
234
Raymond Hettinger027bb632004-05-31 03:09:25 +0000235 def test_weakref(self):
236 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
237 p = proxy(s)
238 self.assertEqual(p.fileno(), s.fileno())
239 s.close()
240 s = None
241 try:
242 p.fileno()
243 except ReferenceError:
244 pass
245 else:
246 self.fail('Socket proxy still exists')
247
Guido van Rossum24e4af82002-06-12 19:18:08 +0000248 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000249 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 def raise_error(*args, **kwargs):
251 raise socket.error
252 def raise_herror(*args, **kwargs):
253 raise socket.herror
254 def raise_gaierror(*args, **kwargs):
255 raise socket.gaierror
256 self.failUnlessRaises(socket.error, raise_error,
257 "Error raising socket exception.")
258 self.failUnlessRaises(socket.error, raise_herror,
259 "Error raising socket exception.")
260 self.failUnlessRaises(socket.error, raise_gaierror,
261 "Error raising socket exception.")
262
263 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000264 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265 socket.AF_INET
266 socket.SOCK_STREAM
267 socket.SOCK_DGRAM
268 socket.SOCK_RAW
269 socket.SOCK_RDM
270 socket.SOCK_SEQPACKET
271 socket.SOL_SOCKET
272 socket.SO_REUSEADDR
273
Guido van Rossum654c11e2002-06-13 20:24:17 +0000274 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000275 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000276 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000277 try:
278 ip = socket.gethostbyname(hostname)
279 except socket.error:
280 # Probably name lookup wasn't set up right; skip this test
281 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000282 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000283 try:
284 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
285 except socket.error:
286 # Probably a similar problem as above; skip this test
287 return
Brett Cannon01668a12005-03-11 00:04:17 +0000288 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000289 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000290 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000291 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000292
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000293 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000294 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000295 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296 try:
297 # On some versions, this loses a reference
298 orig = sys.getrefcount(__name__)
299 socket.getnameinfo(__name__,0)
300 except SystemError:
301 if sys.getrefcount(__name__) <> orig:
302 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000303
Guido van Rossum24e4af82002-06-12 19:18:08 +0000304 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000305 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000306 try:
307 # On some versions, this crashes the interpreter.
308 socket.getnameinfo(('x', 0, 0, 0), 0)
309 except socket.error:
310 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000311
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000312 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000313 # This just checks that htons etc. are their own inverse,
314 # when looking at the lower 16 or 32 bits.
315 sizes = {socket.htonl: 32, socket.ntohl: 32,
316 socket.htons: 16, socket.ntohs: 16}
317 for func, size in sizes.items():
318 mask = (1L<<size) - 1
319 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
320 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000321
Guido van Rossuma2627af2002-09-14 00:58:46 +0000322 swapped = func(mask)
323 self.assertEqual(swapped & mask, mask)
324 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000325
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000326 def testNtoHErrors(self):
327 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
328 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
329 for k in good_values:
330 socket.ntohl(k)
331 socket.ntohs(k)
332 socket.htonl(k)
333 socket.htons(k)
334 for k in bad_values:
335 self.assertRaises(OverflowError, socket.ntohl, k)
336 self.assertRaises(OverflowError, socket.ntohs, k)
337 self.assertRaises(OverflowError, socket.htonl, k)
338 self.assertRaises(OverflowError, socket.htons, k)
339
Barry Warsaw11b91a02004-06-28 00:50:43 +0000340 def testGetServBy(self):
341 eq = self.assertEqual
342 # Find one service that exists, then check all the related interfaces.
343 # I've ordered this by protocols that have both a tcp and udp
344 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000345 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000346 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000347 # avoid the 'echo' service on this platform, as there is an
348 # assumption breaking non-standard port/protocol entry
349 services = ('daytime', 'qotd', 'domain')
350 else:
351 services = ('echo', 'daytime', 'domain')
352 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000353 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000354 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000355 break
356 except socket.error:
357 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000358 else:
359 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000360 # Try same call with optional protocol omitted
361 port2 = socket.getservbyname(service)
362 eq(port, port2)
363 # Try udp, but don't barf it it doesn't exist
364 try:
365 udpport = socket.getservbyname(service, 'udp')
366 except socket.error:
367 udpport = None
368 else:
369 eq(udpport, port)
370 # Now make sure the lookup by port returns the same service name
371 eq(socket.getservbyport(port2), service)
372 eq(socket.getservbyport(port, 'tcp'), service)
373 if udpport is not None:
374 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000376 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000377 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000378 # The default timeout should initially be None
379 self.assertEqual(socket.getdefaulttimeout(), None)
380 s = socket.socket()
381 self.assertEqual(s.gettimeout(), None)
382 s.close()
383
384 # Set the default timeout to 10, and see if it propagates
385 socket.setdefaulttimeout(10)
386 self.assertEqual(socket.getdefaulttimeout(), 10)
387 s = socket.socket()
388 self.assertEqual(s.gettimeout(), 10)
389 s.close()
390
391 # Reset the default timeout to None, and see if it propagates
392 socket.setdefaulttimeout(None)
393 self.assertEqual(socket.getdefaulttimeout(), None)
394 s = socket.socket()
395 self.assertEqual(s.gettimeout(), None)
396 s.close()
397
398 # Check that setting it to an invalid value raises ValueError
399 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
400
401 # Check that setting it to an invalid type raises TypeError
402 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
403
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000404 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000405 if not hasattr(socket, 'inet_pton'):
406 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000407 from socket import inet_aton as f, inet_pton, AF_INET
408 g = lambda a: inet_pton(AF_INET, a)
409
410 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
411 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
412 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
413 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000414 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000415
416 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
417 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
418 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000419 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000420
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000421 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000422 if not hasattr(socket, 'inet_pton'):
423 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000424 try:
425 from socket import inet_pton, AF_INET6, has_ipv6
426 if not has_ipv6:
427 return
428 except ImportError:
429 return
430 f = lambda a: inet_pton(AF_INET6, a)
431
432 self.assertEquals('\x00' * 16, f('::'))
433 self.assertEquals('\x00' * 16, f('0::0'))
434 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
435 self.assertEquals(
436 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
437 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
438 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000439
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000440 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000441 if not hasattr(socket, 'inet_ntop'):
442 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000443 from socket import inet_ntoa as f, inet_ntop, AF_INET
444 g = lambda a: inet_ntop(AF_INET, a)
445
446 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
447 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
448 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
449 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000450
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000451 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
452 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
453 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
454
455 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000456 if not hasattr(socket, 'inet_ntop'):
457 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000458 try:
459 from socket import inet_ntop, AF_INET6, has_ipv6
460 if not has_ipv6:
461 return
462 except ImportError:
463 return
464 f = lambda a: inet_ntop(AF_INET6, a)
465
466 self.assertEquals('::', f('\x00' * 16))
467 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
468 self.assertEquals(
469 'aef:b01:506:1001:ffff:9997:55:170',
470 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
471 )
472
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000473 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000474
Guido van Rossum24e4af82002-06-12 19:18:08 +0000475 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000476 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000477 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000478 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000479 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000480 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
481 # it reasonable to get the host's addr in addition to 0.0.0.0.
482 # At least for eCos. This is required for the S/390 to pass.
483 my_ip_addr = socket.gethostbyname(socket.gethostname())
484 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
485 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000486
487 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000488 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000489 # We know a socket should start without reuse==0
490 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
491 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000492 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000493
494 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000495 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
497 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
498 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000499 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000501 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000502 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000503 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
504 sock.settimeout(1)
505 sock.close()
506 self.assertRaises(socket.error, sock.send, "spam")
507
Georg Brandlbb03ac02006-03-21 18:17:25 +0000508 def testNewAttributes(self):
509 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000510 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000511 self.assertEqual(sock.family, socket.AF_INET)
512 self.assertEqual(sock.type, socket.SOCK_STREAM)
513 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000514 sock.close()
515
Christian Heimesa47b75b2008-01-04 15:48:06 +0000516 def test_sock_ioctl(self):
517 if os.name != "nt":
518 return
519 self.assert_(hasattr(socket.socket, 'ioctl'))
520 self.assert_(hasattr(socket, 'SIO_RCVALL'))
521 self.assert_(hasattr(socket, 'RCVALL_ON'))
522 self.assert_(hasattr(socket, 'RCVALL_OFF'))
523
524
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525class BasicTCPTest(SocketConnectedTest):
526
527 def __init__(self, methodName='runTest'):
528 SocketConnectedTest.__init__(self, methodName=methodName)
529
530 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000531 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000533 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534
535 def _testRecv(self):
536 self.serv_conn.send(MSG)
537
538 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000539 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540 seg1 = self.cli_conn.recv(len(MSG) - 3)
541 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000542 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000543 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000544
545 def _testOverFlowRecv(self):
546 self.serv_conn.send(MSG)
547
548 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000549 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000550 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000551 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552
553 def _testRecvFrom(self):
554 self.serv_conn.send(MSG)
555
556 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000557 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000558 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
559 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000560 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000561 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562
563 def _testOverFlowRecvFrom(self):
564 self.serv_conn.send(MSG)
565
566 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000567 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000568 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000569 while 1:
570 read = self.cli_conn.recv(1024)
571 if not read:
572 break
Guido van Rossume531e292002-08-08 20:28:34 +0000573 msg += read
574 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575
576 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000577 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 self.serv_conn.sendall(big_chunk)
579
580 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000581 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000582 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000583 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 fd = self.cli_conn.fileno()
585 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
586 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000587 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000588
589 def _testFromFd(self):
590 self.serv_conn.send(MSG)
591
592 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000593 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000594 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000595 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000596
597 def _testShutdown(self):
598 self.serv_conn.send(MSG)
599 self.serv_conn.shutdown(2)
600
601class BasicUDPTest(ThreadedUDPSocketTest):
602
603 def __init__(self, methodName='runTest'):
604 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
605
606 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000607 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000608 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000609 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000610
611 def _testSendtoAndRecv(self):
612 self.cli.sendto(MSG, 0, (HOST, PORT))
613
Guido van Rossum1c938012002-06-12 21:17:20 +0000614 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000615 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000617 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000618
Guido van Rossum1c938012002-06-12 21:17:20 +0000619 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000620 self.cli.sendto(MSG, 0, (HOST, PORT))
621
Facundo Batista1fe9f962007-03-28 03:45:20 +0000622 def testRecvFromNegative(self):
623 # Negative lengths passed to recvfrom should give ValueError.
624 self.assertRaises(ValueError, self.serv.recvfrom, -1)
625
626 def _testRecvFromNegative(self):
627 self.cli.sendto(MSG, 0, (HOST, PORT))
628
Martin v. Löwis7596e832006-07-01 15:33:37 +0000629class TCPCloserTest(ThreadedTCPSocketTest):
630
631 def testClose(self):
632 conn, addr = self.serv.accept()
633 conn.close()
634
635 sd = self.cli
636 read, write, err = select.select([sd], [], [], 1.0)
637 self.assertEqual(read, [sd])
638 self.assertEqual(sd.recv(1), '')
639
640 def _testClose(self):
641 self.cli.connect((HOST, PORT))
642 time.sleep(1.0)
643
Dave Cole331708b2004-08-09 04:51:41 +0000644class BasicSocketPairTest(SocketPairTest):
645
646 def __init__(self, methodName='runTest'):
647 SocketPairTest.__init__(self, methodName=methodName)
648
649 def testRecv(self):
650 msg = self.serv.recv(1024)
651 self.assertEqual(msg, MSG)
652
653 def _testRecv(self):
654 self.cli.send(MSG)
655
656 def testSend(self):
657 self.serv.send(MSG)
658
659 def _testSend(self):
660 msg = self.cli.recv(1024)
661 self.assertEqual(msg, MSG)
662
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663class NonBlockingTCPTests(ThreadedTCPSocketTest):
664
665 def __init__(self, methodName='runTest'):
666 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
667
668 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000669 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000670 self.serv.setblocking(0)
671 start = time.time()
672 try:
673 self.serv.accept()
674 except socket.error:
675 pass
676 end = time.time()
677 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
678
679 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000680 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000681
Guido van Rossum24e4af82002-06-12 19:18:08 +0000682 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000683 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000685 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000686 conn, addr = self.serv.accept()
687 except socket.error:
688 pass
689 else:
690 self.fail("Error trying to do non-blocking accept.")
691 read, write, err = select.select([self.serv], [], [])
692 if self.serv in read:
693 conn, addr = self.serv.accept()
694 else:
695 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000696
Guido van Rossum24e4af82002-06-12 19:18:08 +0000697 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000698 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000699 self.cli.connect((HOST, PORT))
700
701 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703 conn, addr = self.serv.accept()
704
705 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000706 self.cli.settimeout(10)
707 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000708
709 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000710 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 conn, addr = self.serv.accept()
712 conn.setblocking(0)
713 try:
714 msg = conn.recv(len(MSG))
715 except socket.error:
716 pass
717 else:
718 self.fail("Error trying to do non-blocking recv.")
719 read, write, err = select.select([conn], [], [])
720 if conn in read:
721 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000722 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000723 else:
724 self.fail("Error during select call to non-blocking socket.")
725
726 def _testRecv(self):
727 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000728 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 self.cli.send(MSG)
730
731class FileObjectClassTestCase(SocketConnectedTest):
732
Guido van Rossume9f66142002-08-07 15:46:19 +0000733 bufsize = -1 # Use default buffer size
734
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735 def __init__(self, methodName='runTest'):
736 SocketConnectedTest.__init__(self, methodName=methodName)
737
738 def setUp(self):
739 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000740 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741
742 def tearDown(self):
743 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000744 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000745 self.serv_file = None
746 SocketConnectedTest.tearDown(self)
747
748 def clientSetUp(self):
749 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000750 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000751
752 def clientTearDown(self):
753 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000754 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 self.cli_file = None
756 SocketConnectedTest.clientTearDown(self)
757
758 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000759 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760 first_seg = self.serv_file.read(len(MSG)-3)
761 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000762 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000763 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764
765 def _testSmallRead(self):
766 self.cli_file.write(MSG)
767 self.cli_file.flush()
768
Guido van Rossum8c943832002-08-08 01:00:28 +0000769 def testFullRead(self):
770 # read until EOF
771 msg = self.serv_file.read()
772 self.assertEqual(msg, MSG)
773
774 def _testFullRead(self):
775 self.cli_file.write(MSG)
776 self.cli_file.close()
777
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000779 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000780 buf = ''
781 while 1:
782 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000783 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000785 buf += char
786 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787
788 def _testUnbufferedRead(self):
789 self.cli_file.write(MSG)
790 self.cli_file.flush()
791
792 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000793 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000795 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000796
797 def _testReadline(self):
798 self.cli_file.write(MSG)
799 self.cli_file.flush()
800
Tim Peters116d83c2004-03-28 02:20:45 +0000801 def testClosedAttr(self):
802 self.assert_(not self.serv_file.closed)
803
804 def _testClosedAttr(self):
805 self.assert_(not self.cli_file.closed)
806
Guido van Rossume9f66142002-08-07 15:46:19 +0000807class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
808
809 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000810
Guido van Rossume9f66142002-08-07 15:46:19 +0000811 In this case (and in this case only), it should be possible to
812 create a file object, read a line from it, create another file
813 object, read another line from it, without loss of data in the
814 first file object's buffer. Note that httplib relies on this
815 when reading multiple requests from the same socket."""
816
817 bufsize = 0 # Use unbuffered mode
818
819 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000820 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000821 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000822 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000823 self.serv_file = self.cli_conn.makefile('rb', 0)
824 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000825 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000826
827 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000828 self.cli_file.write("A. " + MSG)
829 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000830 self.cli_file.flush()
831
Guido van Rossum8c943832002-08-08 01:00:28 +0000832class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
833
834 bufsize = 1 # Default-buffered for reading; line-buffered for writing
835
836
837class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
838
839 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000840
Georg Brandldd7b0522007-01-21 10:35:10 +0000841
Facundo Batista07c78be2007-03-23 18:54:07 +0000842class NetworkConnectionTest(object):
843 """Prove network connection."""
844 def clientSetUp(self):
845 self.cli = socket.create_connection((HOST, PORT))
846 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000847
Facundo Batista07c78be2007-03-23 18:54:07 +0000848class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
849 """Tests that NetworkConnection does not break existing TCP functionality.
850 """
851
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000852class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000853 def testWithoutServer(self):
Facundo Batista07c78be2007-03-23 18:54:07 +0000854 self.failUnlessRaises(socket.error, lambda: socket.create_connection((HOST, PORT)))
855
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000856class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
857
858 def __init__(self, methodName='runTest'):
859 SocketTCPTest.__init__(self, methodName=methodName)
860 ThreadableTest.__init__(self)
861
862 def clientSetUp(self):
863 pass
864
865 def clientTearDown(self):
866 self.cli.close()
867 self.cli = None
868 ThreadableTest.clientTearDown(self)
869
870 def _justAccept(self):
871 conn, addr = self.serv.accept()
872
873 testFamily = _justAccept
874 def _testFamily(self):
875 self.cli = socket.create_connection((HOST, PORT), timeout=30)
876 self.assertEqual(self.cli.family, 2)
877
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000878 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000879 def _testTimeoutDefault(self):
880 self.cli = socket.create_connection((HOST, PORT))
881 self.assertTrue(self.cli.gettimeout() is None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000882
883 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000884 def _testTimeoutValueNamed(self):
885 self.cli = socket.create_connection((HOST, PORT), timeout=30)
886 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000887
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000888 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000889 def _testTimeoutValueNonamed(self):
890 self.cli = socket.create_connection((HOST, PORT), 30)
891 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000892
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000893 testTimeoutNone = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000894 def _testTimeoutNone(self):
Facundo Batista07c78be2007-03-23 18:54:07 +0000895 previous = socket.getdefaulttimeout()
Facundo Batista14553b02007-03-23 20:23:08 +0000896 socket.setdefaulttimeout(30)
897 try:
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000898 self.cli = socket.create_connection((HOST, PORT), timeout=None)
Facundo Batista14553b02007-03-23 20:23:08 +0000899 finally:
900 socket.setdefaulttimeout(previous)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000901 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000902
903
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000904class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
905
906 def __init__(self, methodName='runTest'):
907 SocketTCPTest.__init__(self, methodName=methodName)
908 ThreadableTest.__init__(self)
909
910 def clientSetUp(self):
911 pass
912
913 def clientTearDown(self):
914 self.cli.close()
915 self.cli = None
916 ThreadableTest.clientTearDown(self)
917
Facundo Batista07c78be2007-03-23 18:54:07 +0000918 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000919 conn, addr = self.serv.accept()
920 time.sleep(3)
921 conn.send("done!")
922 testOutsideTimeout = testInsideTimeout
923
924 def _testInsideTimeout(self):
925 self.cli = sock = socket.create_connection((HOST, PORT))
Facundo Batista07c78be2007-03-23 18:54:07 +0000926 data = sock.recv(5)
927 self.assertEqual(data, "done!")
928
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000929 def _testOutsideTimeout(self):
930 self.cli = sock = socket.create_connection((HOST, PORT), timeout=1)
Facundo Batista07c78be2007-03-23 18:54:07 +0000931 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
932
933
Georg Brandldd7b0522007-01-21 10:35:10 +0000934class Urllib2FileobjectTest(unittest.TestCase):
935
936 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
937 # it close the socket if the close c'tor argument is true
938
939 def testClose(self):
940 class MockSocket:
941 closed = False
942 def flush(self): pass
943 def close(self): self.closed = True
944
945 # must not close unless we request it: the original use of _fileobject
946 # by module socket requires that the underlying socket not be closed until
947 # the _socketobject that created the _fileobject is closed
948 s = MockSocket()
949 f = socket._fileobject(s)
950 f.close()
951 self.assert_(not s.closed)
952
953 s = MockSocket()
954 f = socket._fileobject(s, close=True)
955 f.close()
956 self.assert_(s.closed)
957
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000958class TCPTimeoutTest(SocketTCPTest):
959
960 def testTCPTimeout(self):
961 def raise_timeout(*args, **kwargs):
962 self.serv.settimeout(1.0)
963 self.serv.accept()
964 self.failUnlessRaises(socket.timeout, raise_timeout,
965 "Error generating a timeout exception (TCP)")
966
967 def testTimeoutZero(self):
968 ok = False
969 try:
970 self.serv.settimeout(0.0)
971 foo = self.serv.accept()
972 except socket.timeout:
973 self.fail("caught timeout instead of error (TCP)")
974 except socket.error:
975 ok = True
976 except:
977 self.fail("caught unexpected exception (TCP)")
978 if not ok:
979 self.fail("accept() returned success when we did not expect it")
980
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000981 def testInterruptedTimeout(self):
982 # XXX I don't know how to do this test on MSWindows or any other
983 # plaform that doesn't support signal.alarm() or os.kill(), though
984 # the bug should have existed on all platforms.
985 if not hasattr(signal, "alarm"):
986 return # can only test on *nix
987 self.serv.settimeout(5.0) # must be longer than alarm
988 class Alarm(Exception):
989 pass
990 def alarm_handler(signal, frame):
991 raise Alarm
992 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
993 try:
994 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
995 try:
996 foo = self.serv.accept()
997 except socket.timeout:
998 self.fail("caught timeout instead of Alarm")
999 except Alarm:
1000 pass
1001 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001002 self.fail("caught other exception instead of Alarm:"
1003 " %s(%s):\n%s" %
1004 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001005 else:
1006 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001007 finally:
1008 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001009 except Alarm:
1010 self.fail("got Alarm in wrong place")
1011 finally:
1012 # no alarm can be pending. Safe to restore old handler.
1013 signal.signal(signal.SIGALRM, old_alarm)
1014
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001015class UDPTimeoutTest(SocketTCPTest):
1016
1017 def testUDPTimeout(self):
1018 def raise_timeout(*args, **kwargs):
1019 self.serv.settimeout(1.0)
1020 self.serv.recv(1024)
1021 self.failUnlessRaises(socket.timeout, raise_timeout,
1022 "Error generating a timeout exception (UDP)")
1023
1024 def testTimeoutZero(self):
1025 ok = False
1026 try:
1027 self.serv.settimeout(0.0)
1028 foo = self.serv.recv(1024)
1029 except socket.timeout:
1030 self.fail("caught timeout instead of error (UDP)")
1031 except socket.error:
1032 ok = True
1033 except:
1034 self.fail("caught unexpected exception (UDP)")
1035 if not ok:
1036 self.fail("recv() returned success when we did not expect it")
1037
1038class TestExceptions(unittest.TestCase):
1039
1040 def testExceptionTree(self):
1041 self.assert_(issubclass(socket.error, Exception))
1042 self.assert_(issubclass(socket.herror, socket.error))
1043 self.assert_(issubclass(socket.gaierror, socket.error))
1044 self.assert_(issubclass(socket.timeout, socket.error))
1045
Armin Rigoa9017c32006-04-19 11:50:27 +00001046class TestLinuxAbstractNamespace(unittest.TestCase):
1047
1048 UNIX_PATH_MAX = 108
1049
1050 def testLinuxAbstractNamespace(self):
1051 address = "\x00python-test-hello\x00\xff"
1052 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1053 s1.bind(address)
1054 s1.listen(1)
1055 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1056 s2.connect(s1.getsockname())
1057 s1.accept()
1058 self.assertEqual(s1.getsockname(), address)
1059 self.assertEqual(s2.getpeername(), address)
1060
1061 def testMaxName(self):
1062 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1063 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1064 s.bind(address)
1065 self.assertEqual(s.getsockname(), address)
1066
1067 def testNameOverflow(self):
1068 address = "\x00" + "h" * self.UNIX_PATH_MAX
1069 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1070 self.assertRaises(socket.error, s.bind, address)
1071
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001072
Martin Blais2856e5f2006-05-26 12:03:27 +00001073class BufferIOTest(SocketConnectedTest):
1074 """
1075 Test the buffer versions of socket.recv() and socket.send().
1076 """
1077 def __init__(self, methodName='runTest'):
1078 SocketConnectedTest.__init__(self, methodName=methodName)
1079
Martin Blaisaf2ae722006-06-04 13:49:49 +00001080 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001081 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001082 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001083 self.assertEqual(nbytes, len(MSG))
1084 msg = buf.tostring()[:len(MSG)]
1085 self.assertEqual(msg, MSG)
1086
Martin Blaisaf2ae722006-06-04 13:49:49 +00001087 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001088 buf = buffer(MSG)
1089 self.serv_conn.send(buf)
1090
Martin Blaisaf2ae722006-06-04 13:49:49 +00001091 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001092 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001093 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001094 self.assertEqual(nbytes, len(MSG))
1095 msg = buf.tostring()[:len(MSG)]
1096 self.assertEqual(msg, MSG)
1097
Martin Blaisaf2ae722006-06-04 13:49:49 +00001098 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001099 buf = buffer(MSG)
1100 self.serv_conn.send(buf)
1101
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001102
1103TIPC_STYPE = 2000
1104TIPC_LOWER = 200
1105TIPC_UPPER = 210
1106
1107def isTipcAvailable():
1108 """Check if the TIPC module is loaded
1109
1110 The TIPC module is not loaded automatically on Ubuntu and probably
1111 other Linux distros.
1112 """
1113 if not hasattr(socket, "AF_TIPC"):
1114 return False
1115 if not os.path.isfile("/proc/modules"):
1116 return False
1117 with open("/proc/modules") as f:
1118 for line in f:
1119 if line.startswith("tipc "):
1120 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001121 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001122 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1123 return False
1124
1125class TIPCTest (unittest.TestCase):
1126 def testRDM(self):
1127 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1128 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1129
1130 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1131 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1132 TIPC_LOWER, TIPC_UPPER)
1133 srv.bind(srvaddr)
1134
1135 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1136 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1137 cli.sendto(MSG, sendaddr)
1138
1139 msg, recvaddr = srv.recvfrom(1024)
1140
1141 self.assertEqual(cli.getsockname(), recvaddr)
1142 self.assertEqual(msg, MSG)
1143
1144
1145class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1146 def __init__(self, methodName = 'runTest'):
1147 unittest.TestCase.__init__(self, methodName = methodName)
1148 ThreadableTest.__init__(self)
1149
1150 def setUp(self):
1151 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1152 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1153 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1154 TIPC_LOWER, TIPC_UPPER)
1155 self.srv.bind(srvaddr)
1156 self.srv.listen(5)
1157 self.serverExplicitReady()
1158 self.conn, self.connaddr = self.srv.accept()
1159
1160 def clientSetUp(self):
1161 # The is a hittable race between serverExplicitReady() and the
1162 # accept() call; sleep a little while to avoid it, otherwise
1163 # we could get an exception
1164 time.sleep(0.1)
1165 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1166 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1167 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1168 self.cli.connect(addr)
1169 self.cliaddr = self.cli.getsockname()
1170
1171 def testStream(self):
1172 msg = self.conn.recv(1024)
1173 self.assertEqual(msg, MSG)
1174 self.assertEqual(self.cliaddr, self.connaddr)
1175
1176 def _testStream(self):
1177 self.cli.send(MSG)
1178 self.cli.close()
1179
1180
Guido van Rossumb995eb72002-07-31 16:08:40 +00001181def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001182 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001183 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001184 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001185 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001186
1187 tests.extend([
1188 NonBlockingTCPTests,
1189 FileObjectClassTestCase,
1190 UnbufferedFileObjectClassTestCase,
1191 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001192 SmallBufferedFileObjectClassTestCase,
1193 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001194 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001195 NetworkConnectionAttributesTest,
1196 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001197 ])
Dave Cole331708b2004-08-09 04:51:41 +00001198 if hasattr(socket, "socketpair"):
1199 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001200 if sys.platform == 'linux2':
1201 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001202 if isTipcAvailable():
1203 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001204 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001205
1206 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001207 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001208 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001209
1210if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001211 test_main()