blob: a3ee0d46f239f7a90019ec30b90a35fe9eb3b2b2 [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)
Amaury Forgeot d'Arc672fbf52008-03-29 14:53:05 +000036 verbose_write(str(self) + " socket created")
Neal Norwitz909eb122006-06-12 02:13:21 +000037 global PORT
38 PORT = test_support.bind_port(self.serv, HOST, PORT)
Amaury Forgeot d'Arc672fbf52008-03-29 14:53:05 +000039 verbose_write(str(self) + " start listening")
Guido van Rossum24e4af82002-06-12 19:18:08 +000040 self.serv.listen(1)
Amaury Forgeot d'Arc672fbf52008-03-29 14:53:05 +000041 verbose_write(str(self) + " started")
Barry Warsawcf3d4b51997-01-03 20:03:32 +000042
Guido van Rossum24e4af82002-06-12 19:18:08 +000043 def tearDown(self):
Amaury Forgeot d'Arc672fbf52008-03-29 14:53:05 +000044 verbose_write(str(self) + " close")
Guido van Rossum24e4af82002-06-12 19:18:08 +000045 self.serv.close()
46 self.serv = None
Amaury Forgeot d'Arc5e08e8b2008-03-29 13:47:05 +000047 verbose_write(str(self) + " done")
Barry Warsawcf3d4b51997-01-03 20:03:32 +000048
Guido van Rossum24e4af82002-06-12 19:18:08 +000049class SocketUDPTest(unittest.TestCase):
50
51 def setUp(self):
52 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
53 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000054 global PORT
55 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000056
57 def tearDown(self):
58 self.serv.close()
59 self.serv = None
60
61class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000062 """Threadable Test class
63
64 The ThreadableTest class makes it easy to create a threaded
65 client/server pair from an existing unit test. To create a
66 new threaded class from an existing unit test, use multiple
67 inheritance:
68
69 class NewClass (OldClass, ThreadableTest):
70 pass
71
72 This class defines two new fixture functions with obvious
73 purposes for overriding:
74
75 clientSetUp ()
76 clientTearDown ()
77
78 Any new test functions within the class must then define
79 tests in pairs, where the test name is preceeded with a
80 '_' to indicate the client portion of the test. Ex:
81
82 def testFoo(self):
83 # Server portion
84
85 def _testFoo(self):
86 # Client portion
87
88 Any exceptions raised by the clients during their tests
89 are caught and transferred to the main thread to alert
90 the testing framework.
91
92 Note, the server setup function cannot call any blocking
93 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000094 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000095 the blocking call (such as in setting up a client/server
96 connection and performing the accept() in setUp().
97 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000098
99 def __init__(self):
100 # Swap the true setup function
101 self.__setUp = self.setUp
102 self.__tearDown = self.tearDown
103 self.setUp = self._setUp
104 self.tearDown = self._tearDown
105
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000106 def serverExplicitReady(self):
107 """This method allows the server to explicitly indicate that
108 it wants the client thread to proceed. This is useful if the
109 server is about to execute a blocking routine that is
110 dependent upon the client thread during its setup routine."""
111 self.server_ready.set()
112
Guido van Rossum24e4af82002-06-12 19:18:08 +0000113 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000114 self.server_ready = threading.Event()
115 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000116 self.done = threading.Event()
117 self.queue = Queue.Queue(1)
118
119 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000120 methodname = self.id()
121 i = methodname.rfind('.')
122 methodname = methodname[i+1:]
123 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000124 self.client_thread = thread.start_new_thread(
125 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000126
127 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000128 if not self.server_ready.isSet():
129 self.server_ready.set()
130 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000131
132 def _tearDown(self):
133 self.__tearDown()
134 self.done.wait()
135
136 if not self.queue.empty():
137 msg = self.queue.get()
138 self.fail(msg)
139
140 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000141 self.server_ready.wait()
142 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143 self.clientSetUp()
144 if not callable(test_func):
145 raise TypeError, "test_func must be a callable function"
146 try:
147 test_func()
148 except Exception, strerror:
149 self.queue.put(strerror)
150 self.clientTearDown()
151
152 def clientSetUp(self):
153 raise NotImplementedError, "clientSetUp must be implemented."
154
155 def clientTearDown(self):
156 self.done.set()
157 thread.exit()
158
159class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
160
161 def __init__(self, methodName='runTest'):
162 SocketTCPTest.__init__(self, methodName=methodName)
163 ThreadableTest.__init__(self)
164
165 def clientSetUp(self):
166 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
167
168 def clientTearDown(self):
169 self.cli.close()
170 self.cli = None
171 ThreadableTest.clientTearDown(self)
172
173class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
174
175 def __init__(self, methodName='runTest'):
176 SocketUDPTest.__init__(self, methodName=methodName)
177 ThreadableTest.__init__(self)
178
179 def clientSetUp(self):
180 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
181
182class SocketConnectedTest(ThreadedTCPSocketTest):
183
184 def __init__(self, methodName='runTest'):
185 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
186
187 def setUp(self):
188 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000189 # Indicate explicitly we're ready for the client thread to
190 # proceed and then perform the blocking call to accept
191 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000192 conn, addr = self.serv.accept()
193 self.cli_conn = conn
194
195 def tearDown(self):
196 self.cli_conn.close()
197 self.cli_conn = None
198 ThreadedTCPSocketTest.tearDown(self)
199
200 def clientSetUp(self):
201 ThreadedTCPSocketTest.clientSetUp(self)
202 self.cli.connect((HOST, PORT))
203 self.serv_conn = self.cli
204
205 def clientTearDown(self):
206 self.serv_conn.close()
207 self.serv_conn = None
208 ThreadedTCPSocketTest.clientTearDown(self)
209
Dave Cole331708b2004-08-09 04:51:41 +0000210class SocketPairTest(unittest.TestCase, ThreadableTest):
211
212 def __init__(self, methodName='runTest'):
213 unittest.TestCase.__init__(self, methodName=methodName)
214 ThreadableTest.__init__(self)
215
216 def setUp(self):
217 self.serv, self.cli = socket.socketpair()
218
219 def tearDown(self):
220 self.serv.close()
221 self.serv = None
222
223 def clientSetUp(self):
224 pass
225
226 def clientTearDown(self):
227 self.cli.close()
228 self.cli = None
229 ThreadableTest.clientTearDown(self)
230
Tim Peters494aaee2004-08-09 18:54:11 +0000231
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232#######################################################################
233## Begin Tests
234
235class GeneralModuleTests(unittest.TestCase):
236
Raymond Hettinger027bb632004-05-31 03:09:25 +0000237 def test_weakref(self):
238 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
239 p = proxy(s)
240 self.assertEqual(p.fileno(), s.fileno())
241 s.close()
242 s = None
243 try:
244 p.fileno()
245 except ReferenceError:
246 pass
247 else:
248 self.fail('Socket proxy still exists')
249
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000251 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000252 def raise_error(*args, **kwargs):
253 raise socket.error
254 def raise_herror(*args, **kwargs):
255 raise socket.herror
256 def raise_gaierror(*args, **kwargs):
257 raise socket.gaierror
258 self.failUnlessRaises(socket.error, raise_error,
259 "Error raising socket exception.")
260 self.failUnlessRaises(socket.error, raise_herror,
261 "Error raising socket exception.")
262 self.failUnlessRaises(socket.error, raise_gaierror,
263 "Error raising socket exception.")
264
265 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000266 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267 socket.AF_INET
268 socket.SOCK_STREAM
269 socket.SOCK_DGRAM
270 socket.SOCK_RAW
271 socket.SOCK_RDM
272 socket.SOCK_SEQPACKET
273 socket.SOL_SOCKET
274 socket.SO_REUSEADDR
275
Guido van Rossum654c11e2002-06-13 20:24:17 +0000276 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000277 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000278 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000279 try:
280 ip = socket.gethostbyname(hostname)
281 except socket.error:
282 # Probably name lookup wasn't set up right; skip this test
283 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000284 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000285 try:
286 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
287 except socket.error:
288 # Probably a similar problem as above; skip this test
289 return
Brett Cannon01668a12005-03-11 00:04:17 +0000290 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000291 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000292 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000293 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000294
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000295 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000296 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000297 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000298 try:
299 # On some versions, this loses a reference
300 orig = sys.getrefcount(__name__)
301 socket.getnameinfo(__name__,0)
302 except SystemError:
303 if sys.getrefcount(__name__) <> orig:
304 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000305
Guido van Rossum24e4af82002-06-12 19:18:08 +0000306 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000307 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000308 try:
309 # On some versions, this crashes the interpreter.
310 socket.getnameinfo(('x', 0, 0, 0), 0)
311 except socket.error:
312 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000313
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000314 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000315 # This just checks that htons etc. are their own inverse,
316 # when looking at the lower 16 or 32 bits.
317 sizes = {socket.htonl: 32, socket.ntohl: 32,
318 socket.htons: 16, socket.ntohs: 16}
319 for func, size in sizes.items():
320 mask = (1L<<size) - 1
321 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
322 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000323
Guido van Rossuma2627af2002-09-14 00:58:46 +0000324 swapped = func(mask)
325 self.assertEqual(swapped & mask, mask)
326 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000327
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000328 def testNtoHErrors(self):
329 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
330 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
331 for k in good_values:
332 socket.ntohl(k)
333 socket.ntohs(k)
334 socket.htonl(k)
335 socket.htons(k)
336 for k in bad_values:
337 self.assertRaises(OverflowError, socket.ntohl, k)
338 self.assertRaises(OverflowError, socket.ntohs, k)
339 self.assertRaises(OverflowError, socket.htonl, k)
340 self.assertRaises(OverflowError, socket.htons, k)
341
Barry Warsaw11b91a02004-06-28 00:50:43 +0000342 def testGetServBy(self):
343 eq = self.assertEqual
344 # Find one service that exists, then check all the related interfaces.
345 # I've ordered this by protocols that have both a tcp and udp
346 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000347 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000348 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000349 # avoid the 'echo' service on this platform, as there is an
350 # assumption breaking non-standard port/protocol entry
351 services = ('daytime', 'qotd', 'domain')
352 else:
353 services = ('echo', 'daytime', 'domain')
354 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000355 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000356 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000357 break
358 except socket.error:
359 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000360 else:
361 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000362 # Try same call with optional protocol omitted
363 port2 = socket.getservbyname(service)
364 eq(port, port2)
365 # Try udp, but don't barf it it doesn't exist
366 try:
367 udpport = socket.getservbyname(service, 'udp')
368 except socket.error:
369 udpport = None
370 else:
371 eq(udpport, port)
372 # Now make sure the lookup by port returns the same service name
373 eq(socket.getservbyport(port2), service)
374 eq(socket.getservbyport(port, 'tcp'), service)
375 if udpport is not None:
376 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000377
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000378 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000379 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000380 # The default timeout should initially be None
381 self.assertEqual(socket.getdefaulttimeout(), None)
382 s = socket.socket()
383 self.assertEqual(s.gettimeout(), None)
384 s.close()
385
386 # Set the default timeout to 10, and see if it propagates
387 socket.setdefaulttimeout(10)
388 self.assertEqual(socket.getdefaulttimeout(), 10)
389 s = socket.socket()
390 self.assertEqual(s.gettimeout(), 10)
391 s.close()
392
393 # Reset the default timeout to None, and see if it propagates
394 socket.setdefaulttimeout(None)
395 self.assertEqual(socket.getdefaulttimeout(), None)
396 s = socket.socket()
397 self.assertEqual(s.gettimeout(), None)
398 s.close()
399
400 # Check that setting it to an invalid value raises ValueError
401 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
402
403 # Check that setting it to an invalid type raises TypeError
404 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
405
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000406 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000407 if not hasattr(socket, 'inet_pton'):
408 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000409 from socket import inet_aton as f, inet_pton, AF_INET
410 g = lambda a: inet_pton(AF_INET, a)
411
412 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
413 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
414 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
415 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000416 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000417
418 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
419 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
420 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000421 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000422
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000423 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000424 if not hasattr(socket, 'inet_pton'):
425 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000426 try:
427 from socket import inet_pton, AF_INET6, has_ipv6
428 if not has_ipv6:
429 return
430 except ImportError:
431 return
432 f = lambda a: inet_pton(AF_INET6, a)
433
434 self.assertEquals('\x00' * 16, f('::'))
435 self.assertEquals('\x00' * 16, f('0::0'))
436 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
437 self.assertEquals(
438 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
439 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
440 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000441
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000442 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000443 if not hasattr(socket, 'inet_ntop'):
444 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000445 from socket import inet_ntoa as f, inet_ntop, AF_INET
446 g = lambda a: inet_ntop(AF_INET, a)
447
448 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
449 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
450 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
451 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000452
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000453 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
454 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
455 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
456
457 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000458 if not hasattr(socket, 'inet_ntop'):
459 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000460 try:
461 from socket import inet_ntop, AF_INET6, has_ipv6
462 if not has_ipv6:
463 return
464 except ImportError:
465 return
466 f = lambda a: inet_ntop(AF_INET6, a)
467
468 self.assertEquals('::', f('\x00' * 16))
469 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
470 self.assertEquals(
471 'aef:b01:506:1001:ffff:9997:55:170',
472 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
473 )
474
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000475 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000476
Guido van Rossum24e4af82002-06-12 19:18:08 +0000477 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000478 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000479 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000480 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000481 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000482 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
483 # it reasonable to get the host's addr in addition to 0.0.0.0.
484 # At least for eCos. This is required for the S/390 to pass.
485 my_ip_addr = socket.gethostbyname(socket.gethostname())
486 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
487 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488
489 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000490 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000491 # We know a socket should start without reuse==0
492 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
493 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000494 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495
496 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000497 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000498 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
499 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
500 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000501 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000502
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000503 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000504 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000505 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
506 sock.settimeout(1)
507 sock.close()
508 self.assertRaises(socket.error, sock.send, "spam")
509
Georg Brandlbb03ac02006-03-21 18:17:25 +0000510 def testNewAttributes(self):
511 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000512 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000513 self.assertEqual(sock.family, socket.AF_INET)
514 self.assertEqual(sock.type, socket.SOCK_STREAM)
515 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000516 sock.close()
517
Christian Heimesa47b75b2008-01-04 15:48:06 +0000518 def test_sock_ioctl(self):
519 if os.name != "nt":
520 return
521 self.assert_(hasattr(socket.socket, 'ioctl'))
522 self.assert_(hasattr(socket, 'SIO_RCVALL'))
523 self.assert_(hasattr(socket, 'RCVALL_ON'))
524 self.assert_(hasattr(socket, 'RCVALL_OFF'))
525
526
Guido van Rossum24e4af82002-06-12 19:18:08 +0000527class BasicTCPTest(SocketConnectedTest):
528
529 def __init__(self, methodName='runTest'):
530 SocketConnectedTest.__init__(self, methodName=methodName)
531
532 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000533 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000535 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000536
537 def _testRecv(self):
538 self.serv_conn.send(MSG)
539
540 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000541 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000542 seg1 = self.cli_conn.recv(len(MSG) - 3)
543 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000544 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000545 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000546
547 def _testOverFlowRecv(self):
548 self.serv_conn.send(MSG)
549
550 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000551 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000553 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000554
555 def _testRecvFrom(self):
556 self.serv_conn.send(MSG)
557
558 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000559 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
561 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000562 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000563 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000564
565 def _testOverFlowRecvFrom(self):
566 self.serv_conn.send(MSG)
567
568 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000569 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000570 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571 while 1:
572 read = self.cli_conn.recv(1024)
573 if not read:
574 break
Guido van Rossume531e292002-08-08 20:28:34 +0000575 msg += read
576 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000577
578 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000579 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000580 self.serv_conn.sendall(big_chunk)
581
582 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000583 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000584 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000585 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000586 fd = self.cli_conn.fileno()
587 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
588 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000589 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590
591 def _testFromFd(self):
592 self.serv_conn.send(MSG)
593
594 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000595 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000596 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000597 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000598
599 def _testShutdown(self):
600 self.serv_conn.send(MSG)
601 self.serv_conn.shutdown(2)
602
603class BasicUDPTest(ThreadedUDPSocketTest):
604
605 def __init__(self, methodName='runTest'):
606 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
607
608 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000609 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000610 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000611 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000612
613 def _testSendtoAndRecv(self):
614 self.cli.sendto(MSG, 0, (HOST, PORT))
615
Guido van Rossum1c938012002-06-12 21:17:20 +0000616 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000617 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000618 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000619 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000620
Guido van Rossum1c938012002-06-12 21:17:20 +0000621 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622 self.cli.sendto(MSG, 0, (HOST, PORT))
623
Facundo Batista1fe9f962007-03-28 03:45:20 +0000624 def testRecvFromNegative(self):
625 # Negative lengths passed to recvfrom should give ValueError.
626 self.assertRaises(ValueError, self.serv.recvfrom, -1)
627
628 def _testRecvFromNegative(self):
629 self.cli.sendto(MSG, 0, (HOST, PORT))
630
Martin v. Löwis7596e832006-07-01 15:33:37 +0000631class TCPCloserTest(ThreadedTCPSocketTest):
632
633 def testClose(self):
634 conn, addr = self.serv.accept()
635 conn.close()
636
637 sd = self.cli
638 read, write, err = select.select([sd], [], [], 1.0)
639 self.assertEqual(read, [sd])
640 self.assertEqual(sd.recv(1), '')
641
642 def _testClose(self):
643 self.cli.connect((HOST, PORT))
644 time.sleep(1.0)
645
Dave Cole331708b2004-08-09 04:51:41 +0000646class BasicSocketPairTest(SocketPairTest):
647
648 def __init__(self, methodName='runTest'):
649 SocketPairTest.__init__(self, methodName=methodName)
650
651 def testRecv(self):
652 msg = self.serv.recv(1024)
653 self.assertEqual(msg, MSG)
654
655 def _testRecv(self):
656 self.cli.send(MSG)
657
658 def testSend(self):
659 self.serv.send(MSG)
660
661 def _testSend(self):
662 msg = self.cli.recv(1024)
663 self.assertEqual(msg, MSG)
664
Guido van Rossum24e4af82002-06-12 19:18:08 +0000665class NonBlockingTCPTests(ThreadedTCPSocketTest):
666
667 def __init__(self, methodName='runTest'):
668 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
669
670 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000671 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000672 self.serv.setblocking(0)
673 start = time.time()
674 try:
675 self.serv.accept()
676 except socket.error:
677 pass
678 end = time.time()
679 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
680
681 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000682 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000683
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000685 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000686 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000687 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000688 conn, addr = self.serv.accept()
689 except socket.error:
690 pass
691 else:
692 self.fail("Error trying to do non-blocking accept.")
693 read, write, err = select.select([self.serv], [], [])
694 if self.serv in read:
695 conn, addr = self.serv.accept()
696 else:
697 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000698
Guido van Rossum24e4af82002-06-12 19:18:08 +0000699 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000700 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 self.cli.connect((HOST, PORT))
702
703 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000704 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705 conn, addr = self.serv.accept()
706
707 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000708 self.cli.settimeout(10)
709 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710
711 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000712 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000713 conn, addr = self.serv.accept()
714 conn.setblocking(0)
715 try:
716 msg = conn.recv(len(MSG))
717 except socket.error:
718 pass
719 else:
720 self.fail("Error trying to do non-blocking recv.")
721 read, write, err = select.select([conn], [], [])
722 if conn in read:
723 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000724 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000725 else:
726 self.fail("Error during select call to non-blocking socket.")
727
728 def _testRecv(self):
729 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000730 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000731 self.cli.send(MSG)
732
733class FileObjectClassTestCase(SocketConnectedTest):
734
Guido van Rossume9f66142002-08-07 15:46:19 +0000735 bufsize = -1 # Use default buffer size
736
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737 def __init__(self, methodName='runTest'):
738 SocketConnectedTest.__init__(self, methodName=methodName)
739
740 def setUp(self):
741 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000742 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743
744 def tearDown(self):
745 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000746 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747 self.serv_file = None
748 SocketConnectedTest.tearDown(self)
749
750 def clientSetUp(self):
751 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000752 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753
754 def clientTearDown(self):
755 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000756 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757 self.cli_file = None
758 SocketConnectedTest.clientTearDown(self)
759
760 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000761 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762 first_seg = self.serv_file.read(len(MSG)-3)
763 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000764 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000765 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766
767 def _testSmallRead(self):
768 self.cli_file.write(MSG)
769 self.cli_file.flush()
770
Guido van Rossum8c943832002-08-08 01:00:28 +0000771 def testFullRead(self):
772 # read until EOF
773 msg = self.serv_file.read()
774 self.assertEqual(msg, MSG)
775
776 def _testFullRead(self):
777 self.cli_file.write(MSG)
778 self.cli_file.close()
779
Guido van Rossum24e4af82002-06-12 19:18:08 +0000780 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000781 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782 buf = ''
783 while 1:
784 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000785 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 buf += char
788 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000789
790 def _testUnbufferedRead(self):
791 self.cli_file.write(MSG)
792 self.cli_file.flush()
793
794 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000795 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000796 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000797 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798
799 def _testReadline(self):
800 self.cli_file.write(MSG)
801 self.cli_file.flush()
802
Tim Peters116d83c2004-03-28 02:20:45 +0000803 def testClosedAttr(self):
804 self.assert_(not self.serv_file.closed)
805
806 def _testClosedAttr(self):
807 self.assert_(not self.cli_file.closed)
808
Guido van Rossume9f66142002-08-07 15:46:19 +0000809class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
810
811 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000812
Guido van Rossume9f66142002-08-07 15:46:19 +0000813 In this case (and in this case only), it should be possible to
814 create a file object, read a line from it, create another file
815 object, read another line from it, without loss of data in the
816 first file object's buffer. Note that httplib relies on this
817 when reading multiple requests from the same socket."""
818
819 bufsize = 0 # Use unbuffered mode
820
821 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000822 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000823 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000824 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000825 self.serv_file = self.cli_conn.makefile('rb', 0)
826 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000827 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000828
829 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000830 self.cli_file.write("A. " + MSG)
831 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000832 self.cli_file.flush()
833
Guido van Rossum8c943832002-08-08 01:00:28 +0000834class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
835
836 bufsize = 1 # Default-buffered for reading; line-buffered for writing
837
838
839class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
840
841 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000842
Georg Brandldd7b0522007-01-21 10:35:10 +0000843
Facundo Batista07c78be2007-03-23 18:54:07 +0000844class NetworkConnectionTest(object):
845 """Prove network connection."""
846 def clientSetUp(self):
847 self.cli = socket.create_connection((HOST, PORT))
848 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000849
Facundo Batista07c78be2007-03-23 18:54:07 +0000850class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
851 """Tests that NetworkConnection does not break existing TCP functionality.
852 """
853
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000854class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000855 def testWithoutServer(self):
Facundo Batista07c78be2007-03-23 18:54:07 +0000856 self.failUnlessRaises(socket.error, lambda: socket.create_connection((HOST, PORT)))
857
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000858class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
859
860 def __init__(self, methodName='runTest'):
861 SocketTCPTest.__init__(self, methodName=methodName)
862 ThreadableTest.__init__(self)
863
864 def clientSetUp(self):
865 pass
866
867 def clientTearDown(self):
868 self.cli.close()
869 self.cli = None
870 ThreadableTest.clientTearDown(self)
871
872 def _justAccept(self):
873 conn, addr = self.serv.accept()
874
875 testFamily = _justAccept
876 def _testFamily(self):
877 self.cli = socket.create_connection((HOST, PORT), timeout=30)
878 self.assertEqual(self.cli.family, 2)
879
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000880 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000881 def _testTimeoutDefault(self):
882 self.cli = socket.create_connection((HOST, PORT))
883 self.assertTrue(self.cli.gettimeout() is None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000884
885 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000886 def _testTimeoutValueNamed(self):
887 self.cli = socket.create_connection((HOST, PORT), timeout=30)
888 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000889
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000890 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000891 def _testTimeoutValueNonamed(self):
892 self.cli = socket.create_connection((HOST, PORT), 30)
893 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000894
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000895 testTimeoutNone = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000896 def _testTimeoutNone(self):
Facundo Batista07c78be2007-03-23 18:54:07 +0000897 previous = socket.getdefaulttimeout()
Facundo Batista14553b02007-03-23 20:23:08 +0000898 socket.setdefaulttimeout(30)
899 try:
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000900 self.cli = socket.create_connection((HOST, PORT), timeout=None)
Facundo Batista14553b02007-03-23 20:23:08 +0000901 finally:
902 socket.setdefaulttimeout(previous)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000903 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000904
905
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000906class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
907
908 def __init__(self, methodName='runTest'):
909 SocketTCPTest.__init__(self, methodName=methodName)
910 ThreadableTest.__init__(self)
911
912 def clientSetUp(self):
913 pass
914
915 def clientTearDown(self):
916 self.cli.close()
917 self.cli = None
918 ThreadableTest.clientTearDown(self)
919
Facundo Batista07c78be2007-03-23 18:54:07 +0000920 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000921 conn, addr = self.serv.accept()
922 time.sleep(3)
923 conn.send("done!")
924 testOutsideTimeout = testInsideTimeout
925
926 def _testInsideTimeout(self):
927 self.cli = sock = socket.create_connection((HOST, PORT))
Facundo Batista07c78be2007-03-23 18:54:07 +0000928 data = sock.recv(5)
929 self.assertEqual(data, "done!")
930
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000931 def _testOutsideTimeout(self):
932 self.cli = sock = socket.create_connection((HOST, PORT), timeout=1)
Facundo Batista07c78be2007-03-23 18:54:07 +0000933 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
934
935
Georg Brandldd7b0522007-01-21 10:35:10 +0000936class Urllib2FileobjectTest(unittest.TestCase):
937
938 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
939 # it close the socket if the close c'tor argument is true
940
941 def testClose(self):
942 class MockSocket:
943 closed = False
944 def flush(self): pass
945 def close(self): self.closed = True
946
947 # must not close unless we request it: the original use of _fileobject
948 # by module socket requires that the underlying socket not be closed until
949 # the _socketobject that created the _fileobject is closed
950 s = MockSocket()
951 f = socket._fileobject(s)
952 f.close()
953 self.assert_(not s.closed)
954
955 s = MockSocket()
956 f = socket._fileobject(s, close=True)
957 f.close()
958 self.assert_(s.closed)
959
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000960class TCPTimeoutTest(SocketTCPTest):
961
962 def testTCPTimeout(self):
963 def raise_timeout(*args, **kwargs):
964 self.serv.settimeout(1.0)
965 self.serv.accept()
966 self.failUnlessRaises(socket.timeout, raise_timeout,
967 "Error generating a timeout exception (TCP)")
968
969 def testTimeoutZero(self):
970 ok = False
971 try:
972 self.serv.settimeout(0.0)
973 foo = self.serv.accept()
974 except socket.timeout:
975 self.fail("caught timeout instead of error (TCP)")
976 except socket.error:
977 ok = True
978 except:
979 self.fail("caught unexpected exception (TCP)")
980 if not ok:
981 self.fail("accept() returned success when we did not expect it")
982
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000983 def testInterruptedTimeout(self):
984 # XXX I don't know how to do this test on MSWindows or any other
985 # plaform that doesn't support signal.alarm() or os.kill(), though
986 # the bug should have existed on all platforms.
987 if not hasattr(signal, "alarm"):
988 return # can only test on *nix
989 self.serv.settimeout(5.0) # must be longer than alarm
990 class Alarm(Exception):
991 pass
992 def alarm_handler(signal, frame):
993 raise Alarm
994 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
995 try:
996 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
997 try:
998 foo = self.serv.accept()
999 except socket.timeout:
1000 self.fail("caught timeout instead of Alarm")
1001 except Alarm:
1002 pass
1003 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001004 self.fail("caught other exception instead of Alarm:"
1005 " %s(%s):\n%s" %
1006 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001007 else:
1008 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001009 finally:
1010 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001011 except Alarm:
1012 self.fail("got Alarm in wrong place")
1013 finally:
1014 # no alarm can be pending. Safe to restore old handler.
1015 signal.signal(signal.SIGALRM, old_alarm)
1016
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001017class UDPTimeoutTest(SocketTCPTest):
1018
1019 def testUDPTimeout(self):
1020 def raise_timeout(*args, **kwargs):
1021 self.serv.settimeout(1.0)
1022 self.serv.recv(1024)
1023 self.failUnlessRaises(socket.timeout, raise_timeout,
1024 "Error generating a timeout exception (UDP)")
1025
1026 def testTimeoutZero(self):
1027 ok = False
1028 try:
1029 self.serv.settimeout(0.0)
1030 foo = self.serv.recv(1024)
1031 except socket.timeout:
1032 self.fail("caught timeout instead of error (UDP)")
1033 except socket.error:
1034 ok = True
1035 except:
1036 self.fail("caught unexpected exception (UDP)")
1037 if not ok:
1038 self.fail("recv() returned success when we did not expect it")
1039
1040class TestExceptions(unittest.TestCase):
1041
1042 def testExceptionTree(self):
1043 self.assert_(issubclass(socket.error, Exception))
1044 self.assert_(issubclass(socket.herror, socket.error))
1045 self.assert_(issubclass(socket.gaierror, socket.error))
1046 self.assert_(issubclass(socket.timeout, socket.error))
1047
Armin Rigoa9017c32006-04-19 11:50:27 +00001048class TestLinuxAbstractNamespace(unittest.TestCase):
1049
1050 UNIX_PATH_MAX = 108
1051
1052 def testLinuxAbstractNamespace(self):
1053 address = "\x00python-test-hello\x00\xff"
1054 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1055 s1.bind(address)
1056 s1.listen(1)
1057 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1058 s2.connect(s1.getsockname())
1059 s1.accept()
1060 self.assertEqual(s1.getsockname(), address)
1061 self.assertEqual(s2.getpeername(), address)
1062
1063 def testMaxName(self):
1064 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1065 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1066 s.bind(address)
1067 self.assertEqual(s.getsockname(), address)
1068
1069 def testNameOverflow(self):
1070 address = "\x00" + "h" * self.UNIX_PATH_MAX
1071 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1072 self.assertRaises(socket.error, s.bind, address)
1073
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001074
Martin Blais2856e5f2006-05-26 12:03:27 +00001075class BufferIOTest(SocketConnectedTest):
1076 """
1077 Test the buffer versions of socket.recv() and socket.send().
1078 """
1079 def __init__(self, methodName='runTest'):
1080 SocketConnectedTest.__init__(self, methodName=methodName)
1081
Martin Blaisaf2ae722006-06-04 13:49:49 +00001082 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001083 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001084 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001085 self.assertEqual(nbytes, len(MSG))
1086 msg = buf.tostring()[:len(MSG)]
1087 self.assertEqual(msg, MSG)
1088
Martin Blaisaf2ae722006-06-04 13:49:49 +00001089 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001090 buf = buffer(MSG)
1091 self.serv_conn.send(buf)
1092
Martin Blaisaf2ae722006-06-04 13:49:49 +00001093 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001094 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001095 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001096 self.assertEqual(nbytes, len(MSG))
1097 msg = buf.tostring()[:len(MSG)]
1098 self.assertEqual(msg, MSG)
1099
Martin Blaisaf2ae722006-06-04 13:49:49 +00001100 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001101 buf = buffer(MSG)
1102 self.serv_conn.send(buf)
1103
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001104
1105TIPC_STYPE = 2000
1106TIPC_LOWER = 200
1107TIPC_UPPER = 210
1108
1109def isTipcAvailable():
1110 """Check if the TIPC module is loaded
1111
1112 The TIPC module is not loaded automatically on Ubuntu and probably
1113 other Linux distros.
1114 """
1115 if not hasattr(socket, "AF_TIPC"):
1116 return False
1117 if not os.path.isfile("/proc/modules"):
1118 return False
1119 with open("/proc/modules") as f:
1120 for line in f:
1121 if line.startswith("tipc "):
1122 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001123 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001124 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1125 return False
1126
1127class TIPCTest (unittest.TestCase):
1128 def testRDM(self):
1129 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1130 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1131
1132 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1133 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1134 TIPC_LOWER, TIPC_UPPER)
1135 srv.bind(srvaddr)
1136
1137 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1138 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1139 cli.sendto(MSG, sendaddr)
1140
1141 msg, recvaddr = srv.recvfrom(1024)
1142
1143 self.assertEqual(cli.getsockname(), recvaddr)
1144 self.assertEqual(msg, MSG)
1145
1146
1147class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1148 def __init__(self, methodName = 'runTest'):
1149 unittest.TestCase.__init__(self, methodName = methodName)
1150 ThreadableTest.__init__(self)
1151
1152 def setUp(self):
1153 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1154 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1155 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1156 TIPC_LOWER, TIPC_UPPER)
1157 self.srv.bind(srvaddr)
1158 self.srv.listen(5)
1159 self.serverExplicitReady()
1160 self.conn, self.connaddr = self.srv.accept()
1161
1162 def clientSetUp(self):
1163 # The is a hittable race between serverExplicitReady() and the
1164 # accept() call; sleep a little while to avoid it, otherwise
1165 # we could get an exception
1166 time.sleep(0.1)
1167 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1168 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1169 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1170 self.cli.connect(addr)
1171 self.cliaddr = self.cli.getsockname()
1172
1173 def testStream(self):
1174 msg = self.conn.recv(1024)
1175 self.assertEqual(msg, MSG)
1176 self.assertEqual(self.cliaddr, self.connaddr)
1177
1178 def _testStream(self):
1179 self.cli.send(MSG)
1180 self.cli.close()
1181
1182
Guido van Rossumb995eb72002-07-31 16:08:40 +00001183def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001184 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001185 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001186 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001187 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001188
1189 tests.extend([
1190 NonBlockingTCPTests,
1191 FileObjectClassTestCase,
1192 UnbufferedFileObjectClassTestCase,
1193 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001194 SmallBufferedFileObjectClassTestCase,
1195 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001196 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001197 NetworkConnectionAttributesTest,
1198 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001199 ])
Dave Cole331708b2004-08-09 04:51:41 +00001200 if hasattr(socket, "socketpair"):
1201 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001202 if sys.platform == 'linux2':
1203 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001204 if isTipcAvailable():
1205 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001206 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001207
1208 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001209 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001210 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001211
1212if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001213 test_main()