blob: 3ef0850cd79a8401e1ca28d0e24076b3c7539647 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000019
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000020def try_address(host, port=0, family=socket.AF_INET):
21 """Try to bind a socket on the given host:port and return True
22 if that has been possible."""
23 try:
24 sock = socket.socket(family, socket.SOCK_STREAM)
25 sock.bind((host, port))
26 except (socket.error, socket.gaierror):
27 return False
28 else:
29 sock.close()
30 return True
31
Benjamin Petersonee8712c2008-05-20 21:35:26 +000032HOST = support.HOST
Guido van Rossum7d0a8262007-05-21 23:13:11 +000033MSG = b'Michael Gilfix was here\n'
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000034SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Victor Stinner45df8202010-04-28 22:31:17 +000036try:
37 import _thread as thread
38 import threading
39except ImportError:
40 thread = None
41 threading = None
42
Guido van Rossum24e4af82002-06-12 19:18:08 +000043class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000044
Guido van Rossum24e4af82002-06-12 19:18:08 +000045 def setUp(self):
46 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000047 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000048 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Guido van Rossum24e4af82002-06-12 19:18:08 +000050 def tearDown(self):
51 self.serv.close()
52 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000053
Guido van Rossum24e4af82002-06-12 19:18:08 +000054class SocketUDPTest(unittest.TestCase):
55
56 def setUp(self):
57 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000058 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000059
60 def tearDown(self):
61 self.serv.close()
62 self.serv = None
63
64class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000065 """Threadable Test class
66
67 The ThreadableTest class makes it easy to create a threaded
68 client/server pair from an existing unit test. To create a
69 new threaded class from an existing unit test, use multiple
70 inheritance:
71
72 class NewClass (OldClass, ThreadableTest):
73 pass
74
75 This class defines two new fixture functions with obvious
76 purposes for overriding:
77
78 clientSetUp ()
79 clientTearDown ()
80
81 Any new test functions within the class must then define
82 tests in pairs, where the test name is preceeded with a
83 '_' to indicate the client portion of the test. Ex:
84
85 def testFoo(self):
86 # Server portion
87
88 def _testFoo(self):
89 # Client portion
90
91 Any exceptions raised by the clients during their tests
92 are caught and transferred to the main thread to alert
93 the testing framework.
94
95 Note, the server setup function cannot call any blocking
96 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000097 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000098 the blocking call (such as in setting up a client/server
99 connection and performing the accept() in setUp().
100 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000101
102 def __init__(self):
103 # Swap the true setup function
104 self.__setUp = self.setUp
105 self.__tearDown = self.tearDown
106 self.setUp = self._setUp
107 self.tearDown = self._tearDown
108
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000109 def serverExplicitReady(self):
110 """This method allows the server to explicitly indicate that
111 it wants the client thread to proceed. This is useful if the
112 server is about to execute a blocking routine that is
113 dependent upon the client thread during its setup routine."""
114 self.server_ready.set()
115
Guido van Rossum24e4af82002-06-12 19:18:08 +0000116 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000117 self.server_ready = threading.Event()
118 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000119 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000120 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121
122 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000123 methodname = self.id()
124 i = methodname.rfind('.')
125 methodname = methodname[i+1:]
126 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000127 self.client_thread = thread.start_new_thread(
128 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000129
130 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000131 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000132 self.server_ready.set()
133 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000134
135 def _tearDown(self):
136 self.__tearDown()
137 self.done.wait()
138
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000139 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000140 exc = self.queue.get()
141 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000142
143 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000144 self.server_ready.wait()
145 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000146 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000147 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000148 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149 try:
150 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000151 except BaseException as e:
152 self.queue.put(e)
153 finally:
154 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000155
156 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000157 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000158
159 def clientTearDown(self):
160 self.done.set()
161 thread.exit()
162
163class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
164
165 def __init__(self, methodName='runTest'):
166 SocketTCPTest.__init__(self, methodName=methodName)
167 ThreadableTest.__init__(self)
168
169 def clientSetUp(self):
170 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
171
172 def clientTearDown(self):
173 self.cli.close()
174 self.cli = None
175 ThreadableTest.clientTearDown(self)
176
177class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
178
179 def __init__(self, methodName='runTest'):
180 SocketUDPTest.__init__(self, methodName=methodName)
181 ThreadableTest.__init__(self)
182
183 def clientSetUp(self):
184 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
185
186class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000187 """Socket tests for client-server connection.
188
189 self.cli_conn is a client socket connected to the server. The
190 setUp() method guarantees that it is connected to the server.
191 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000192
193 def __init__(self, methodName='runTest'):
194 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
195
196 def setUp(self):
197 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000198 # Indicate explicitly we're ready for the client thread to
199 # proceed and then perform the blocking call to accept
200 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000201 conn, addr = self.serv.accept()
202 self.cli_conn = conn
203
204 def tearDown(self):
205 self.cli_conn.close()
206 self.cli_conn = None
207 ThreadedTCPSocketTest.tearDown(self)
208
209 def clientSetUp(self):
210 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000211 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000212 self.serv_conn = self.cli
213
214 def clientTearDown(self):
215 self.serv_conn.close()
216 self.serv_conn = None
217 ThreadedTCPSocketTest.clientTearDown(self)
218
Dave Cole331708b2004-08-09 04:51:41 +0000219class SocketPairTest(unittest.TestCase, ThreadableTest):
220
221 def __init__(self, methodName='runTest'):
222 unittest.TestCase.__init__(self, methodName=methodName)
223 ThreadableTest.__init__(self)
224
225 def setUp(self):
226 self.serv, self.cli = socket.socketpair()
227
228 def tearDown(self):
229 self.serv.close()
230 self.serv = None
231
232 def clientSetUp(self):
233 pass
234
235 def clientTearDown(self):
236 self.cli.close()
237 self.cli = None
238 ThreadableTest.clientTearDown(self)
239
Tim Peters494aaee2004-08-09 18:54:11 +0000240
Guido van Rossum24e4af82002-06-12 19:18:08 +0000241#######################################################################
242## Begin Tests
243
244class GeneralModuleTests(unittest.TestCase):
245
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000246 def test_repr(self):
247 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000248 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000249
Raymond Hettinger027bb632004-05-31 03:09:25 +0000250 def test_weakref(self):
251 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
252 p = proxy(s)
253 self.assertEqual(p.fileno(), s.fileno())
254 s.close()
255 s = None
256 try:
257 p.fileno()
258 except ReferenceError:
259 pass
260 else:
261 self.fail('Socket proxy still exists')
262
Guido van Rossum24e4af82002-06-12 19:18:08 +0000263 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000264 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265 def raise_error(*args, **kwargs):
266 raise socket.error
267 def raise_herror(*args, **kwargs):
268 raise socket.herror
269 def raise_gaierror(*args, **kwargs):
270 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000271 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000273 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000274 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000275 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000276 "Error raising socket exception.")
277
278 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000279 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 socket.AF_INET
281 socket.SOCK_STREAM
282 socket.SOCK_DGRAM
283 socket.SOCK_RAW
284 socket.SOCK_RDM
285 socket.SOCK_SEQPACKET
286 socket.SOL_SOCKET
287 socket.SO_REUSEADDR
288
Guido van Rossum654c11e2002-06-13 20:24:17 +0000289 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000290 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000291 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000292 try:
293 ip = socket.gethostbyname(hostname)
294 except socket.error:
295 # Probably name lookup wasn't set up right; skip this test
296 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000297 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000298 try:
299 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
300 except socket.error:
301 # Probably a similar problem as above; skip this test
302 return
Brett Cannon01668a12005-03-11 00:04:17 +0000303 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000304 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000305 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000306 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000307
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000308 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000309 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000310 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000311 try:
312 # On some versions, this loses a reference
313 orig = sys.getrefcount(__name__)
314 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000315 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000316 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000317 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000318
Guido van Rossum24e4af82002-06-12 19:18:08 +0000319 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000320 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000321 try:
322 # On some versions, this crashes the interpreter.
323 socket.getnameinfo(('x', 0, 0, 0), 0)
324 except socket.error:
325 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000326
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000327 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000328 # This just checks that htons etc. are their own inverse,
329 # when looking at the lower 16 or 32 bits.
330 sizes = {socket.htonl: 32, socket.ntohl: 32,
331 socket.htons: 16, socket.ntohs: 16}
332 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000333 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000334 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
335 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000336
Guido van Rossuma2627af2002-09-14 00:58:46 +0000337 swapped = func(mask)
338 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000339 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000340
Guido van Rossum018919a2007-01-15 00:07:32 +0000341 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000342 good_values = [ 1, 2, 3, 1, 2, 3 ]
343 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000344 for k in good_values:
345 socket.ntohl(k)
346 socket.ntohs(k)
347 socket.htonl(k)
348 socket.htons(k)
349 for k in bad_values:
350 self.assertRaises(OverflowError, socket.ntohl, k)
351 self.assertRaises(OverflowError, socket.ntohs, k)
352 self.assertRaises(OverflowError, socket.htonl, k)
353 self.assertRaises(OverflowError, socket.htons, k)
354
Barry Warsaw11b91a02004-06-28 00:50:43 +0000355 def testGetServBy(self):
356 eq = self.assertEqual
357 # Find one service that exists, then check all the related interfaces.
358 # I've ordered this by protocols that have both a tcp and udp
359 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000360 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000361 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000362 # avoid the 'echo' service on this platform, as there is an
363 # assumption breaking non-standard port/protocol entry
364 services = ('daytime', 'qotd', 'domain')
365 else:
366 services = ('echo', 'daytime', 'domain')
367 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000368 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000369 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000370 break
371 except socket.error:
372 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000373 else:
374 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000375 # Try same call with optional protocol omitted
376 port2 = socket.getservbyname(service)
377 eq(port, port2)
378 # Try udp, but don't barf it it doesn't exist
379 try:
380 udpport = socket.getservbyname(service, 'udp')
381 except socket.error:
382 udpport = None
383 else:
384 eq(udpport, port)
385 # Now make sure the lookup by port returns the same service name
386 eq(socket.getservbyport(port2), service)
387 eq(socket.getservbyport(port, 'tcp'), service)
388 if udpport is not None:
389 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000390 # Make sure getservbyport does not accept out of range ports.
391 self.assertRaises(OverflowError, socket.getservbyport, -1)
392 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000393
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000394 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000395 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000396 # The default timeout should initially be None
397 self.assertEqual(socket.getdefaulttimeout(), None)
398 s = socket.socket()
399 self.assertEqual(s.gettimeout(), None)
400 s.close()
401
402 # Set the default timeout to 10, and see if it propagates
403 socket.setdefaulttimeout(10)
404 self.assertEqual(socket.getdefaulttimeout(), 10)
405 s = socket.socket()
406 self.assertEqual(s.gettimeout(), 10)
407 s.close()
408
409 # Reset the default timeout to None, and see if it propagates
410 socket.setdefaulttimeout(None)
411 self.assertEqual(socket.getdefaulttimeout(), None)
412 s = socket.socket()
413 self.assertEqual(s.gettimeout(), None)
414 s.close()
415
416 # Check that setting it to an invalid value raises ValueError
417 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
418
419 # Check that setting it to an invalid type raises TypeError
420 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
421
Benjamin Petersonf91df042009-02-13 02:50:59 +0000422 def testIPv4_inet_aton_fourbytes(self):
423 if not hasattr(socket, 'inet_aton'):
424 return # No inet_aton, nothing to check
425 # Test that issue1008086 and issue767150 are fixed.
426 # It must return 4 bytes.
427 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
428 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
429
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000430 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000431 if not hasattr(socket, 'inet_pton'):
432 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000433 from socket import inet_aton as f, inet_pton, AF_INET
434 g = lambda a: inet_pton(AF_INET, a)
435
Guido van Rossumb5b22702007-05-18 18:55:53 +0000436 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
437 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
438 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
439 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
440 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000441
Guido van Rossumb5b22702007-05-18 18:55:53 +0000442 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
443 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
444 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
445 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000446
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000447 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000448 if not hasattr(socket, 'inet_pton'):
449 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000450 try:
451 from socket import inet_pton, AF_INET6, has_ipv6
452 if not has_ipv6:
453 return
454 except ImportError:
455 return
456 f = lambda a: inet_pton(AF_INET6, a)
457
Guido van Rossum540d9872007-08-17 03:51:09 +0000458 self.assertEquals(b'\x00' * 16, f('::'))
459 self.assertEquals(b'\x00' * 16, f('0::0'))
460 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000461 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000462 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000463 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
464 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000465
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000466 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000467 if not hasattr(socket, 'inet_ntop'):
468 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000469 from socket import inet_ntoa as f, inet_ntop, AF_INET
470 g = lambda a: inet_ntop(AF_INET, a)
471
Guido van Rossumb5b22702007-05-18 18:55:53 +0000472 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
473 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
474 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
475 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000476
Guido van Rossumb5b22702007-05-18 18:55:53 +0000477 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
478 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
479 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000480
481 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000482 if not hasattr(socket, 'inet_ntop'):
483 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000484 try:
485 from socket import inet_ntop, AF_INET6, has_ipv6
486 if not has_ipv6:
487 return
488 except ImportError:
489 return
490 f = lambda a: inet_ntop(AF_INET6, a)
491
Guido van Rossum540d9872007-08-17 03:51:09 +0000492 self.assertEquals('::', f(b'\x00' * 16))
493 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000494 self.assertEquals(
495 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000496 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000497 )
498
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000499 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000500
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000501 def _get_unused_port(self, bind_address='0.0.0.0'):
502 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000503
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000504 Args:
505 bind_address: Hostname or IP address to search for a port on.
506
507 Returns: A most likely to be unused port.
508 """
509 tempsock = socket.socket()
510 tempsock.bind((bind_address, 0))
511 host, port = tempsock.getsockname()
512 tempsock.close()
513 return port
514
515 def testSockName(self):
516 # Testing getsockname()
517 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000518 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000519 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000520 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000521 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
522 # it reasonable to get the host's addr in addition to 0.0.0.0.
523 # At least for eCos. This is required for the S/390 to pass.
524 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000525 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000526 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000527
528 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000529 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530 # We know a socket should start without reuse==0
531 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
532 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000533 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534
535 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000536 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000537 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
538 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
539 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000540 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000541
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000542 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000543 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000544 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
545 sock.settimeout(1)
546 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000547 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000548
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000549 def testNewAttributes(self):
550 # testing .family, .type and .protocol
551 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
552 self.assertEqual(sock.family, socket.AF_INET)
553 self.assertEqual(sock.type, socket.SOCK_STREAM)
554 self.assertEqual(sock.proto, 0)
555 sock.close()
556
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000557 def test_getsockaddrarg(self):
558 host = '0.0.0.0'
559 port = self._get_unused_port(bind_address=host)
560 big_port = port + 65536
561 neg_port = port - 65536
562 sock = socket.socket()
563 try:
564 self.assertRaises(OverflowError, sock.bind, (host, big_port))
565 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
566 sock.bind((host, port))
567 finally:
568 sock.close()
569
Christian Heimesfaf2f632008-01-06 16:59:19 +0000570 def test_sock_ioctl(self):
571 if os.name != "nt":
572 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000573 self.assertTrue(hasattr(socket.socket, 'ioctl'))
574 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
575 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
576 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000577 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
578 s = socket.socket()
579 self.assertRaises(ValueError, s.ioctl, -1, None)
580 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000581
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000582 def testGetaddrinfo(self):
583 try:
584 socket.getaddrinfo('localhost', 80)
585 except socket.gaierror as err:
586 if err.errno == socket.EAI_SERVICE:
587 # see http://bugs.python.org/issue1282647
588 self.skipTest("buggy libc version")
589 raise
590 # len of every sequence is supposed to be == 5
591 for info in socket.getaddrinfo(HOST, None):
592 self.assertEqual(len(info), 5)
593 # host can be a domain name, a string representation of an
594 # IPv4/v6 address or None
595 socket.getaddrinfo('localhost', 80)
596 socket.getaddrinfo('127.0.0.1', 80)
597 socket.getaddrinfo(None, 80)
598 if SUPPORTS_IPV6:
599 socket.getaddrinfo('::1', 80)
600 # port can be a string service name such as "http", a numeric
601 # port number or None
602 socket.getaddrinfo(HOST, "http")
603 socket.getaddrinfo(HOST, 80)
604 socket.getaddrinfo(HOST, None)
605 # test family and socktype filters
606 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
607 for family, _, _, _, _ in infos:
608 self.assertEqual(family, socket.AF_INET)
609 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
610 for _, socktype, _, _, _ in infos:
611 self.assertEqual(socktype, socket.SOCK_STREAM)
612 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000613 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000614 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
615 # a server willing to support both IPv4 and IPv6 will
616 # usually do this
617 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
618 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000619 # test keyword arguments
620 a = socket.getaddrinfo(HOST, None)
621 b = socket.getaddrinfo(host=HOST, port=None)
622 self.assertEqual(a, b)
623 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
624 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
625 self.assertEqual(a, b)
626 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
627 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
628 self.assertEqual(a, b)
629 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
630 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
631 self.assertEqual(a, b)
632 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
633 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
634 self.assertEqual(a, b)
635 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
636 socket.AI_PASSIVE)
637 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
638 type=socket.SOCK_STREAM, proto=0,
639 flags=socket.AI_PASSIVE)
640 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000641
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000642 def test_getnameinfo(self):
643 # only IP addresses are allowed
644 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
645
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000646 @unittest.skipUnless(support.is_resource_enabled('network'),
647 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000648 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000649 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000650 # these should all be successful
651 socket.gethostbyname('испытание.python.org')
652 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000653 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
654 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
655 # have a reverse entry yet
656 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000657
Victor Stinner45df8202010-04-28 22:31:17 +0000658@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659class BasicTCPTest(SocketConnectedTest):
660
661 def __init__(self, methodName='runTest'):
662 SocketConnectedTest.__init__(self, methodName=methodName)
663
664 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000665 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000666 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000667 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000668
669 def _testRecv(self):
670 self.serv_conn.send(MSG)
671
672 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000673 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000674 seg1 = self.cli_conn.recv(len(MSG) - 3)
675 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000676 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000677 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000678
679 def _testOverFlowRecv(self):
680 self.serv_conn.send(MSG)
681
682 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000683 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000685 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000686
687 def _testRecvFrom(self):
688 self.serv_conn.send(MSG)
689
690 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000691 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000692 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
693 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000694 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000695 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696
697 def _testOverFlowRecvFrom(self):
698 self.serv_conn.send(MSG)
699
700 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000701 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000702 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703 while 1:
704 read = self.cli_conn.recv(1024)
705 if not read:
706 break
Guido van Rossume531e292002-08-08 20:28:34 +0000707 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000708 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709
710 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000711 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712 self.serv_conn.sendall(big_chunk)
713
714 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000715 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716 fd = self.cli_conn.fileno()
717 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000718 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000719 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000720 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721
722 def _testFromFd(self):
723 self.serv_conn.send(MSG)
724
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000725 def testDup(self):
726 # Testing dup()
727 sock = self.cli_conn.dup()
728 msg = sock.recv(1024)
729 self.assertEqual(msg, MSG)
730
731 def _testDup(self):
732 self.serv_conn.send(MSG)
733
Guido van Rossum24e4af82002-06-12 19:18:08 +0000734 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000735 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000736 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000737 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000738 # wait for _testShutdown to finish: on OS X, when the server
739 # closes the connection the client also becomes disconnected,
740 # and the client's shutdown call will fail. (Issue #4397.)
741 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000742
743 def _testShutdown(self):
744 self.serv_conn.send(MSG)
745 self.serv_conn.shutdown(2)
746
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000747 def testDetach(self):
748 # Testing detach()
749 fileno = self.cli_conn.fileno()
750 f = self.cli_conn.detach()
751 self.assertEqual(f, fileno)
752 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000753 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
754 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000755 # ...but we can create another socket using the (still open)
756 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000757 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
758 msg = sock.recv(1024)
759 self.assertEqual(msg, MSG)
760
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000761 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000762 self.serv_conn.send(MSG)
763
Victor Stinner45df8202010-04-28 22:31:17 +0000764@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765class BasicUDPTest(ThreadedUDPSocketTest):
766
767 def __init__(self, methodName='runTest'):
768 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
769
770 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000771 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000772 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000773 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774
775 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000776 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777
Guido van Rossum1c938012002-06-12 21:17:20 +0000778 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000779 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000780 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000781 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782
Guido van Rossum1c938012002-06-12 21:17:20 +0000783 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000784 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785
Guido van Rossumd8faa362007-04-27 19:54:29 +0000786 def testRecvFromNegative(self):
787 # Negative lengths passed to recvfrom should give ValueError.
788 self.assertRaises(ValueError, self.serv.recvfrom, -1)
789
790 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000791 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000792
Victor Stinner45df8202010-04-28 22:31:17 +0000793@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000794class TCPCloserTest(ThreadedTCPSocketTest):
795
796 def testClose(self):
797 conn, addr = self.serv.accept()
798 conn.close()
799
800 sd = self.cli
801 read, write, err = select.select([sd], [], [], 1.0)
802 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000803 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000804
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000805 # Calling close() many times should be safe.
806 conn.close()
807 conn.close()
808
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000809 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000810 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000811 time.sleep(1.0)
812
Victor Stinner45df8202010-04-28 22:31:17 +0000813@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000814class BasicSocketPairTest(SocketPairTest):
815
816 def __init__(self, methodName='runTest'):
817 SocketPairTest.__init__(self, methodName=methodName)
818
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000819 def _check_defaults(self, sock):
820 self.assertIsInstance(sock, socket.socket)
821 if hasattr(socket, 'AF_UNIX'):
822 self.assertEqual(sock.family, socket.AF_UNIX)
823 else:
824 self.assertEqual(sock.family, socket.AF_INET)
825 self.assertEqual(sock.type, socket.SOCK_STREAM)
826 self.assertEqual(sock.proto, 0)
827
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000828 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000829 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000830
831 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000832 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000833
Dave Cole331708b2004-08-09 04:51:41 +0000834 def testRecv(self):
835 msg = self.serv.recv(1024)
836 self.assertEqual(msg, MSG)
837
838 def _testRecv(self):
839 self.cli.send(MSG)
840
841 def testSend(self):
842 self.serv.send(MSG)
843
844 def _testSend(self):
845 msg = self.cli.recv(1024)
846 self.assertEqual(msg, MSG)
847
Victor Stinner45df8202010-04-28 22:31:17 +0000848@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849class NonBlockingTCPTests(ThreadedTCPSocketTest):
850
851 def __init__(self, methodName='runTest'):
852 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
853
854 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000855 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856 self.serv.setblocking(0)
857 start = time.time()
858 try:
859 self.serv.accept()
860 except socket.error:
861 pass
862 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000863 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000864
865 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000866 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000867
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000869 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000871 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872 conn, addr = self.serv.accept()
873 except socket.error:
874 pass
875 else:
876 self.fail("Error trying to do non-blocking accept.")
877 read, write, err = select.select([self.serv], [], [])
878 if self.serv in read:
879 conn, addr = self.serv.accept()
880 else:
881 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000882
Guido van Rossum24e4af82002-06-12 19:18:08 +0000883 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000884 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000885 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886
887 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000888 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889 conn, addr = self.serv.accept()
890
891 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000892 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000893 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000894
895 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000896 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000897 conn, addr = self.serv.accept()
898 conn.setblocking(0)
899 try:
900 msg = conn.recv(len(MSG))
901 except socket.error:
902 pass
903 else:
904 self.fail("Error trying to do non-blocking recv.")
905 read, write, err = select.select([conn], [], [])
906 if conn in read:
907 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000908 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000909 else:
910 self.fail("Error during select call to non-blocking socket.")
911
912 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000913 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000914 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000915 self.cli.send(MSG)
916
Victor Stinner45df8202010-04-28 22:31:17 +0000917@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000918class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000919 """Unit tests for the object returned by socket.makefile()
920
921 self.serv_file is the io object returned by makefile() on
922 the client connection. You can read from this file to
923 get output from the server.
924
925 self.cli_file is the io object returned by makefile() on the
926 server connection. You can write to this file to send output
927 to the client.
928 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929
Guido van Rossume9f66142002-08-07 15:46:19 +0000930 bufsize = -1 # Use default buffer size
931
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 def __init__(self, methodName='runTest'):
933 SocketConnectedTest.__init__(self, methodName=methodName)
934
935 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +0000936 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
937 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +0000938 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000939 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000940
941 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +0000942 self.serv_finished.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000943 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000944 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000945 self.serv_file = None
946 SocketConnectedTest.tearDown(self)
947
948 def clientSetUp(self):
949 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou98b46702010-09-18 22:59:00 +0000950 self.cli_file = self.serv_conn.makefile('wb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000951
952 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +0000953 self.cli_finished.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000954 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000955 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000956 self.cli_file = None
957 SocketConnectedTest.clientTearDown(self)
958
959 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000960 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961 first_seg = self.serv_file.read(len(MSG)-3)
962 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000963 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000964 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965
966 def _testSmallRead(self):
967 self.cli_file.write(MSG)
968 self.cli_file.flush()
969
Guido van Rossum8c943832002-08-08 01:00:28 +0000970 def testFullRead(self):
971 # read until EOF
972 msg = self.serv_file.read()
973 self.assertEqual(msg, MSG)
974
975 def _testFullRead(self):
976 self.cli_file.write(MSG)
977 self.cli_file.close()
978
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000980 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000981 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000982 while 1:
983 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000984 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000985 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000986 buf += char
987 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000988
989 def _testUnbufferedRead(self):
990 self.cli_file.write(MSG)
991 self.cli_file.flush()
992
993 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000994 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000995 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000996 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000997
998 def _testReadline(self):
999 self.cli_file.write(MSG)
1000 self.cli_file.flush()
1001
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001002 def testCloseAfterMakefile(self):
1003 # The file returned by makefile should keep the socket open.
1004 self.cli_conn.close()
1005 # read until EOF
1006 msg = self.serv_file.read()
1007 self.assertEqual(msg, MSG)
1008
1009 def _testCloseAfterMakefile(self):
1010 self.cli_file.write(MSG)
1011 self.cli_file.flush()
1012
1013 def testMakefileAfterMakefileClose(self):
1014 self.serv_file.close()
1015 msg = self.cli_conn.recv(len(MSG))
1016 self.assertEqual(msg, MSG)
1017
1018 def _testMakefileAfterMakefileClose(self):
1019 self.cli_file.write(MSG)
1020 self.cli_file.flush()
1021
Tim Peters116d83c2004-03-28 02:20:45 +00001022 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001023 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001024
1025 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001026 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001027
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001028 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001029 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001030 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
1031
1032 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001033 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001034 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
1035
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001036 def testRealClose(self):
1037 self.serv_file.close()
1038 self.assertRaises(ValueError, self.serv_file.fileno)
1039 self.cli_conn.close()
1040 self.assertRaises(socket.error, self.cli_conn.getsockname)
1041
1042 def _testRealClose(self):
1043 pass
1044
1045
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001046class FileObjectInterruptedTestCase(unittest.TestCase):
1047 """Test that the file object correctly handles EINTR internally."""
1048
1049 class MockSocket(object):
1050 def __init__(self, recv_funcs=()):
1051 # A generator that returns callables that we'll call for each
1052 # call to recv().
1053 self._recv_step = iter(recv_funcs)
1054
1055 def recv_into(self, buffer):
1056 data = next(self._recv_step)()
1057 assert len(buffer) >= len(data)
1058 buffer[:len(data)] = data
1059 return len(data)
1060
1061 def _decref_socketios(self):
1062 pass
1063
1064 def _textiowrap_for_test(self, buffering=-1):
1065 raw = socket.SocketIO(self, "r")
1066 if buffering < 0:
1067 buffering = io.DEFAULT_BUFFER_SIZE
1068 if buffering == 0:
1069 return raw
1070 buffer = io.BufferedReader(raw, buffering)
1071 text = io.TextIOWrapper(buffer, None, None)
1072 text.mode = "rb"
1073 return text
1074
1075 @staticmethod
1076 def _raise_eintr():
1077 raise socket.error(errno.EINTR)
1078
1079 def _textiowrap_mock_socket(self, mock, buffering=-1):
1080 raw = socket.SocketIO(mock, "r")
1081 if buffering < 0:
1082 buffering = io.DEFAULT_BUFFER_SIZE
1083 if buffering == 0:
1084 return raw
1085 buffer = io.BufferedReader(raw, buffering)
1086 text = io.TextIOWrapper(buffer, None, None)
1087 text.mode = "rb"
1088 return text
1089
1090 def _test_readline(self, size=-1, buffering=-1):
1091 mock_sock = self.MockSocket(recv_funcs=[
1092 lambda : b"This is the first line\nAnd the sec",
1093 self._raise_eintr,
1094 lambda : b"ond line is here\n",
1095 lambda : b"",
1096 lambda : b"", # XXX(gps): io library does an extra EOF read
1097 ])
1098 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1099 self.assertEquals(fo.readline(size), "This is the first line\n")
1100 self.assertEquals(fo.readline(size), "And the second line is here\n")
1101
1102 def _test_read(self, size=-1, buffering=-1):
1103 mock_sock = self.MockSocket(recv_funcs=[
1104 lambda : b"This is the first line\nAnd the sec",
1105 self._raise_eintr,
1106 lambda : b"ond line is here\n",
1107 lambda : b"",
1108 lambda : b"", # XXX(gps): io library does an extra EOF read
1109 ])
1110 expecting = (b"This is the first line\n"
1111 b"And the second line is here\n")
1112 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1113 if buffering == 0:
1114 data = b''
1115 else:
1116 data = ''
1117 expecting = expecting.decode('utf8')
1118 while len(data) != len(expecting):
1119 part = fo.read(size)
1120 if not part:
1121 break
1122 data += part
1123 self.assertEquals(data, expecting)
1124
1125 def test_default(self):
1126 self._test_readline()
1127 self._test_readline(size=100)
1128 self._test_read()
1129 self._test_read(size=100)
1130
1131 def test_with_1k_buffer(self):
1132 self._test_readline(buffering=1024)
1133 self._test_readline(size=100, buffering=1024)
1134 self._test_read(buffering=1024)
1135 self._test_read(size=100, buffering=1024)
1136
1137 def _test_readline_no_buffer(self, size=-1):
1138 mock_sock = self.MockSocket(recv_funcs=[
1139 lambda : b"a",
1140 lambda : b"\n",
1141 lambda : b"B",
1142 self._raise_eintr,
1143 lambda : b"b",
1144 lambda : b"",
1145 ])
1146 fo = mock_sock._textiowrap_for_test(buffering=0)
1147 self.assertEquals(fo.readline(size), b"a\n")
1148 self.assertEquals(fo.readline(size), b"Bb")
1149
1150 def test_no_buffer(self):
1151 self._test_readline_no_buffer()
1152 self._test_readline_no_buffer(size=4)
1153 self._test_read(buffering=0)
1154 self._test_read(size=100, buffering=0)
1155
1156
Guido van Rossume9f66142002-08-07 15:46:19 +00001157class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1158
1159 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001160
Guido van Rossume9f66142002-08-07 15:46:19 +00001161 In this case (and in this case only), it should be possible to
1162 create a file object, read a line from it, create another file
1163 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001164 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001165 when reading multiple requests from the same socket."""
1166
1167 bufsize = 0 # Use unbuffered mode
1168
1169 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001170 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001171 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001172 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001173 self.serv_file = self.cli_conn.makefile('rb', 0)
1174 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001175 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001176
1177 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001178 self.cli_file.write(b"A. " + MSG)
1179 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001180 self.cli_file.flush()
1181
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001182 def testMakefileClose(self):
1183 # The file returned by makefile should keep the socket open...
1184 self.cli_conn.close()
1185 msg = self.cli_conn.recv(1024)
1186 self.assertEqual(msg, MSG)
1187 # ...until the file is itself closed
1188 self.serv_file.close()
1189 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1190
1191 def _testMakefileClose(self):
1192 self.cli_file.write(MSG)
1193 self.cli_file.flush()
1194
1195 def testMakefileCloseSocketDestroy(self):
1196 refcount_before = sys.getrefcount(self.cli_conn)
1197 self.serv_file.close()
1198 refcount_after = sys.getrefcount(self.cli_conn)
1199 self.assertEqual(refcount_before - 1, refcount_after)
1200
1201 def _testMakefileCloseSocketDestroy(self):
1202 pass
1203
Antoine Pitrou98b46702010-09-18 22:59:00 +00001204 # Non-blocking ops
1205 # NOTE: to set `serv_file` as non-blocking, we must call
1206 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1207
1208 def testSmallReadNonBlocking(self):
1209 self.cli_conn.setblocking(False)
1210 self.assertEqual(self.serv_file.readinto(bytearray(10)), None)
1211 self.assertEqual(self.serv_file.read(len(MSG) - 3), None)
1212 self.evt1.set()
1213 self.evt2.wait(1.0)
1214 first_seg = self.serv_file.read(len(MSG) - 3)
1215 buf = bytearray(10)
1216 n = self.serv_file.readinto(buf)
1217 self.assertEqual(n, 3)
1218 msg = first_seg + buf[:n]
1219 self.assertEqual(msg, MSG)
1220 self.assertEqual(self.serv_file.readinto(bytearray(16)), None)
1221 self.assertEqual(self.serv_file.read(1), None)
1222
1223 def _testSmallReadNonBlocking(self):
1224 self.evt1.wait(1.0)
1225 self.cli_file.write(MSG)
1226 self.cli_file.flush()
1227 self.evt2.set()
1228 # Avoid cloding the socket before the server test has finished,
1229 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1230 self.serv_finished.wait(5.0)
1231
1232 def testWriteNonBlocking(self):
1233 self.cli_finished.wait(5.0)
1234 # The client thread can't skip directly - the SkipTest exception
1235 # would appear as a failure.
1236 if self.serv_skipped:
1237 self.skipTest(self.serv_skipped)
1238
1239 def _testWriteNonBlocking(self):
1240 self.serv_skipped = None
1241 self.serv_conn.setblocking(False)
1242 # Try to saturate the socket buffer pipe with repeated large writes.
1243 BIG = b"x" * (1024 ** 2)
1244 LIMIT = 10
1245 # The first write() succeeds since a chunk of data can be buffered
1246 n = self.cli_file.write(BIG)
1247 self.assertGreater(n, 0)
1248 for i in range(LIMIT):
1249 n = self.cli_file.write(BIG)
1250 if n is None:
1251 # Succeeded
1252 break
1253 self.assertGreater(n, 0)
1254 else:
1255 # Let us know that this test didn't manage to establish
1256 # the expected conditions. This is not a failure in itself but,
1257 # if it happens repeatedly, the test should be fixed.
1258 self.serv_skipped = "failed to saturate the socket buffer"
1259
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001260
Guido van Rossum8c943832002-08-08 01:00:28 +00001261class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1262
1263 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1264
1265
1266class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1267
1268 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001269
Thomas Woutersb2137042007-02-01 18:02:27 +00001270
Guido van Rossumd8faa362007-04-27 19:54:29 +00001271class NetworkConnectionTest(object):
1272 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001273
Guido van Rossumd8faa362007-04-27 19:54:29 +00001274 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001275 # We're inherited below by BasicTCPTest2, which also inherits
1276 # BasicTCPTest, which defines self.port referenced below.
1277 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001278 self.serv_conn = self.cli
1279
1280class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1281 """Tests that NetworkConnection does not break existing TCP functionality.
1282 """
1283
1284class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001285
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001286 class MockSocket(socket.socket):
1287 def connect(self, *args):
1288 raise socket.timeout('timed out')
1289
1290 @contextlib.contextmanager
1291 def mocked_socket_module(self):
1292 """Return a socket which times out on connect"""
1293 old_socket = socket.socket
1294 socket.socket = self.MockSocket
1295 try:
1296 yield
1297 finally:
1298 socket.socket = old_socket
1299
1300 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001301 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001302 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1303 with self.assertRaises(socket.error) as cm:
1304 cli.connect((HOST, port))
1305 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1306
1307 def test_create_connection(self):
1308 # Issue #9792: errors raised by create_connection() should have
1309 # a proper errno attribute.
1310 port = support.find_unused_port()
1311 with self.assertRaises(socket.error) as cm:
1312 socket.create_connection((HOST, port))
1313 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1314
1315 def test_create_connection_timeout(self):
1316 # Issue #9792: create_connection() should not recast timeout errors
1317 # as generic socket errors.
1318 with self.mocked_socket_module():
1319 with self.assertRaises(socket.timeout):
1320 socket.create_connection((HOST, 1234))
1321
Guido van Rossumd8faa362007-04-27 19:54:29 +00001322
Victor Stinner45df8202010-04-28 22:31:17 +00001323@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001324class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1325
1326 def __init__(self, methodName='runTest'):
1327 SocketTCPTest.__init__(self, methodName=methodName)
1328 ThreadableTest.__init__(self)
1329
1330 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001331 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001332
1333 def clientTearDown(self):
1334 self.cli.close()
1335 self.cli = None
1336 ThreadableTest.clientTearDown(self)
1337
1338 def _justAccept(self):
1339 conn, addr = self.serv.accept()
1340
1341 testFamily = _justAccept
1342 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001343 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001344 self.assertEqual(self.cli.family, 2)
1345
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001346 testSourceAddress = _justAccept
1347 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001348 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1349 source_address=('', self.source_port))
1350 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001351 # The port number being used is sufficient to show that the bind()
1352 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001353
Guido van Rossumd8faa362007-04-27 19:54:29 +00001354 testTimeoutDefault = _justAccept
1355 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001356 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001357 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001358 socket.setdefaulttimeout(42)
1359 try:
1360 self.cli = socket.create_connection((HOST, self.port))
1361 finally:
1362 socket.setdefaulttimeout(None)
1363 self.assertEquals(self.cli.gettimeout(), 42)
1364
1365 testTimeoutNone = _justAccept
1366 def _testTimeoutNone(self):
1367 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001368 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001369 socket.setdefaulttimeout(30)
1370 try:
1371 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1372 finally:
1373 socket.setdefaulttimeout(None)
1374 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001375
1376 testTimeoutValueNamed = _justAccept
1377 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001378 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001379 self.assertEqual(self.cli.gettimeout(), 30)
1380
1381 testTimeoutValueNonamed = _justAccept
1382 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001383 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001384 self.assertEqual(self.cli.gettimeout(), 30)
1385
Victor Stinner45df8202010-04-28 22:31:17 +00001386@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001387class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1388
1389 def __init__(self, methodName='runTest'):
1390 SocketTCPTest.__init__(self, methodName=methodName)
1391 ThreadableTest.__init__(self)
1392
1393 def clientSetUp(self):
1394 pass
1395
1396 def clientTearDown(self):
1397 self.cli.close()
1398 self.cli = None
1399 ThreadableTest.clientTearDown(self)
1400
1401 def testInsideTimeout(self):
1402 conn, addr = self.serv.accept()
1403 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001404 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001405 testOutsideTimeout = testInsideTimeout
1406
1407 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001408 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001409 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001410 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001411
1412 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001413 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001414 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001415
1416
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001417class TCPTimeoutTest(SocketTCPTest):
1418
1419 def testTCPTimeout(self):
1420 def raise_timeout(*args, **kwargs):
1421 self.serv.settimeout(1.0)
1422 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001423 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001424 "Error generating a timeout exception (TCP)")
1425
1426 def testTimeoutZero(self):
1427 ok = False
1428 try:
1429 self.serv.settimeout(0.0)
1430 foo = self.serv.accept()
1431 except socket.timeout:
1432 self.fail("caught timeout instead of error (TCP)")
1433 except socket.error:
1434 ok = True
1435 except:
1436 self.fail("caught unexpected exception (TCP)")
1437 if not ok:
1438 self.fail("accept() returned success when we did not expect it")
1439
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001440 def testInterruptedTimeout(self):
1441 # XXX I don't know how to do this test on MSWindows or any other
1442 # plaform that doesn't support signal.alarm() or os.kill(), though
1443 # the bug should have existed on all platforms.
1444 if not hasattr(signal, "alarm"):
1445 return # can only test on *nix
1446 self.serv.settimeout(5.0) # must be longer than alarm
1447 class Alarm(Exception):
1448 pass
1449 def alarm_handler(signal, frame):
1450 raise Alarm
1451 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1452 try:
1453 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1454 try:
1455 foo = self.serv.accept()
1456 except socket.timeout:
1457 self.fail("caught timeout instead of Alarm")
1458 except Alarm:
1459 pass
1460 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001461 self.fail("caught other exception instead of Alarm:"
1462 " %s(%s):\n%s" %
1463 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001464 else:
1465 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001466 finally:
1467 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001468 except Alarm:
1469 self.fail("got Alarm in wrong place")
1470 finally:
1471 # no alarm can be pending. Safe to restore old handler.
1472 signal.signal(signal.SIGALRM, old_alarm)
1473
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001474class UDPTimeoutTest(SocketTCPTest):
1475
1476 def testUDPTimeout(self):
1477 def raise_timeout(*args, **kwargs):
1478 self.serv.settimeout(1.0)
1479 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001480 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001481 "Error generating a timeout exception (UDP)")
1482
1483 def testTimeoutZero(self):
1484 ok = False
1485 try:
1486 self.serv.settimeout(0.0)
1487 foo = self.serv.recv(1024)
1488 except socket.timeout:
1489 self.fail("caught timeout instead of error (UDP)")
1490 except socket.error:
1491 ok = True
1492 except:
1493 self.fail("caught unexpected exception (UDP)")
1494 if not ok:
1495 self.fail("recv() returned success when we did not expect it")
1496
1497class TestExceptions(unittest.TestCase):
1498
1499 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001500 self.assertTrue(issubclass(socket.error, Exception))
1501 self.assertTrue(issubclass(socket.herror, socket.error))
1502 self.assertTrue(issubclass(socket.gaierror, socket.error))
1503 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001504
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001505class TestLinuxAbstractNamespace(unittest.TestCase):
1506
1507 UNIX_PATH_MAX = 108
1508
1509 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001510 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001511 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1512 s1.bind(address)
1513 s1.listen(1)
1514 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1515 s2.connect(s1.getsockname())
1516 s1.accept()
1517 self.assertEqual(s1.getsockname(), address)
1518 self.assertEqual(s2.getpeername(), address)
1519
1520 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001521 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001522 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1523 s.bind(address)
1524 self.assertEqual(s.getsockname(), address)
1525
1526 def testNameOverflow(self):
1527 address = "\x00" + "h" * self.UNIX_PATH_MAX
1528 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1529 self.assertRaises(socket.error, s.bind, address)
1530
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001531
Victor Stinner45df8202010-04-28 22:31:17 +00001532@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001533class BufferIOTest(SocketConnectedTest):
1534 """
1535 Test the buffer versions of socket.recv() and socket.send().
1536 """
1537 def __init__(self, methodName='runTest'):
1538 SocketConnectedTest.__init__(self, methodName=methodName)
1539
Antoine Pitrou25480782010-03-17 22:50:28 +00001540 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001541 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001542 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001543 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001544 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001545 self.assertEqual(msg, MSG)
1546
Antoine Pitrou25480782010-03-17 22:50:28 +00001547 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001548 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001549 self.serv_conn.send(buf)
1550
Antoine Pitrou25480782010-03-17 22:50:28 +00001551 def testRecvIntoBytearray(self):
1552 buf = bytearray(1024)
1553 nbytes = self.cli_conn.recv_into(buf)
1554 self.assertEqual(nbytes, len(MSG))
1555 msg = buf[:len(MSG)]
1556 self.assertEqual(msg, MSG)
1557
1558 _testRecvIntoBytearray = _testRecvIntoArray
1559
1560 def testRecvIntoMemoryview(self):
1561 buf = bytearray(1024)
1562 nbytes = self.cli_conn.recv_into(memoryview(buf))
1563 self.assertEqual(nbytes, len(MSG))
1564 msg = buf[:len(MSG)]
1565 self.assertEqual(msg, MSG)
1566
1567 _testRecvIntoMemoryview = _testRecvIntoArray
1568
1569 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001570 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001571 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001572 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001573 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001574 self.assertEqual(msg, MSG)
1575
Antoine Pitrou25480782010-03-17 22:50:28 +00001576 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001577 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001578 self.serv_conn.send(buf)
1579
Antoine Pitrou25480782010-03-17 22:50:28 +00001580 def testRecvFromIntoBytearray(self):
1581 buf = bytearray(1024)
1582 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1583 self.assertEqual(nbytes, len(MSG))
1584 msg = buf[:len(MSG)]
1585 self.assertEqual(msg, MSG)
1586
1587 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1588
1589 def testRecvFromIntoMemoryview(self):
1590 buf = bytearray(1024)
1591 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1592 self.assertEqual(nbytes, len(MSG))
1593 msg = buf[:len(MSG)]
1594 self.assertEqual(msg, MSG)
1595
1596 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1597
Christian Heimes043d6f62008-01-07 17:19:16 +00001598
1599TIPC_STYPE = 2000
1600TIPC_LOWER = 200
1601TIPC_UPPER = 210
1602
1603def isTipcAvailable():
1604 """Check if the TIPC module is loaded
1605
1606 The TIPC module is not loaded automatically on Ubuntu and probably
1607 other Linux distros.
1608 """
1609 if not hasattr(socket, "AF_TIPC"):
1610 return False
1611 if not os.path.isfile("/proc/modules"):
1612 return False
1613 with open("/proc/modules") as f:
1614 for line in f:
1615 if line.startswith("tipc "):
1616 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001617 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001618 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1619 return False
1620
1621class TIPCTest (unittest.TestCase):
1622 def testRDM(self):
1623 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1624 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1625
1626 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1627 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1628 TIPC_LOWER, TIPC_UPPER)
1629 srv.bind(srvaddr)
1630
1631 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1632 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1633 cli.sendto(MSG, sendaddr)
1634
1635 msg, recvaddr = srv.recvfrom(1024)
1636
1637 self.assertEqual(cli.getsockname(), recvaddr)
1638 self.assertEqual(msg, MSG)
1639
1640
1641class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1642 def __init__(self, methodName = 'runTest'):
1643 unittest.TestCase.__init__(self, methodName = methodName)
1644 ThreadableTest.__init__(self)
1645
1646 def setUp(self):
1647 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1648 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1649 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1650 TIPC_LOWER, TIPC_UPPER)
1651 self.srv.bind(srvaddr)
1652 self.srv.listen(5)
1653 self.serverExplicitReady()
1654 self.conn, self.connaddr = self.srv.accept()
1655
1656 def clientSetUp(self):
1657 # The is a hittable race between serverExplicitReady() and the
1658 # accept() call; sleep a little while to avoid it, otherwise
1659 # we could get an exception
1660 time.sleep(0.1)
1661 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1662 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1663 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1664 self.cli.connect(addr)
1665 self.cliaddr = self.cli.getsockname()
1666
1667 def testStream(self):
1668 msg = self.conn.recv(1024)
1669 self.assertEqual(msg, MSG)
1670 self.assertEqual(self.cliaddr, self.connaddr)
1671
1672 def _testStream(self):
1673 self.cli.send(MSG)
1674 self.cli.close()
1675
1676
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001677@unittest.skipUnless(thread, 'Threading required for this test.')
1678class ContextManagersTest(ThreadedTCPSocketTest):
1679
1680 def _testSocketClass(self):
1681 # base test
1682 with socket.socket() as sock:
1683 self.assertFalse(sock._closed)
1684 self.assertTrue(sock._closed)
1685 # close inside with block
1686 with socket.socket() as sock:
1687 sock.close()
1688 self.assertTrue(sock._closed)
1689 # exception inside with block
1690 with socket.socket() as sock:
1691 self.assertRaises(socket.error, sock.sendall, b'foo')
1692 self.assertTrue(sock._closed)
1693
1694 def testCreateConnectionBase(self):
1695 conn, addr = self.serv.accept()
1696 data = conn.recv(1024)
1697 conn.sendall(data)
1698
1699 def _testCreateConnectionBase(self):
1700 address = self.serv.getsockname()
1701 with socket.create_connection(address) as sock:
1702 self.assertFalse(sock._closed)
1703 sock.sendall(b'foo')
1704 self.assertEqual(sock.recv(1024), b'foo')
1705 self.assertTrue(sock._closed)
1706
1707 def testCreateConnectionClose(self):
1708 conn, addr = self.serv.accept()
1709 data = conn.recv(1024)
1710 conn.sendall(data)
1711
1712 def _testCreateConnectionClose(self):
1713 address = self.serv.getsockname()
1714 with socket.create_connection(address) as sock:
1715 sock.close()
1716 self.assertTrue(sock._closed)
1717 self.assertRaises(socket.error, sock.sendall, b'foo')
1718
1719
Guido van Rossumb995eb72002-07-31 16:08:40 +00001720def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001721 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001722 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001723
1724 tests.extend([
1725 NonBlockingTCPTests,
1726 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001727 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001728 UnbufferedFileObjectClassTestCase,
1729 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001730 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001731 NetworkConnectionNoServer,
1732 NetworkConnectionAttributesTest,
1733 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001734 ContextManagersTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001735 ])
Dave Cole331708b2004-08-09 04:51:41 +00001736 if hasattr(socket, "socketpair"):
1737 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001738 if sys.platform == 'linux2':
1739 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001740 if isTipcAvailable():
1741 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001742 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001743
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001744 thread_info = support.threading_setup()
1745 support.run_unittest(*tests)
1746 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001747
1748if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001749 test_main()