blob: 6e7218034d9c38813613cc3291e16fe5fea40687 [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
Trent Nelsone41b0062008-04-08 23:47:30 +00006import errno
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +02009import _testcapi
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +000010import time
11import traceback
Georg Brandla6168f92008-05-25 07:20:14 +000012import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000014import os
Martin Blais2856e5f2006-05-26 12:03:27 +000015import array
Antoine Pitrouc818ed42010-09-07 21:40:25 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000018import signal
Antoine Pitrou66b5df62010-09-27 18:16:46 +000019import math
Barry Warsawcf3d4b51997-01-03 20:03:32 +000020
Giampaolo Rodolà633e4742010-08-14 17:04:46 +000021def try_address(host, port=0, family=socket.AF_INET):
22 """Try to bind a socket on the given host:port and return True
23 if that has been possible."""
24 try:
25 sock = socket.socket(family, socket.SOCK_STREAM)
26 sock.bind((host, port))
27 except (socket.error, socket.gaierror):
28 return False
29 else:
30 sock.close()
31 return True
32
33HOST = test_support.HOST
34MSG = b'Michael Gilfix was here\n'
35SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
36
Victor Stinner6a102812010-04-27 23:55:59 +000037try:
38 import thread
39 import threading
40except ImportError:
41 thread = None
42 threading = None
43
Trent Nelsone41b0062008-04-08 23:47:30 +000044HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000045MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000046
Guido van Rossum24e4af82002-06-12 19:18:08 +000047class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000048
Guido van Rossum24e4af82002-06-12 19:18:08 +000049 def setUp(self):
50 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000051 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000052 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000053
Guido van Rossum24e4af82002-06-12 19:18:08 +000054 def tearDown(self):
55 self.serv.close()
56 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000057
Guido van Rossum24e4af82002-06-12 19:18:08 +000058class SocketUDPTest(unittest.TestCase):
59
60 def setUp(self):
61 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000062 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000063
64 def tearDown(self):
65 self.serv.close()
66 self.serv = None
67
68class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000069 """Threadable Test class
70
71 The ThreadableTest class makes it easy to create a threaded
72 client/server pair from an existing unit test. To create a
73 new threaded class from an existing unit test, use multiple
74 inheritance:
75
76 class NewClass (OldClass, ThreadableTest):
77 pass
78
79 This class defines two new fixture functions with obvious
80 purposes for overriding:
81
82 clientSetUp ()
83 clientTearDown ()
84
85 Any new test functions within the class must then define
86 tests in pairs, where the test name is preceeded with a
87 '_' to indicate the client portion of the test. Ex:
88
89 def testFoo(self):
90 # Server portion
91
92 def _testFoo(self):
93 # Client portion
94
95 Any exceptions raised by the clients during their tests
96 are caught and transferred to the main thread to alert
97 the testing framework.
98
99 Note, the server setup function cannot call any blocking
100 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +0000101 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000102 the blocking call (such as in setting up a client/server
103 connection and performing the accept() in setUp().
104 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000105
106 def __init__(self):
107 # Swap the true setup function
108 self.__setUp = self.setUp
109 self.__tearDown = self.tearDown
110 self.setUp = self._setUp
111 self.tearDown = self._tearDown
112
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000113 def serverExplicitReady(self):
114 """This method allows the server to explicitly indicate that
115 it wants the client thread to proceed. This is useful if the
116 server is about to execute a blocking routine that is
117 dependent upon the client thread during its setup routine."""
118 self.server_ready.set()
119
Guido van Rossum24e4af82002-06-12 19:18:08 +0000120 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000121 self.server_ready = threading.Event()
122 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +0000124 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000125
126 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000127 methodname = self.id()
128 i = methodname.rfind('.')
129 methodname = methodname[i+1:]
130 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000131 self.client_thread = thread.start_new_thread(
132 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133
134 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000135 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000136 self.server_ready.set()
137 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000138
139 def _tearDown(self):
140 self.__tearDown()
141 self.done.wait()
142
143 if not self.queue.empty():
144 msg = self.queue.get()
145 self.fail(msg)
146
147 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000148 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149 self.clientSetUp()
Charles-François Natali21565942011-09-21 22:02:27 +0200150 self.client_ready.set()
Ezio Melottib22c3fe2011-11-06 17:50:52 +0200151 if not callable(test_func):
152 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000153 try:
154 test_func()
155 except Exception, strerror:
156 self.queue.put(strerror)
157 self.clientTearDown()
158
159 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000160 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000161
162 def clientTearDown(self):
163 self.done.set()
164 thread.exit()
165
166class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
167
168 def __init__(self, methodName='runTest'):
169 SocketTCPTest.__init__(self, methodName=methodName)
170 ThreadableTest.__init__(self)
171
172 def clientSetUp(self):
173 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
174
175 def clientTearDown(self):
176 self.cli.close()
177 self.cli = None
178 ThreadableTest.clientTearDown(self)
179
180class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
181
182 def __init__(self, methodName='runTest'):
183 SocketUDPTest.__init__(self, methodName=methodName)
184 ThreadableTest.__init__(self)
185
186 def clientSetUp(self):
187 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
188
Brian Curtindd8564f2010-11-04 03:54:23 +0000189 def clientTearDown(self):
190 self.cli.close()
191 self.cli = None
192 ThreadableTest.clientTearDown(self)
193
Guido van Rossum24e4af82002-06-12 19:18:08 +0000194class SocketConnectedTest(ThreadedTCPSocketTest):
195
196 def __init__(self, methodName='runTest'):
197 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
198
199 def setUp(self):
200 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000201 # Indicate explicitly we're ready for the client thread to
202 # proceed and then perform the blocking call to accept
203 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000204 conn, addr = self.serv.accept()
205 self.cli_conn = conn
206
207 def tearDown(self):
208 self.cli_conn.close()
209 self.cli_conn = None
210 ThreadedTCPSocketTest.tearDown(self)
211
212 def clientSetUp(self):
213 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000214 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215 self.serv_conn = self.cli
216
217 def clientTearDown(self):
218 self.serv_conn.close()
219 self.serv_conn = None
220 ThreadedTCPSocketTest.clientTearDown(self)
221
Dave Cole331708b2004-08-09 04:51:41 +0000222class SocketPairTest(unittest.TestCase, ThreadableTest):
223
224 def __init__(self, methodName='runTest'):
225 unittest.TestCase.__init__(self, methodName=methodName)
226 ThreadableTest.__init__(self)
227
228 def setUp(self):
229 self.serv, self.cli = socket.socketpair()
230
231 def tearDown(self):
232 self.serv.close()
233 self.serv = None
234
235 def clientSetUp(self):
236 pass
237
238 def clientTearDown(self):
239 self.cli.close()
240 self.cli = None
241 ThreadableTest.clientTearDown(self)
242
Tim Peters494aaee2004-08-09 18:54:11 +0000243
Guido van Rossum24e4af82002-06-12 19:18:08 +0000244#######################################################################
245## Begin Tests
246
247class GeneralModuleTests(unittest.TestCase):
248
Raymond Hettinger027bb632004-05-31 03:09:25 +0000249 def test_weakref(self):
250 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
251 p = proxy(s)
252 self.assertEqual(p.fileno(), s.fileno())
253 s.close()
254 s = None
255 try:
256 p.fileno()
257 except ReferenceError:
258 pass
259 else:
260 self.fail('Socket proxy still exists')
261
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000263 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 def raise_error(*args, **kwargs):
265 raise socket.error
266 def raise_herror(*args, **kwargs):
267 raise socket.herror
268 def raise_gaierror(*args, **kwargs):
269 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000270 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000272 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000274 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 "Error raising socket exception.")
276
Ezio Melotti0639be62011-05-07 19:21:22 +0300277 def testSendtoErrors(self):
278 # Testing that sendto doens't masks failures. See #10169.
279 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
280 self.addCleanup(s.close)
281 s.bind(('', 0))
282 sockname = s.getsockname()
283 # 2 args
284 with self.assertRaises(UnicodeEncodeError):
285 s.sendto(u'\u2620', sockname)
286 with self.assertRaises(TypeError) as cm:
287 s.sendto(5j, sockname)
288 self.assertIn('not complex', str(cm.exception))
289 with self.assertRaises(TypeError) as cm:
290 s.sendto('foo', None)
291 self.assertIn('not NoneType', str(cm.exception))
292 # 3 args
293 with self.assertRaises(UnicodeEncodeError):
294 s.sendto(u'\u2620', 0, sockname)
295 with self.assertRaises(TypeError) as cm:
296 s.sendto(5j, 0, sockname)
297 self.assertIn('not complex', str(cm.exception))
298 with self.assertRaises(TypeError) as cm:
299 s.sendto('foo', 0, None)
300 self.assertIn('not NoneType', str(cm.exception))
301 with self.assertRaises(TypeError) as cm:
302 s.sendto('foo', 'bar', sockname)
303 self.assertIn('an integer is required', str(cm.exception))
304 with self.assertRaises(TypeError) as cm:
305 s.sendto('foo', None, None)
306 self.assertIn('an integer is required', str(cm.exception))
307 # wrong number of args
308 with self.assertRaises(TypeError) as cm:
309 s.sendto('foo')
310 self.assertIn('(1 given)', str(cm.exception))
311 with self.assertRaises(TypeError) as cm:
312 s.sendto('foo', 0, sockname, 4)
313 self.assertIn('(4 given)', str(cm.exception))
314
315
Guido van Rossum24e4af82002-06-12 19:18:08 +0000316 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000317 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318 socket.AF_INET
319 socket.SOCK_STREAM
320 socket.SOCK_DGRAM
321 socket.SOCK_RAW
322 socket.SOCK_RDM
323 socket.SOCK_SEQPACKET
324 socket.SOL_SOCKET
325 socket.SO_REUSEADDR
326
Guido van Rossum654c11e2002-06-13 20:24:17 +0000327 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000328 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000329 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000330 try:
331 ip = socket.gethostbyname(hostname)
332 except socket.error:
333 # Probably name lookup wasn't set up right; skip this test
334 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000335 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000336 try:
337 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
338 except socket.error:
339 # Probably a similar problem as above; skip this test
340 return
Brett Cannon01668a12005-03-11 00:04:17 +0000341 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000342 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000343 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000344 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000345
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000346 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000347 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000348 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000349 try:
350 # On some versions, this loses a reference
351 orig = sys.getrefcount(__name__)
352 socket.getnameinfo(__name__,0)
Georg Brandlab849892009-09-19 07:35:07 +0000353 except TypeError:
Florent Xicluna07627882010-03-21 01:14:24 +0000354 self.assertEqual(sys.getrefcount(__name__), orig,
355 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000356
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000358 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000359 try:
360 # On some versions, this crashes the interpreter.
361 socket.getnameinfo(('x', 0, 0, 0), 0)
362 except socket.error:
363 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000364
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000365 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000366 # This just checks that htons etc. are their own inverse,
367 # when looking at the lower 16 or 32 bits.
368 sizes = {socket.htonl: 32, socket.ntohl: 32,
369 socket.htons: 16, socket.ntohs: 16}
370 for func, size in sizes.items():
371 mask = (1L<<size) - 1
372 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
373 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000374
Guido van Rossuma2627af2002-09-14 00:58:46 +0000375 swapped = func(mask)
376 self.assertEqual(swapped & mask, mask)
377 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000378
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000379 def testNtoHErrors(self):
380 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
381 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
382 for k in good_values:
383 socket.ntohl(k)
384 socket.ntohs(k)
385 socket.htonl(k)
386 socket.htons(k)
387 for k in bad_values:
388 self.assertRaises(OverflowError, socket.ntohl, k)
389 self.assertRaises(OverflowError, socket.ntohs, k)
390 self.assertRaises(OverflowError, socket.htonl, k)
391 self.assertRaises(OverflowError, socket.htons, k)
392
Barry Warsaw11b91a02004-06-28 00:50:43 +0000393 def testGetServBy(self):
394 eq = self.assertEqual
395 # Find one service that exists, then check all the related interfaces.
396 # I've ordered this by protocols that have both a tcp and udp
397 # protocol, at least for modern Linuxes.
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000398 if (sys.platform.startswith('linux') or
399 sys.platform.startswith('freebsd') or
400 sys.platform.startswith('netbsd') or
401 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000402 # avoid the 'echo' service on this platform, as there is an
403 # assumption breaking non-standard port/protocol entry
404 services = ('daytime', 'qotd', 'domain')
405 else:
406 services = ('echo', 'daytime', 'domain')
407 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000408 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000409 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000410 break
411 except socket.error:
412 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000413 else:
414 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000415 # Try same call with optional protocol omitted
416 port2 = socket.getservbyname(service)
417 eq(port, port2)
Terry Jan Reedya70f60a2013-03-11 17:56:17 -0400418 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000419 try:
420 udpport = socket.getservbyname(service, 'udp')
421 except socket.error:
422 udpport = None
423 else:
424 eq(udpport, port)
425 # Now make sure the lookup by port returns the same service name
426 eq(socket.getservbyport(port2), service)
427 eq(socket.getservbyport(port, 'tcp'), service)
428 if udpport is not None:
429 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000430 # Make sure getservbyport does not accept out of range ports.
431 self.assertRaises(OverflowError, socket.getservbyport, -1)
432 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000433
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000434 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000435 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000436 # The default timeout should initially be None
437 self.assertEqual(socket.getdefaulttimeout(), None)
438 s = socket.socket()
439 self.assertEqual(s.gettimeout(), None)
440 s.close()
441
442 # Set the default timeout to 10, and see if it propagates
443 socket.setdefaulttimeout(10)
444 self.assertEqual(socket.getdefaulttimeout(), 10)
445 s = socket.socket()
446 self.assertEqual(s.gettimeout(), 10)
447 s.close()
448
449 # Reset the default timeout to None, and see if it propagates
450 socket.setdefaulttimeout(None)
451 self.assertEqual(socket.getdefaulttimeout(), None)
452 s = socket.socket()
453 self.assertEqual(s.gettimeout(), None)
454 s.close()
455
456 # Check that setting it to an invalid value raises ValueError
457 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
458
459 # Check that setting it to an invalid type raises TypeError
460 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
461
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000462 def testIPv4_inet_aton_fourbytes(self):
463 if not hasattr(socket, 'inet_aton'):
464 return # No inet_aton, nothing to check
465 # Test that issue1008086 and issue767150 are fixed.
466 # It must return 4 bytes.
Ezio Melotti2623a372010-11-21 13:34:58 +0000467 self.assertEqual('\x00'*4, socket.inet_aton('0.0.0.0'))
468 self.assertEqual('\xff'*4, socket.inet_aton('255.255.255.255'))
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000469
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000470 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000471 if not hasattr(socket, 'inet_pton'):
472 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000473 from socket import inet_aton as f, inet_pton, AF_INET
474 g = lambda a: inet_pton(AF_INET, a)
475
Ezio Melotti2623a372010-11-21 13:34:58 +0000476 self.assertEqual('\x00\x00\x00\x00', f('0.0.0.0'))
477 self.assertEqual('\xff\x00\xff\x00', f('255.0.255.0'))
478 self.assertEqual('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
479 self.assertEqual('\x01\x02\x03\x04', f('1.2.3.4'))
480 self.assertEqual('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000481
Ezio Melotti2623a372010-11-21 13:34:58 +0000482 self.assertEqual('\x00\x00\x00\x00', g('0.0.0.0'))
483 self.assertEqual('\xff\x00\xff\x00', g('255.0.255.0'))
484 self.assertEqual('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
485 self.assertEqual('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000486
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000487 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000488 if not hasattr(socket, 'inet_pton'):
489 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000490 try:
491 from socket import inet_pton, AF_INET6, has_ipv6
492 if not has_ipv6:
493 return
494 except ImportError:
495 return
496 f = lambda a: inet_pton(AF_INET6, a)
497
Ezio Melotti2623a372010-11-21 13:34:58 +0000498 self.assertEqual('\x00' * 16, f('::'))
499 self.assertEqual('\x00' * 16, f('0::0'))
500 self.assertEqual('\x00\x01' + '\x00' * 14, f('1::'))
501 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000502 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
503 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
504 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000505
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000506 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000507 if not hasattr(socket, 'inet_ntop'):
508 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000509 from socket import inet_ntoa as f, inet_ntop, AF_INET
510 g = lambda a: inet_ntop(AF_INET, a)
511
Ezio Melotti2623a372010-11-21 13:34:58 +0000512 self.assertEqual('1.0.1.0', f('\x01\x00\x01\x00'))
513 self.assertEqual('170.85.170.85', f('\xaa\x55\xaa\x55'))
514 self.assertEqual('255.255.255.255', f('\xff\xff\xff\xff'))
515 self.assertEqual('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000516
Ezio Melotti2623a372010-11-21 13:34:58 +0000517 self.assertEqual('1.0.1.0', g('\x01\x00\x01\x00'))
518 self.assertEqual('170.85.170.85', g('\xaa\x55\xaa\x55'))
519 self.assertEqual('255.255.255.255', g('\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000520
521 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000522 if not hasattr(socket, 'inet_ntop'):
523 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000524 try:
525 from socket import inet_ntop, AF_INET6, has_ipv6
526 if not has_ipv6:
527 return
528 except ImportError:
529 return
530 f = lambda a: inet_ntop(AF_INET6, a)
531
Ezio Melotti2623a372010-11-21 13:34:58 +0000532 self.assertEqual('::', f('\x00' * 16))
533 self.assertEqual('::1', f('\x00' * 15 + '\x01'))
534 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000535 'aef:b01:506:1001:ffff:9997:55:170',
536 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
537 )
538
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000539 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000540
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000541 def _get_unused_port(self, bind_address='0.0.0.0'):
542 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000543
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000544 Args:
545 bind_address: Hostname or IP address to search for a port on.
546
547 Returns: A most likely to be unused port.
548 """
549 tempsock = socket.socket()
550 tempsock.bind((bind_address, 0))
551 host, port = tempsock.getsockname()
552 tempsock.close()
553 return port
554
555 def testSockName(self):
556 # Testing getsockname()
557 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000558 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000559 self.addCleanup(sock.close)
Trent Nelsone41b0062008-04-08 23:47:30 +0000560 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000561 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000562 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
563 # it reasonable to get the host's addr in addition to 0.0.0.0.
564 # At least for eCos. This is required for the S/390 to pass.
Georg Brandlb7276502010-11-26 08:28:05 +0000565 try:
566 my_ip_addr = socket.gethostbyname(socket.gethostname())
567 except socket.error:
568 # Probably name lookup wasn't set up right; skip this test
569 return
Ezio Melottiaa980582010-01-23 23:04:36 +0000570 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000571 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572
573 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000574 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575 # We know a socket should start without reuse==0
576 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000577 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000579 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000580
581 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000582 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000583 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000584 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000585 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
586 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000587 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000588
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000589 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000590 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000591 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
592 sock.settimeout(1)
593 sock.close()
594 self.assertRaises(socket.error, sock.send, "spam")
595
Georg Brandlbb03ac02006-03-21 18:17:25 +0000596 def testNewAttributes(self):
597 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000598 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000599 self.assertEqual(sock.family, socket.AF_INET)
600 self.assertEqual(sock.type, socket.SOCK_STREAM)
601 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000602 sock.close()
603
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000604 def test_getsockaddrarg(self):
605 host = '0.0.0.0'
606 port = self._get_unused_port(bind_address=host)
607 big_port = port + 65536
608 neg_port = port - 65536
609 sock = socket.socket()
610 try:
611 self.assertRaises(OverflowError, sock.bind, (host, big_port))
612 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
613 sock.bind((host, port))
614 finally:
615 sock.close()
616
Brian Curtin91a5b812010-11-05 15:52:20 +0000617 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesa47b75b2008-01-04 15:48:06 +0000618 def test_sock_ioctl(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000619 self.assertTrue(hasattr(socket.socket, 'ioctl'))
620 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
621 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
622 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000623 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
624 s = socket.socket()
Brian Curtin91a5b812010-11-05 15:52:20 +0000625 self.addCleanup(s.close)
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000626 self.assertRaises(ValueError, s.ioctl, -1, None)
627 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000628
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000629 def testGetaddrinfo(self):
630 try:
631 socket.getaddrinfo('localhost', 80)
632 except socket.gaierror as err:
633 if err.errno == socket.EAI_SERVICE:
634 # see http://bugs.python.org/issue1282647
635 self.skipTest("buggy libc version")
636 raise
637 # len of every sequence is supposed to be == 5
638 for info in socket.getaddrinfo(HOST, None):
639 self.assertEqual(len(info), 5)
640 # host can be a domain name, a string representation of an
641 # IPv4/v6 address or None
642 socket.getaddrinfo('localhost', 80)
643 socket.getaddrinfo('127.0.0.1', 80)
644 socket.getaddrinfo(None, 80)
645 if SUPPORTS_IPV6:
646 socket.getaddrinfo('::1', 80)
647 # port can be a string service name such as "http", a numeric
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200648 # port number (int or long), or None
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000649 socket.getaddrinfo(HOST, "http")
650 socket.getaddrinfo(HOST, 80)
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200651 socket.getaddrinfo(HOST, 80L)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000652 socket.getaddrinfo(HOST, None)
653 # test family and socktype filters
654 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
655 for family, _, _, _, _ in infos:
656 self.assertEqual(family, socket.AF_INET)
657 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
658 for _, socktype, _, _, _ in infos:
659 self.assertEqual(socktype, socket.SOCK_STREAM)
660 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000661 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000662 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
663 # a server willing to support both IPv4 and IPv6 will
664 # usually do this
665 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
666 socket.AI_PASSIVE)
667
Ronald Oussoren16c52a32013-05-24 13:45:27 +0200668 # Issue 17269
Ronald Oussoren0e6283e2013-06-10 10:35:36 +0200669 if hasattr(socket, 'AI_NUMERICSERV'):
670 socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
Christian Heimesa47b75b2008-01-04 15:48:06 +0000671
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000672 def check_sendall_interrupted(self, with_timeout):
673 # socketpair() is not stricly required, but it makes things easier.
674 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
675 self.skipTest("signal.alarm and socket.socketpair required for this test")
676 # Our signal handlers clobber the C errno by calling a math function
677 # with an invalid domain value.
678 def ok_handler(*args):
679 self.assertRaises(ValueError, math.acosh, 0)
680 def raising_handler(*args):
681 self.assertRaises(ValueError, math.acosh, 0)
682 1 // 0
683 c, s = socket.socketpair()
684 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
685 try:
686 if with_timeout:
687 # Just above the one second minimum for signal.alarm
688 c.settimeout(1.5)
689 with self.assertRaises(ZeroDivisionError):
690 signal.alarm(1)
691 c.sendall(b"x" * (1024**2))
692 if with_timeout:
693 signal.signal(signal.SIGALRM, ok_handler)
694 signal.alarm(1)
695 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
696 finally:
697 signal.signal(signal.SIGALRM, old_alarm)
698 c.close()
699 s.close()
700
701 def test_sendall_interrupted(self):
702 self.check_sendall_interrupted(False)
703
704 def test_sendall_interrupted_with_timeout(self):
705 self.check_sendall_interrupted(True)
706
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200707 def test_listen_backlog(self):
708 for backlog in 0, -1:
709 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
710 srv.bind((HOST, 0))
711 srv.listen(backlog)
712 srv.close()
713
714 # Issue 15989
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200715 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
716 srv.bind((HOST, 0))
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200717 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200718 srv.close()
719
Charles-François Natali3aa59e32012-01-02 15:38:27 +0100720 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
721 def test_flowinfo(self):
722 self.assertRaises(OverflowError, socket.getnameinfo,
723 ('::1',0, 0xffffffff), 0)
724 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
725 try:
726 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
727 finally:
728 s.close()
729
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000730
Victor Stinner6a102812010-04-27 23:55:59 +0000731@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732class BasicTCPTest(SocketConnectedTest):
733
734 def __init__(self, methodName='runTest'):
735 SocketConnectedTest.__init__(self, methodName=methodName)
736
737 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000738 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000739 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000740 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741
742 def _testRecv(self):
743 self.serv_conn.send(MSG)
744
745 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000746 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747 seg1 = self.cli_conn.recv(len(MSG) - 3)
748 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000749 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000750 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000751
752 def _testOverFlowRecv(self):
753 self.serv_conn.send(MSG)
754
755 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000758 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000759
760 def _testRecvFrom(self):
761 self.serv_conn.send(MSG)
762
763 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000764 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
766 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000767 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000768 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000769
770 def _testOverFlowRecvFrom(self):
771 self.serv_conn.send(MSG)
772
773 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000774 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000775 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776 while 1:
777 read = self.cli_conn.recv(1024)
778 if not read:
779 break
Guido van Rossume531e292002-08-08 20:28:34 +0000780 msg += read
781 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782
783 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000784 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785 self.serv_conn.sendall(big_chunk)
786
787 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000788 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000789 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000790 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000791 fd = self.cli_conn.fileno()
792 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000793 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000795 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000796
797 def _testFromFd(self):
798 self.serv_conn.send(MSG)
799
Brian Curtin62c20b62010-11-02 02:59:55 +0000800 def testDup(self):
801 # Testing dup()
802 sock = self.cli_conn.dup()
803 self.addCleanup(sock.close)
804 msg = sock.recv(1024)
805 self.assertEqual(msg, MSG)
806
807 def _testDup(self):
808 self.serv_conn.send(MSG)
809
Guido van Rossum24e4af82002-06-12 19:18:08 +0000810 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000811 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000813 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000814 # wait for _testShutdown to finish: on OS X, when the server
815 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000816 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000817 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818
819 def _testShutdown(self):
820 self.serv_conn.send(MSG)
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200821 # Issue 15989
822 self.assertRaises(OverflowError, self.serv_conn.shutdown,
823 _testcapi.INT_MAX + 1)
824 self.assertRaises(OverflowError, self.serv_conn.shutdown,
825 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826 self.serv_conn.shutdown(2)
827
Victor Stinner6a102812010-04-27 23:55:59 +0000828@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829class BasicUDPTest(ThreadedUDPSocketTest):
830
831 def __init__(self, methodName='runTest'):
832 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
833
834 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000835 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000837 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838
839 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000840 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000841
Guido van Rossum1c938012002-06-12 21:17:20 +0000842 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000843 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000844 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000845 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846
Guido van Rossum1c938012002-06-12 21:17:20 +0000847 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000848 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849
Facundo Batista1fe9f962007-03-28 03:45:20 +0000850 def testRecvFromNegative(self):
851 # Negative lengths passed to recvfrom should give ValueError.
852 self.assertRaises(ValueError, self.serv.recvfrom, -1)
853
854 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000855 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000856
Victor Stinner6a102812010-04-27 23:55:59 +0000857@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000858class TCPCloserTest(ThreadedTCPSocketTest):
859
860 def testClose(self):
861 conn, addr = self.serv.accept()
862 conn.close()
863
864 sd = self.cli
865 read, write, err = select.select([sd], [], [], 1.0)
866 self.assertEqual(read, [sd])
867 self.assertEqual(sd.recv(1), '')
868
869 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000870 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000871 time.sleep(1.0)
872
Victor Stinner6a102812010-04-27 23:55:59 +0000873@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000874class BasicSocketPairTest(SocketPairTest):
875
876 def __init__(self, methodName='runTest'):
877 SocketPairTest.__init__(self, methodName=methodName)
878
879 def testRecv(self):
880 msg = self.serv.recv(1024)
881 self.assertEqual(msg, MSG)
882
883 def _testRecv(self):
884 self.cli.send(MSG)
885
886 def testSend(self):
887 self.serv.send(MSG)
888
889 def _testSend(self):
890 msg = self.cli.recv(1024)
891 self.assertEqual(msg, MSG)
892
Victor Stinner6a102812010-04-27 23:55:59 +0000893@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000894class NonBlockingTCPTests(ThreadedTCPSocketTest):
895
896 def __init__(self, methodName='runTest'):
897 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
898
899 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000900 # Testing whether set blocking works
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200901 self.serv.setblocking(True)
902 self.assertIsNone(self.serv.gettimeout())
903 self.serv.setblocking(False)
904 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905 start = time.time()
906 try:
907 self.serv.accept()
908 except socket.error:
909 pass
910 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000911 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200912 # Issue 15989
913 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
914 self.serv.setblocking(_testcapi.UINT_MAX + 1)
915 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916
917 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000918 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000919
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000921 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000923 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000924 conn, addr = self.serv.accept()
925 except socket.error:
926 pass
927 else:
928 self.fail("Error trying to do non-blocking accept.")
929 read, write, err = select.select([self.serv], [], [])
930 if self.serv in read:
931 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000932 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933 else:
934 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000935
Guido van Rossum24e4af82002-06-12 19:18:08 +0000936 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000937 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000938 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000939
940 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000941 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000943 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000944
945 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000946 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000947 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000948
949 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000950 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000951 conn, addr = self.serv.accept()
952 conn.setblocking(0)
953 try:
954 msg = conn.recv(len(MSG))
955 except socket.error:
956 pass
957 else:
958 self.fail("Error trying to do non-blocking recv.")
959 read, write, err = select.select([conn], [], [])
960 if conn in read:
961 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +0000962 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +0000963 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000964 else:
965 self.fail("Error during select call to non-blocking socket.")
966
967 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000968 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000969 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000970 self.cli.send(MSG)
971
Victor Stinner6a102812010-04-27 23:55:59 +0000972@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000973class FileObjectClassTestCase(SocketConnectedTest):
974
Guido van Rossume9f66142002-08-07 15:46:19 +0000975 bufsize = -1 # Use default buffer size
976
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977 def __init__(self, methodName='runTest'):
978 SocketConnectedTest.__init__(self, methodName=methodName)
979
980 def setUp(self):
981 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000982 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000983
984 def tearDown(self):
985 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000986 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000987 SocketConnectedTest.tearDown(self)
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +0000988 self.serv_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +0000989
990 def clientSetUp(self):
991 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000992 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000993
994 def clientTearDown(self):
995 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000996 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000997 self.cli_file = None
998 SocketConnectedTest.clientTearDown(self)
999
1000 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001001 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001002 first_seg = self.serv_file.read(len(MSG)-3)
1003 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001004 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +00001005 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001006
1007 def _testSmallRead(self):
1008 self.cli_file.write(MSG)
1009 self.cli_file.flush()
1010
Guido van Rossum8c943832002-08-08 01:00:28 +00001011 def testFullRead(self):
1012 # read until EOF
1013 msg = self.serv_file.read()
1014 self.assertEqual(msg, MSG)
1015
1016 def _testFullRead(self):
1017 self.cli_file.write(MSG)
1018 self.cli_file.close()
1019
Guido van Rossum24e4af82002-06-12 19:18:08 +00001020 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001021 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001022 buf = ''
1023 while 1:
1024 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001025 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001026 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001027 buf += char
1028 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001029
1030 def _testUnbufferedRead(self):
1031 self.cli_file.write(MSG)
1032 self.cli_file.flush()
1033
1034 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001035 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001036 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001037 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001038
1039 def _testReadline(self):
1040 self.cli_file.write(MSG)
1041 self.cli_file.flush()
1042
Gregory P. Smith24237ea2008-05-05 21:53:45 +00001043 def testReadlineAfterRead(self):
1044 a_baloo_is = self.serv_file.read(len("A baloo is"))
1045 self.assertEqual("A baloo is", a_baloo_is)
1046 _a_bear = self.serv_file.read(len(" a bear"))
1047 self.assertEqual(" a bear", _a_bear)
1048 line = self.serv_file.readline()
1049 self.assertEqual("\n", line)
1050 line = self.serv_file.readline()
1051 self.assertEqual("A BALOO IS A BEAR.\n", line)
1052 line = self.serv_file.readline()
1053 self.assertEqual(MSG, line)
1054
1055 def _testReadlineAfterRead(self):
1056 self.cli_file.write("A baloo is a bear\n")
1057 self.cli_file.write("A BALOO IS A BEAR.\n")
1058 self.cli_file.write(MSG)
1059 self.cli_file.flush()
1060
1061 def testReadlineAfterReadNoNewline(self):
1062 end_of_ = self.serv_file.read(len("End Of "))
1063 self.assertEqual("End Of ", end_of_)
1064 line = self.serv_file.readline()
1065 self.assertEqual("Line", line)
1066
1067 def _testReadlineAfterReadNoNewline(self):
1068 self.cli_file.write("End Of Line")
1069
Tim Peters116d83c2004-03-28 02:20:45 +00001070 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001071 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001072
1073 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001074 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001075
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001076
1077class FileObjectInterruptedTestCase(unittest.TestCase):
1078 """Test that the file object correctly handles EINTR internally."""
1079
1080 class MockSocket(object):
1081 def __init__(self, recv_funcs=()):
1082 # A generator that returns callables that we'll call for each
1083 # call to recv().
1084 self._recv_step = iter(recv_funcs)
1085
1086 def recv(self, size):
1087 return self._recv_step.next()()
1088
1089 @staticmethod
1090 def _raise_eintr():
1091 raise socket.error(errno.EINTR)
1092
1093 def _test_readline(self, size=-1, **kwargs):
1094 mock_sock = self.MockSocket(recv_funcs=[
1095 lambda : "This is the first line\nAnd the sec",
1096 self._raise_eintr,
1097 lambda : "ond line is here\n",
1098 lambda : "",
1099 ])
1100 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001101 self.assertEqual(fo.readline(size), "This is the first line\n")
1102 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001103
1104 def _test_read(self, size=-1, **kwargs):
1105 mock_sock = self.MockSocket(recv_funcs=[
1106 lambda : "This is the first line\nAnd the sec",
1107 self._raise_eintr,
1108 lambda : "ond line is here\n",
1109 lambda : "",
1110 ])
1111 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001112 self.assertEqual(fo.read(size), "This is the first line\n"
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001113 "And the second line is here\n")
1114
1115 def test_default(self):
1116 self._test_readline()
1117 self._test_readline(size=100)
1118 self._test_read()
1119 self._test_read(size=100)
1120
1121 def test_with_1k_buffer(self):
1122 self._test_readline(bufsize=1024)
1123 self._test_readline(size=100, bufsize=1024)
1124 self._test_read(bufsize=1024)
1125 self._test_read(size=100, bufsize=1024)
1126
1127 def _test_readline_no_buffer(self, size=-1):
1128 mock_sock = self.MockSocket(recv_funcs=[
1129 lambda : "aa",
1130 lambda : "\n",
1131 lambda : "BB",
1132 self._raise_eintr,
1133 lambda : "bb",
1134 lambda : "",
1135 ])
1136 fo = socket._fileobject(mock_sock, bufsize=0)
Ezio Melotti2623a372010-11-21 13:34:58 +00001137 self.assertEqual(fo.readline(size), "aa\n")
1138 self.assertEqual(fo.readline(size), "BBbb")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001139
1140 def test_no_buffer(self):
1141 self._test_readline_no_buffer()
1142 self._test_readline_no_buffer(size=4)
1143 self._test_read(bufsize=0)
1144 self._test_read(size=100, bufsize=0)
1145
1146
Guido van Rossume9f66142002-08-07 15:46:19 +00001147class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1148
1149 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001150
Guido van Rossume9f66142002-08-07 15:46:19 +00001151 In this case (and in this case only), it should be possible to
1152 create a file object, read a line from it, create another file
1153 object, read another line from it, without loss of data in the
1154 first file object's buffer. Note that httplib relies on this
1155 when reading multiple requests from the same socket."""
1156
1157 bufsize = 0 # Use unbuffered mode
1158
1159 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001160 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001161 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001162 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001163 self.serv_file = self.cli_conn.makefile('rb', 0)
1164 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001165 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001166
1167 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001168 self.cli_file.write("A. " + MSG)
1169 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001170 self.cli_file.flush()
1171
Guido van Rossum8c943832002-08-08 01:00:28 +00001172class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1173
1174 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1175
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001176 class SocketMemo(object):
1177 """A wrapper to keep track of sent data, needed to examine write behaviour"""
1178 def __init__(self, sock):
1179 self._sock = sock
1180 self.sent = []
1181
1182 def send(self, data, flags=0):
1183 n = self._sock.send(data, flags)
1184 self.sent.append(data[:n])
1185 return n
1186
1187 def sendall(self, data, flags=0):
1188 self._sock.sendall(data, flags)
1189 self.sent.append(data)
1190
1191 def __getattr__(self, attr):
1192 return getattr(self._sock, attr)
1193
1194 def getsent(self):
1195 return [e.tobytes() if isinstance(e, memoryview) else e for e in self.sent]
1196
1197 def setUp(self):
1198 FileObjectClassTestCase.setUp(self)
1199 self.serv_file._sock = self.SocketMemo(self.serv_file._sock)
1200
1201 def testLinebufferedWrite(self):
1202 # Write two lines, in small chunks
1203 msg = MSG.strip()
1204 print >> self.serv_file, msg,
1205 print >> self.serv_file, msg
1206
1207 # second line:
1208 print >> self.serv_file, msg,
1209 print >> self.serv_file, msg,
1210 print >> self.serv_file, msg
1211
1212 # third line
1213 print >> self.serv_file, ''
1214
1215 self.serv_file.flush()
1216
1217 msg1 = "%s %s\n"%(msg, msg)
1218 msg2 = "%s %s %s\n"%(msg, msg, msg)
1219 msg3 = "\n"
1220 self.assertEqual(self.serv_file._sock.getsent(), [msg1, msg2, msg3])
1221
1222 def _testLinebufferedWrite(self):
1223 msg = MSG.strip()
1224 msg1 = "%s %s\n"%(msg, msg)
1225 msg2 = "%s %s %s\n"%(msg, msg, msg)
1226 msg3 = "\n"
1227 l1 = self.cli_file.readline()
1228 self.assertEqual(l1, msg1)
1229 l2 = self.cli_file.readline()
1230 self.assertEqual(l2, msg2)
1231 l3 = self.cli_file.readline()
1232 self.assertEqual(l3, msg3)
1233
Guido van Rossum8c943832002-08-08 01:00:28 +00001234
1235class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1236
1237 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001238
Georg Brandldd7b0522007-01-21 10:35:10 +00001239
Facundo Batista07c78be2007-03-23 18:54:07 +00001240class NetworkConnectionTest(object):
1241 """Prove network connection."""
1242 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001243 # We're inherited below by BasicTCPTest2, which also inherits
1244 # BasicTCPTest, which defines self.port referenced below.
1245 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001246 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001247
Facundo Batista07c78be2007-03-23 18:54:07 +00001248class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1249 """Tests that NetworkConnection does not break existing TCP functionality.
1250 """
1251
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001252class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001253 class MockSocket(socket.socket):
1254 def connect(self, *args):
1255 raise socket.timeout('timed out')
1256
1257 @contextlib.contextmanager
1258 def mocked_socket_module(self):
1259 """Return a socket which times out on connect"""
1260 old_socket = socket.socket
1261 socket.socket = self.MockSocket
1262 try:
1263 yield
1264 finally:
1265 socket.socket = old_socket
1266
1267 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001268 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001269 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001270 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001271 with self.assertRaises(socket.error) as cm:
1272 cli.connect((HOST, port))
1273 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1274
1275 def test_create_connection(self):
1276 # Issue #9792: errors raised by create_connection() should have
1277 # a proper errno attribute.
1278 port = test_support.find_unused_port()
1279 with self.assertRaises(socket.error) as cm:
1280 socket.create_connection((HOST, port))
Trent Nelson6a7f8672012-10-18 01:35:32 -04001281
1282 # Issue #16257: create_connection() calls getaddrinfo() against
1283 # 'localhost'. This may result in an IPV6 addr being returned
1284 # as well as an IPV4 one:
1285 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1286 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1287 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1288 #
1289 # create_connection() enumerates through all the addresses returned
1290 # and if it doesn't successfully bind to any of them, it propagates
1291 # the last exception it encountered.
1292 #
1293 # On Solaris, ENETUNREACH is returned in this circumstance instead
1294 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1295 # expected errnos.
1296 expected_errnos = [ errno.ECONNREFUSED, ]
1297 if hasattr(errno, 'ENETUNREACH'):
1298 expected_errnos.append(errno.ENETUNREACH)
1299
1300 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001301
1302 def test_create_connection_timeout(self):
1303 # Issue #9792: create_connection() should not recast timeout errors
1304 # as generic socket errors.
1305 with self.mocked_socket_module():
1306 with self.assertRaises(socket.timeout):
1307 socket.create_connection((HOST, 1234))
1308
Facundo Batista07c78be2007-03-23 18:54:07 +00001309
Victor Stinner6a102812010-04-27 23:55:59 +00001310@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001311class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1312
1313 def __init__(self, methodName='runTest'):
1314 SocketTCPTest.__init__(self, methodName=methodName)
1315 ThreadableTest.__init__(self)
1316
1317 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001318 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001319
1320 def clientTearDown(self):
1321 self.cli.close()
1322 self.cli = None
1323 ThreadableTest.clientTearDown(self)
1324
1325 def _justAccept(self):
1326 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001327 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001328
1329 testFamily = _justAccept
1330 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001331 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001332 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001333 self.assertEqual(self.cli.family, 2)
1334
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001335 testSourceAddress = _justAccept
1336 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001337 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1338 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001339 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001340 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001341 # The port number being used is sufficient to show that the bind()
1342 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001343
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001344 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001345 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001346 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001347 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001348 socket.setdefaulttimeout(42)
1349 try:
1350 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001351 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001352 finally:
1353 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001354 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001355
1356 testTimeoutNone = _justAccept
1357 def _testTimeoutNone(self):
1358 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001359 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001360 socket.setdefaulttimeout(30)
1361 try:
1362 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001363 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001364 finally:
1365 socket.setdefaulttimeout(None)
1366 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001367
1368 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001369 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001370 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001371 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001372
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001373 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001374 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001375 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001376 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001377 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001378
Victor Stinner6a102812010-04-27 23:55:59 +00001379@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001380class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1381
1382 def __init__(self, methodName='runTest'):
1383 SocketTCPTest.__init__(self, methodName=methodName)
1384 ThreadableTest.__init__(self)
1385
1386 def clientSetUp(self):
1387 pass
1388
1389 def clientTearDown(self):
1390 self.cli.close()
1391 self.cli = None
1392 ThreadableTest.clientTearDown(self)
1393
Facundo Batista07c78be2007-03-23 18:54:07 +00001394 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001395 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001396 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001397 time.sleep(3)
1398 conn.send("done!")
1399 testOutsideTimeout = testInsideTimeout
1400
1401 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001402 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001403 data = sock.recv(5)
1404 self.assertEqual(data, "done!")
1405
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001406 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001407 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001408 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001409
1410
Georg Brandldd7b0522007-01-21 10:35:10 +00001411class Urllib2FileobjectTest(unittest.TestCase):
1412
1413 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1414 # it close the socket if the close c'tor argument is true
1415
1416 def testClose(self):
1417 class MockSocket:
1418 closed = False
1419 def flush(self): pass
1420 def close(self): self.closed = True
1421
1422 # must not close unless we request it: the original use of _fileobject
1423 # by module socket requires that the underlying socket not be closed until
1424 # the _socketobject that created the _fileobject is closed
1425 s = MockSocket()
1426 f = socket._fileobject(s)
1427 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001428 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001429
1430 s = MockSocket()
1431 f = socket._fileobject(s, close=True)
1432 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001433 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001434
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001435class TCPTimeoutTest(SocketTCPTest):
1436
1437 def testTCPTimeout(self):
1438 def raise_timeout(*args, **kwargs):
1439 self.serv.settimeout(1.0)
1440 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001441 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001442 "Error generating a timeout exception (TCP)")
1443
1444 def testTimeoutZero(self):
1445 ok = False
1446 try:
1447 self.serv.settimeout(0.0)
1448 foo = self.serv.accept()
1449 except socket.timeout:
1450 self.fail("caught timeout instead of error (TCP)")
1451 except socket.error:
1452 ok = True
1453 except:
1454 self.fail("caught unexpected exception (TCP)")
1455 if not ok:
1456 self.fail("accept() returned success when we did not expect it")
1457
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001458 def testInterruptedTimeout(self):
1459 # XXX I don't know how to do this test on MSWindows or any other
1460 # plaform that doesn't support signal.alarm() or os.kill(), though
1461 # the bug should have existed on all platforms.
1462 if not hasattr(signal, "alarm"):
1463 return # can only test on *nix
1464 self.serv.settimeout(5.0) # must be longer than alarm
1465 class Alarm(Exception):
1466 pass
1467 def alarm_handler(signal, frame):
1468 raise Alarm
1469 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1470 try:
1471 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1472 try:
1473 foo = self.serv.accept()
1474 except socket.timeout:
1475 self.fail("caught timeout instead of Alarm")
1476 except Alarm:
1477 pass
1478 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001479 self.fail("caught other exception instead of Alarm:"
1480 " %s(%s):\n%s" %
1481 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001482 else:
1483 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001484 finally:
1485 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001486 except Alarm:
1487 self.fail("got Alarm in wrong place")
1488 finally:
1489 # no alarm can be pending. Safe to restore old handler.
1490 signal.signal(signal.SIGALRM, old_alarm)
1491
Ezio Melotti169ed592011-11-18 18:33:14 +02001492class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001493
1494 def testUDPTimeout(self):
1495 def raise_timeout(*args, **kwargs):
1496 self.serv.settimeout(1.0)
1497 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001498 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001499 "Error generating a timeout exception (UDP)")
1500
1501 def testTimeoutZero(self):
1502 ok = False
1503 try:
1504 self.serv.settimeout(0.0)
1505 foo = self.serv.recv(1024)
1506 except socket.timeout:
1507 self.fail("caught timeout instead of error (UDP)")
1508 except socket.error:
1509 ok = True
1510 except:
1511 self.fail("caught unexpected exception (UDP)")
1512 if not ok:
1513 self.fail("recv() returned success when we did not expect it")
1514
1515class TestExceptions(unittest.TestCase):
1516
1517 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001518 self.assertTrue(issubclass(socket.error, Exception))
1519 self.assertTrue(issubclass(socket.herror, socket.error))
1520 self.assertTrue(issubclass(socket.gaierror, socket.error))
1521 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001522
Armin Rigoa9017c32006-04-19 11:50:27 +00001523class TestLinuxAbstractNamespace(unittest.TestCase):
1524
1525 UNIX_PATH_MAX = 108
1526
1527 def testLinuxAbstractNamespace(self):
1528 address = "\x00python-test-hello\x00\xff"
1529 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1530 s1.bind(address)
1531 s1.listen(1)
1532 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1533 s2.connect(s1.getsockname())
1534 s1.accept()
1535 self.assertEqual(s1.getsockname(), address)
1536 self.assertEqual(s2.getpeername(), address)
1537
1538 def testMaxName(self):
1539 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1540 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1541 s.bind(address)
1542 self.assertEqual(s.getsockname(), address)
1543
1544 def testNameOverflow(self):
1545 address = "\x00" + "h" * self.UNIX_PATH_MAX
1546 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1547 self.assertRaises(socket.error, s.bind, address)
1548
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001549
Victor Stinner6a102812010-04-27 23:55:59 +00001550@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001551class BufferIOTest(SocketConnectedTest):
1552 """
1553 Test the buffer versions of socket.recv() and socket.send().
1554 """
1555 def __init__(self, methodName='runTest'):
1556 SocketConnectedTest.__init__(self, methodName=methodName)
1557
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001558 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001559 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001560 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001561 self.assertEqual(nbytes, len(MSG))
1562 msg = buf.tostring()[:len(MSG)]
1563 self.assertEqual(msg, MSG)
1564
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001565 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001566 with test_support.check_py3k_warnings():
1567 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001568 self.serv_conn.send(buf)
1569
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001570 def testRecvIntoBytearray(self):
1571 buf = bytearray(1024)
1572 nbytes = self.cli_conn.recv_into(buf)
1573 self.assertEqual(nbytes, len(MSG))
1574 msg = buf[:len(MSG)]
1575 self.assertEqual(msg, MSG)
1576
1577 _testRecvIntoBytearray = _testRecvIntoArray
1578
1579 def testRecvIntoMemoryview(self):
1580 buf = bytearray(1024)
1581 nbytes = self.cli_conn.recv_into(memoryview(buf))
1582 self.assertEqual(nbytes, len(MSG))
1583 msg = buf[:len(MSG)]
1584 self.assertEqual(msg, MSG)
1585
1586 _testRecvIntoMemoryview = _testRecvIntoArray
1587
1588 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001589 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001590 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001591 self.assertEqual(nbytes, len(MSG))
1592 msg = buf.tostring()[:len(MSG)]
1593 self.assertEqual(msg, MSG)
1594
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001595 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001596 with test_support.check_py3k_warnings():
1597 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001598 self.serv_conn.send(buf)
1599
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001600 def testRecvFromIntoBytearray(self):
1601 buf = bytearray(1024)
1602 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1603 self.assertEqual(nbytes, len(MSG))
1604 msg = buf[:len(MSG)]
1605 self.assertEqual(msg, MSG)
1606
1607 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1608
1609 def testRecvFromIntoMemoryview(self):
1610 buf = bytearray(1024)
1611 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1612 self.assertEqual(nbytes, len(MSG))
1613 msg = buf[:len(MSG)]
1614 self.assertEqual(msg, MSG)
1615
1616 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1617
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001618
1619TIPC_STYPE = 2000
1620TIPC_LOWER = 200
1621TIPC_UPPER = 210
1622
1623def isTipcAvailable():
1624 """Check if the TIPC module is loaded
1625
1626 The TIPC module is not loaded automatically on Ubuntu and probably
1627 other Linux distros.
1628 """
1629 if not hasattr(socket, "AF_TIPC"):
1630 return False
1631 if not os.path.isfile("/proc/modules"):
1632 return False
1633 with open("/proc/modules") as f:
1634 for line in f:
1635 if line.startswith("tipc "):
1636 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001637 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001638 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1639 return False
1640
1641class TIPCTest (unittest.TestCase):
1642 def testRDM(self):
1643 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1644 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1645
1646 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1647 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1648 TIPC_LOWER, TIPC_UPPER)
1649 srv.bind(srvaddr)
1650
1651 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1652 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1653 cli.sendto(MSG, sendaddr)
1654
1655 msg, recvaddr = srv.recvfrom(1024)
1656
1657 self.assertEqual(cli.getsockname(), recvaddr)
1658 self.assertEqual(msg, MSG)
1659
1660
1661class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1662 def __init__(self, methodName = 'runTest'):
1663 unittest.TestCase.__init__(self, methodName = methodName)
1664 ThreadableTest.__init__(self)
1665
1666 def setUp(self):
1667 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1668 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1669 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1670 TIPC_LOWER, TIPC_UPPER)
1671 self.srv.bind(srvaddr)
1672 self.srv.listen(5)
1673 self.serverExplicitReady()
1674 self.conn, self.connaddr = self.srv.accept()
1675
1676 def clientSetUp(self):
1677 # The is a hittable race between serverExplicitReady() and the
1678 # accept() call; sleep a little while to avoid it, otherwise
1679 # we could get an exception
1680 time.sleep(0.1)
1681 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1682 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1683 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1684 self.cli.connect(addr)
1685 self.cliaddr = self.cli.getsockname()
1686
1687 def testStream(self):
1688 msg = self.conn.recv(1024)
1689 self.assertEqual(msg, MSG)
1690 self.assertEqual(self.cliaddr, self.connaddr)
1691
1692 def _testStream(self):
1693 self.cli.send(MSG)
1694 self.cli.close()
1695
1696
Guido van Rossumb995eb72002-07-31 16:08:40 +00001697def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001698 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001699 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1700 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001701
1702 tests.extend([
1703 NonBlockingTCPTests,
1704 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001705 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001706 UnbufferedFileObjectClassTestCase,
1707 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001708 SmallBufferedFileObjectClassTestCase,
1709 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001710 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001711 NetworkConnectionAttributesTest,
1712 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001713 ])
Dave Cole331708b2004-08-09 04:51:41 +00001714 if hasattr(socket, "socketpair"):
1715 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001716 if sys.platform == 'linux2':
1717 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001718 if isTipcAvailable():
1719 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001720 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001721
1722 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001723 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001724 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001725
1726if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001727 test_main()