blob: 4b26824f7fca76d72862077accbc639019d7216b [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
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import thread, threading
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
Raymond Hettinger027bb632004-05-31 03:09:25 +000016from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000017import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Trent Nelsone41b0062008-04-08 23:47:30 +000019HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000020MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000021
Guido van Rossum24e4af82002-06-12 19:18:08 +000022class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000023
Guido van Rossum24e4af82002-06-12 19:18:08 +000024 def setUp(self):
25 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000026 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000027 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000028
Guido van Rossum24e4af82002-06-12 19:18:08 +000029 def tearDown(self):
30 self.serv.close()
31 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Guido van Rossum24e4af82002-06-12 19:18:08 +000033class SocketUDPTest(unittest.TestCase):
34
35 def setUp(self):
36 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000037 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000038
39 def tearDown(self):
40 self.serv.close()
41 self.serv = None
42
43class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000044 """Threadable Test class
45
46 The ThreadableTest class makes it easy to create a threaded
47 client/server pair from an existing unit test. To create a
48 new threaded class from an existing unit test, use multiple
49 inheritance:
50
51 class NewClass (OldClass, ThreadableTest):
52 pass
53
54 This class defines two new fixture functions with obvious
55 purposes for overriding:
56
57 clientSetUp ()
58 clientTearDown ()
59
60 Any new test functions within the class must then define
61 tests in pairs, where the test name is preceeded with a
62 '_' to indicate the client portion of the test. Ex:
63
64 def testFoo(self):
65 # Server portion
66
67 def _testFoo(self):
68 # Client portion
69
70 Any exceptions raised by the clients during their tests
71 are caught and transferred to the main thread to alert
72 the testing framework.
73
74 Note, the server setup function cannot call any blocking
75 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000076 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000077 the blocking call (such as in setting up a client/server
78 connection and performing the accept() in setUp().
79 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000080
81 def __init__(self):
82 # Swap the true setup function
83 self.__setUp = self.setUp
84 self.__tearDown = self.tearDown
85 self.setUp = self._setUp
86 self.tearDown = self._tearDown
87
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000088 def serverExplicitReady(self):
89 """This method allows the server to explicitly indicate that
90 it wants the client thread to proceed. This is useful if the
91 server is about to execute a blocking routine that is
92 dependent upon the client thread during its setup routine."""
93 self.server_ready.set()
94
Guido van Rossum24e4af82002-06-12 19:18:08 +000095 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000096 self.server_ready = threading.Event()
97 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000098 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +000099 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000100
101 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000102 methodname = self.id()
103 i = methodname.rfind('.')
104 methodname = methodname[i+1:]
105 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000106 self.client_thread = thread.start_new_thread(
107 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000108
109 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000110 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 self.server_ready.set()
112 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000113
114 def _tearDown(self):
115 self.__tearDown()
116 self.done.wait()
117
118 if not self.queue.empty():
119 msg = self.queue.get()
120 self.fail(msg)
121
122 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 self.server_ready.wait()
124 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000125 self.clientSetUp()
126 if not callable(test_func):
127 raise TypeError, "test_func must be a callable function"
128 try:
129 test_func()
130 except Exception, strerror:
131 self.queue.put(strerror)
132 self.clientTearDown()
133
134 def clientSetUp(self):
135 raise NotImplementedError, "clientSetUp must be implemented."
136
137 def clientTearDown(self):
138 self.done.set()
139 thread.exit()
140
141class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
142
143 def __init__(self, methodName='runTest'):
144 SocketTCPTest.__init__(self, methodName=methodName)
145 ThreadableTest.__init__(self)
146
147 def clientSetUp(self):
148 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
149
150 def clientTearDown(self):
151 self.cli.close()
152 self.cli = None
153 ThreadableTest.clientTearDown(self)
154
155class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
156
157 def __init__(self, methodName='runTest'):
158 SocketUDPTest.__init__(self, methodName=methodName)
159 ThreadableTest.__init__(self)
160
161 def clientSetUp(self):
162 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
163
164class SocketConnectedTest(ThreadedTCPSocketTest):
165
166 def __init__(self, methodName='runTest'):
167 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
168
169 def setUp(self):
170 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000171 # Indicate explicitly we're ready for the client thread to
172 # proceed and then perform the blocking call to accept
173 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000174 conn, addr = self.serv.accept()
175 self.cli_conn = conn
176
177 def tearDown(self):
178 self.cli_conn.close()
179 self.cli_conn = None
180 ThreadedTCPSocketTest.tearDown(self)
181
182 def clientSetUp(self):
183 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000184 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000185 self.serv_conn = self.cli
186
187 def clientTearDown(self):
188 self.serv_conn.close()
189 self.serv_conn = None
190 ThreadedTCPSocketTest.clientTearDown(self)
191
Dave Cole331708b2004-08-09 04:51:41 +0000192class SocketPairTest(unittest.TestCase, ThreadableTest):
193
194 def __init__(self, methodName='runTest'):
195 unittest.TestCase.__init__(self, methodName=methodName)
196 ThreadableTest.__init__(self)
197
198 def setUp(self):
199 self.serv, self.cli = socket.socketpair()
200
201 def tearDown(self):
202 self.serv.close()
203 self.serv = None
204
205 def clientSetUp(self):
206 pass
207
208 def clientTearDown(self):
209 self.cli.close()
210 self.cli = None
211 ThreadableTest.clientTearDown(self)
212
Tim Peters494aaee2004-08-09 18:54:11 +0000213
Guido van Rossum24e4af82002-06-12 19:18:08 +0000214#######################################################################
215## Begin Tests
216
217class GeneralModuleTests(unittest.TestCase):
218
Raymond Hettinger027bb632004-05-31 03:09:25 +0000219 def test_weakref(self):
220 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
221 p = proxy(s)
222 self.assertEqual(p.fileno(), s.fileno())
223 s.close()
224 s = None
225 try:
226 p.fileno()
227 except ReferenceError:
228 pass
229 else:
230 self.fail('Socket proxy still exists')
231
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000233 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000234 def raise_error(*args, **kwargs):
235 raise socket.error
236 def raise_herror(*args, **kwargs):
237 raise socket.herror
238 def raise_gaierror(*args, **kwargs):
239 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000240 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000241 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000242 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000243 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000244 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000245 "Error raising socket exception.")
246
247 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000248 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000249 socket.AF_INET
250 socket.SOCK_STREAM
251 socket.SOCK_DGRAM
252 socket.SOCK_RAW
253 socket.SOCK_RDM
254 socket.SOCK_SEQPACKET
255 socket.SOL_SOCKET
256 socket.SO_REUSEADDR
257
Guido van Rossum654c11e2002-06-13 20:24:17 +0000258 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000259 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000260 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000261 try:
262 ip = socket.gethostbyname(hostname)
263 except socket.error:
264 # Probably name lookup wasn't set up right; skip this test
265 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000266 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000267 try:
268 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
269 except socket.error:
270 # Probably a similar problem as above; skip this test
271 return
Brett Cannon01668a12005-03-11 00:04:17 +0000272 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000273 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000274 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000275 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000276
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000277 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000278 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000279 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 try:
281 # On some versions, this loses a reference
282 orig = sys.getrefcount(__name__)
283 socket.getnameinfo(__name__,0)
284 except SystemError:
285 if sys.getrefcount(__name__) <> orig:
286 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000287
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000289 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000290 try:
291 # On some versions, this crashes the interpreter.
292 socket.getnameinfo(('x', 0, 0, 0), 0)
293 except socket.error:
294 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000295
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000296 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000297 # This just checks that htons etc. are their own inverse,
298 # when looking at the lower 16 or 32 bits.
299 sizes = {socket.htonl: 32, socket.ntohl: 32,
300 socket.htons: 16, socket.ntohs: 16}
301 for func, size in sizes.items():
302 mask = (1L<<size) - 1
303 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
304 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000305
Guido van Rossuma2627af2002-09-14 00:58:46 +0000306 swapped = func(mask)
307 self.assertEqual(swapped & mask, mask)
308 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000309
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000310 def testNtoHErrors(self):
311 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
312 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
313 for k in good_values:
314 socket.ntohl(k)
315 socket.ntohs(k)
316 socket.htonl(k)
317 socket.htons(k)
318 for k in bad_values:
319 self.assertRaises(OverflowError, socket.ntohl, k)
320 self.assertRaises(OverflowError, socket.ntohs, k)
321 self.assertRaises(OverflowError, socket.htonl, k)
322 self.assertRaises(OverflowError, socket.htons, k)
323
Barry Warsaw11b91a02004-06-28 00:50:43 +0000324 def testGetServBy(self):
325 eq = self.assertEqual
326 # Find one service that exists, then check all the related interfaces.
327 # I've ordered this by protocols that have both a tcp and udp
328 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000329 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000330 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000331 # avoid the 'echo' service on this platform, as there is an
332 # assumption breaking non-standard port/protocol entry
333 services = ('daytime', 'qotd', 'domain')
334 else:
335 services = ('echo', 'daytime', 'domain')
336 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000337 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000338 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000339 break
340 except socket.error:
341 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000342 else:
343 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000344 # Try same call with optional protocol omitted
345 port2 = socket.getservbyname(service)
346 eq(port, port2)
347 # Try udp, but don't barf it it doesn't exist
348 try:
349 udpport = socket.getservbyname(service, 'udp')
350 except socket.error:
351 udpport = None
352 else:
353 eq(udpport, port)
354 # Now make sure the lookup by port returns the same service name
355 eq(socket.getservbyport(port2), service)
356 eq(socket.getservbyport(port, 'tcp'), service)
357 if udpport is not None:
358 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000359 # Make sure getservbyport does not accept out of range ports.
360 self.assertRaises(OverflowError, socket.getservbyport, -1)
361 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000362
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000363 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000364 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000365 # The default timeout should initially be None
366 self.assertEqual(socket.getdefaulttimeout(), None)
367 s = socket.socket()
368 self.assertEqual(s.gettimeout(), None)
369 s.close()
370
371 # Set the default timeout to 10, and see if it propagates
372 socket.setdefaulttimeout(10)
373 self.assertEqual(socket.getdefaulttimeout(), 10)
374 s = socket.socket()
375 self.assertEqual(s.gettimeout(), 10)
376 s.close()
377
378 # Reset the default timeout to None, and see if it propagates
379 socket.setdefaulttimeout(None)
380 self.assertEqual(socket.getdefaulttimeout(), None)
381 s = socket.socket()
382 self.assertEqual(s.gettimeout(), None)
383 s.close()
384
385 # Check that setting it to an invalid value raises ValueError
386 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
387
388 # Check that setting it to an invalid type raises TypeError
389 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
390
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000391 def testIPv4_inet_aton_fourbytes(self):
392 if not hasattr(socket, 'inet_aton'):
393 return # No inet_aton, nothing to check
394 # Test that issue1008086 and issue767150 are fixed.
395 # It must return 4 bytes.
396 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
397 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
398
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000399 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000400 if not hasattr(socket, 'inet_pton'):
401 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000402 from socket import inet_aton as f, inet_pton, AF_INET
403 g = lambda a: inet_pton(AF_INET, a)
404
405 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
406 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
407 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
408 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000409 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000410
411 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
412 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
413 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000414 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000415
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000416 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000417 if not hasattr(socket, 'inet_pton'):
418 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000419 try:
420 from socket import inet_pton, AF_INET6, has_ipv6
421 if not has_ipv6:
422 return
423 except ImportError:
424 return
425 f = lambda a: inet_pton(AF_INET6, a)
426
427 self.assertEquals('\x00' * 16, f('::'))
428 self.assertEquals('\x00' * 16, f('0::0'))
429 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
430 self.assertEquals(
431 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
432 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
433 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000434
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000435 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000436 if not hasattr(socket, 'inet_ntop'):
437 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000438 from socket import inet_ntoa as f, inet_ntop, AF_INET
439 g = lambda a: inet_ntop(AF_INET, a)
440
441 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
442 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
443 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
444 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000445
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000446 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
447 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
448 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
449
450 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000451 if not hasattr(socket, 'inet_ntop'):
452 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000453 try:
454 from socket import inet_ntop, AF_INET6, has_ipv6
455 if not has_ipv6:
456 return
457 except ImportError:
458 return
459 f = lambda a: inet_ntop(AF_INET6, a)
460
461 self.assertEquals('::', f('\x00' * 16))
462 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
463 self.assertEquals(
464 'aef:b01:506:1001:ffff:9997:55:170',
465 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
466 )
467
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000468 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000469
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000470 def _get_unused_port(self, bind_address='0.0.0.0'):
471 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000472
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000473 Args:
474 bind_address: Hostname or IP address to search for a port on.
475
476 Returns: A most likely to be unused port.
477 """
478 tempsock = socket.socket()
479 tempsock.bind((bind_address, 0))
480 host, port = tempsock.getsockname()
481 tempsock.close()
482 return port
483
484 def testSockName(self):
485 # Testing getsockname()
486 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000487 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +0000488 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000489 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000490 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
491 # it reasonable to get the host's addr in addition to 0.0.0.0.
492 # At least for eCos. This is required for the S/390 to pass.
493 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000494 self.assertTrue(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000495 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496
497 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000498 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000499 # We know a socket should start without reuse==0
500 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
501 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000502 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000503
504 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000505 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000506 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
507 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
508 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000509 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000511 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000512 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000513 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
514 sock.settimeout(1)
515 sock.close()
516 self.assertRaises(socket.error, sock.send, "spam")
517
Georg Brandlbb03ac02006-03-21 18:17:25 +0000518 def testNewAttributes(self):
519 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000520 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000521 self.assertEqual(sock.family, socket.AF_INET)
522 self.assertEqual(sock.type, socket.SOCK_STREAM)
523 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000524 sock.close()
525
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000526 def test_getsockaddrarg(self):
527 host = '0.0.0.0'
528 port = self._get_unused_port(bind_address=host)
529 big_port = port + 65536
530 neg_port = port - 65536
531 sock = socket.socket()
532 try:
533 self.assertRaises(OverflowError, sock.bind, (host, big_port))
534 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
535 sock.bind((host, port))
536 finally:
537 sock.close()
538
Christian Heimesa47b75b2008-01-04 15:48:06 +0000539 def test_sock_ioctl(self):
540 if os.name != "nt":
541 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000542 self.assertTrue(hasattr(socket.socket, 'ioctl'))
543 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
544 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
545 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000546
547
Guido van Rossum24e4af82002-06-12 19:18:08 +0000548class BasicTCPTest(SocketConnectedTest):
549
550 def __init__(self, methodName='runTest'):
551 SocketConnectedTest.__init__(self, methodName=methodName)
552
553 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000554 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000555 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000556 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557
558 def _testRecv(self):
559 self.serv_conn.send(MSG)
560
561 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000562 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563 seg1 = self.cli_conn.recv(len(MSG) - 3)
564 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000565 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000566 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000567
568 def _testOverFlowRecv(self):
569 self.serv_conn.send(MSG)
570
571 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000572 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000574 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575
576 def _testRecvFrom(self):
577 self.serv_conn.send(MSG)
578
579 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000580 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000581 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
582 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000583 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000584 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000585
586 def _testOverFlowRecvFrom(self):
587 self.serv_conn.send(MSG)
588
589 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000590 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000591 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000592 while 1:
593 read = self.cli_conn.recv(1024)
594 if not read:
595 break
Guido van Rossume531e292002-08-08 20:28:34 +0000596 msg += read
597 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000598
599 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000600 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000601 self.serv_conn.sendall(big_chunk)
602
603 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000604 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000605 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000606 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000607 fd = self.cli_conn.fileno()
608 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
609 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000610 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611
612 def _testFromFd(self):
613 self.serv_conn.send(MSG)
614
615 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000616 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000618 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000619 # wait for _testShutdown to finish: on OS X, when the server
620 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000621 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000622 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000623
624 def _testShutdown(self):
625 self.serv_conn.send(MSG)
626 self.serv_conn.shutdown(2)
627
628class BasicUDPTest(ThreadedUDPSocketTest):
629
630 def __init__(self, methodName='runTest'):
631 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
632
633 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000634 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000635 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000636 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000637
638 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000639 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640
Guido van Rossum1c938012002-06-12 21:17:20 +0000641 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000642 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000643 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000644 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645
Guido van Rossum1c938012002-06-12 21:17:20 +0000646 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000647 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648
Facundo Batista1fe9f962007-03-28 03:45:20 +0000649 def testRecvFromNegative(self):
650 # Negative lengths passed to recvfrom should give ValueError.
651 self.assertRaises(ValueError, self.serv.recvfrom, -1)
652
653 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000654 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000655
Martin v. Löwis7596e832006-07-01 15:33:37 +0000656class TCPCloserTest(ThreadedTCPSocketTest):
657
658 def testClose(self):
659 conn, addr = self.serv.accept()
660 conn.close()
661
662 sd = self.cli
663 read, write, err = select.select([sd], [], [], 1.0)
664 self.assertEqual(read, [sd])
665 self.assertEqual(sd.recv(1), '')
666
667 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000668 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000669 time.sleep(1.0)
670
Dave Cole331708b2004-08-09 04:51:41 +0000671class BasicSocketPairTest(SocketPairTest):
672
673 def __init__(self, methodName='runTest'):
674 SocketPairTest.__init__(self, methodName=methodName)
675
676 def testRecv(self):
677 msg = self.serv.recv(1024)
678 self.assertEqual(msg, MSG)
679
680 def _testRecv(self):
681 self.cli.send(MSG)
682
683 def testSend(self):
684 self.serv.send(MSG)
685
686 def _testSend(self):
687 msg = self.cli.recv(1024)
688 self.assertEqual(msg, MSG)
689
Guido van Rossum24e4af82002-06-12 19:18:08 +0000690class NonBlockingTCPTests(ThreadedTCPSocketTest):
691
692 def __init__(self, methodName='runTest'):
693 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
694
695 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000696 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000697 self.serv.setblocking(0)
698 start = time.time()
699 try:
700 self.serv.accept()
701 except socket.error:
702 pass
703 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000704 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705
706 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000707 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000708
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000710 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000712 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000713 conn, addr = self.serv.accept()
714 except socket.error:
715 pass
716 else:
717 self.fail("Error trying to do non-blocking accept.")
718 read, write, err = select.select([self.serv], [], [])
719 if self.serv in read:
720 conn, addr = self.serv.accept()
721 else:
722 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000723
Guido van Rossum24e4af82002-06-12 19:18:08 +0000724 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000725 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000726 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727
728 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000729 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730 conn, addr = self.serv.accept()
731
732 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000733 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000734 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735
736 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000737 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000738 conn, addr = self.serv.accept()
739 conn.setblocking(0)
740 try:
741 msg = conn.recv(len(MSG))
742 except socket.error:
743 pass
744 else:
745 self.fail("Error trying to do non-blocking recv.")
746 read, write, err = select.select([conn], [], [])
747 if conn in read:
748 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000749 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750 else:
751 self.fail("Error during select call to non-blocking socket.")
752
753 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000754 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000755 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756 self.cli.send(MSG)
757
758class FileObjectClassTestCase(SocketConnectedTest):
759
Guido van Rossume9f66142002-08-07 15:46:19 +0000760 bufsize = -1 # Use default buffer size
761
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762 def __init__(self, methodName='runTest'):
763 SocketConnectedTest.__init__(self, methodName=methodName)
764
765 def setUp(self):
766 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000767 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768
769 def tearDown(self):
770 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000771 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000772 self.serv_file = None
773 SocketConnectedTest.tearDown(self)
774
775 def clientSetUp(self):
776 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000777 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778
779 def clientTearDown(self):
780 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000781 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782 self.cli_file = None
783 SocketConnectedTest.clientTearDown(self)
784
785 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000786 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787 first_seg = self.serv_file.read(len(MSG)-3)
788 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000789 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000790 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000791
792 def _testSmallRead(self):
793 self.cli_file.write(MSG)
794 self.cli_file.flush()
795
Guido van Rossum8c943832002-08-08 01:00:28 +0000796 def testFullRead(self):
797 # read until EOF
798 msg = self.serv_file.read()
799 self.assertEqual(msg, MSG)
800
801 def _testFullRead(self):
802 self.cli_file.write(MSG)
803 self.cli_file.close()
804
Guido van Rossum24e4af82002-06-12 19:18:08 +0000805 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000806 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000807 buf = ''
808 while 1:
809 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000810 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000812 buf += char
813 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814
815 def _testUnbufferedRead(self):
816 self.cli_file.write(MSG)
817 self.cli_file.flush()
818
819 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000820 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000822 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823
824 def _testReadline(self):
825 self.cli_file.write(MSG)
826 self.cli_file.flush()
827
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000828 def testReadlineAfterRead(self):
829 a_baloo_is = self.serv_file.read(len("A baloo is"))
830 self.assertEqual("A baloo is", a_baloo_is)
831 _a_bear = self.serv_file.read(len(" a bear"))
832 self.assertEqual(" a bear", _a_bear)
833 line = self.serv_file.readline()
834 self.assertEqual("\n", line)
835 line = self.serv_file.readline()
836 self.assertEqual("A BALOO IS A BEAR.\n", line)
837 line = self.serv_file.readline()
838 self.assertEqual(MSG, line)
839
840 def _testReadlineAfterRead(self):
841 self.cli_file.write("A baloo is a bear\n")
842 self.cli_file.write("A BALOO IS A BEAR.\n")
843 self.cli_file.write(MSG)
844 self.cli_file.flush()
845
846 def testReadlineAfterReadNoNewline(self):
847 end_of_ = self.serv_file.read(len("End Of "))
848 self.assertEqual("End Of ", end_of_)
849 line = self.serv_file.readline()
850 self.assertEqual("Line", line)
851
852 def _testReadlineAfterReadNoNewline(self):
853 self.cli_file.write("End Of Line")
854
Tim Peters116d83c2004-03-28 02:20:45 +0000855 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000856 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000857
858 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000859 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000860
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000861
862class FileObjectInterruptedTestCase(unittest.TestCase):
863 """Test that the file object correctly handles EINTR internally."""
864
865 class MockSocket(object):
866 def __init__(self, recv_funcs=()):
867 # A generator that returns callables that we'll call for each
868 # call to recv().
869 self._recv_step = iter(recv_funcs)
870
871 def recv(self, size):
872 return self._recv_step.next()()
873
874 @staticmethod
875 def _raise_eintr():
876 raise socket.error(errno.EINTR)
877
878 def _test_readline(self, size=-1, **kwargs):
879 mock_sock = self.MockSocket(recv_funcs=[
880 lambda : "This is the first line\nAnd the sec",
881 self._raise_eintr,
882 lambda : "ond line is here\n",
883 lambda : "",
884 ])
885 fo = socket._fileobject(mock_sock, **kwargs)
886 self.assertEquals(fo.readline(size), "This is the first line\n")
887 self.assertEquals(fo.readline(size), "And the second line is here\n")
888
889 def _test_read(self, size=-1, **kwargs):
890 mock_sock = self.MockSocket(recv_funcs=[
891 lambda : "This is the first line\nAnd the sec",
892 self._raise_eintr,
893 lambda : "ond line is here\n",
894 lambda : "",
895 ])
896 fo = socket._fileobject(mock_sock, **kwargs)
897 self.assertEquals(fo.read(size), "This is the first line\n"
898 "And the second line is here\n")
899
900 def test_default(self):
901 self._test_readline()
902 self._test_readline(size=100)
903 self._test_read()
904 self._test_read(size=100)
905
906 def test_with_1k_buffer(self):
907 self._test_readline(bufsize=1024)
908 self._test_readline(size=100, bufsize=1024)
909 self._test_read(bufsize=1024)
910 self._test_read(size=100, bufsize=1024)
911
912 def _test_readline_no_buffer(self, size=-1):
913 mock_sock = self.MockSocket(recv_funcs=[
914 lambda : "aa",
915 lambda : "\n",
916 lambda : "BB",
917 self._raise_eintr,
918 lambda : "bb",
919 lambda : "",
920 ])
921 fo = socket._fileobject(mock_sock, bufsize=0)
922 self.assertEquals(fo.readline(size), "aa\n")
923 self.assertEquals(fo.readline(size), "BBbb")
924
925 def test_no_buffer(self):
926 self._test_readline_no_buffer()
927 self._test_readline_no_buffer(size=4)
928 self._test_read(bufsize=0)
929 self._test_read(size=100, bufsize=0)
930
931
Guido van Rossume9f66142002-08-07 15:46:19 +0000932class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
933
934 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000935
Guido van Rossume9f66142002-08-07 15:46:19 +0000936 In this case (and in this case only), it should be possible to
937 create a file object, read a line from it, create another file
938 object, read another line from it, without loss of data in the
939 first file object's buffer. Note that httplib relies on this
940 when reading multiple requests from the same socket."""
941
942 bufsize = 0 # Use unbuffered mode
943
944 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000945 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000946 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000947 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000948 self.serv_file = self.cli_conn.makefile('rb', 0)
949 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000950 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000951
952 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000953 self.cli_file.write("A. " + MSG)
954 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000955 self.cli_file.flush()
956
Guido van Rossum8c943832002-08-08 01:00:28 +0000957class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
958
959 bufsize = 1 # Default-buffered for reading; line-buffered for writing
960
961
962class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
963
964 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000965
Georg Brandldd7b0522007-01-21 10:35:10 +0000966
Facundo Batista07c78be2007-03-23 18:54:07 +0000967class NetworkConnectionTest(object):
968 """Prove network connection."""
969 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000970 # We're inherited below by BasicTCPTest2, which also inherits
971 # BasicTCPTest, which defines self.port referenced below.
972 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +0000973 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000974
Facundo Batista07c78be2007-03-23 18:54:07 +0000975class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
976 """Tests that NetworkConnection does not break existing TCP functionality.
977 """
978
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000979class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000980 def testWithoutServer(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000981 port = test_support.find_unused_port()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000982 self.assertRaises(
Trent Nelsone41b0062008-04-08 23:47:30 +0000983 socket.error,
984 lambda: socket.create_connection((HOST, port))
985 )
Facundo Batista07c78be2007-03-23 18:54:07 +0000986
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000987class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
988
989 def __init__(self, methodName='runTest'):
990 SocketTCPTest.__init__(self, methodName=methodName)
991 ThreadableTest.__init__(self)
992
993 def clientSetUp(self):
994 pass
995
996 def clientTearDown(self):
997 self.cli.close()
998 self.cli = None
999 ThreadableTest.clientTearDown(self)
1000
1001 def _justAccept(self):
1002 conn, addr = self.serv.accept()
1003
1004 testFamily = _justAccept
1005 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001006 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001007 self.assertEqual(self.cli.family, 2)
1008
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001009 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001010 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001011 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001012 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001013 socket.setdefaulttimeout(42)
1014 try:
1015 self.cli = socket.create_connection((HOST, self.port))
1016 finally:
1017 socket.setdefaulttimeout(None)
1018 self.assertEquals(self.cli.gettimeout(), 42)
1019
1020 testTimeoutNone = _justAccept
1021 def _testTimeoutNone(self):
1022 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001023 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001024 socket.setdefaulttimeout(30)
1025 try:
1026 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1027 finally:
1028 socket.setdefaulttimeout(None)
1029 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001030
1031 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001032 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001033 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001034 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001035
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001036 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001037 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001038 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001039 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001040
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001041class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1042
1043 def __init__(self, methodName='runTest'):
1044 SocketTCPTest.__init__(self, methodName=methodName)
1045 ThreadableTest.__init__(self)
1046
1047 def clientSetUp(self):
1048 pass
1049
1050 def clientTearDown(self):
1051 self.cli.close()
1052 self.cli = None
1053 ThreadableTest.clientTearDown(self)
1054
Facundo Batista07c78be2007-03-23 18:54:07 +00001055 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001056 conn, addr = self.serv.accept()
1057 time.sleep(3)
1058 conn.send("done!")
1059 testOutsideTimeout = testInsideTimeout
1060
1061 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001062 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001063 data = sock.recv(5)
1064 self.assertEqual(data, "done!")
1065
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001066 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001067 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001068 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001069
1070
Georg Brandldd7b0522007-01-21 10:35:10 +00001071class Urllib2FileobjectTest(unittest.TestCase):
1072
1073 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1074 # it close the socket if the close c'tor argument is true
1075
1076 def testClose(self):
1077 class MockSocket:
1078 closed = False
1079 def flush(self): pass
1080 def close(self): self.closed = True
1081
1082 # must not close unless we request it: the original use of _fileobject
1083 # by module socket requires that the underlying socket not be closed until
1084 # the _socketobject that created the _fileobject is closed
1085 s = MockSocket()
1086 f = socket._fileobject(s)
1087 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001088 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001089
1090 s = MockSocket()
1091 f = socket._fileobject(s, close=True)
1092 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001093 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001094
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001095class TCPTimeoutTest(SocketTCPTest):
1096
1097 def testTCPTimeout(self):
1098 def raise_timeout(*args, **kwargs):
1099 self.serv.settimeout(1.0)
1100 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001101 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001102 "Error generating a timeout exception (TCP)")
1103
1104 def testTimeoutZero(self):
1105 ok = False
1106 try:
1107 self.serv.settimeout(0.0)
1108 foo = self.serv.accept()
1109 except socket.timeout:
1110 self.fail("caught timeout instead of error (TCP)")
1111 except socket.error:
1112 ok = True
1113 except:
1114 self.fail("caught unexpected exception (TCP)")
1115 if not ok:
1116 self.fail("accept() returned success when we did not expect it")
1117
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001118 def testInterruptedTimeout(self):
1119 # XXX I don't know how to do this test on MSWindows or any other
1120 # plaform that doesn't support signal.alarm() or os.kill(), though
1121 # the bug should have existed on all platforms.
1122 if not hasattr(signal, "alarm"):
1123 return # can only test on *nix
1124 self.serv.settimeout(5.0) # must be longer than alarm
1125 class Alarm(Exception):
1126 pass
1127 def alarm_handler(signal, frame):
1128 raise Alarm
1129 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1130 try:
1131 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1132 try:
1133 foo = self.serv.accept()
1134 except socket.timeout:
1135 self.fail("caught timeout instead of Alarm")
1136 except Alarm:
1137 pass
1138 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001139 self.fail("caught other exception instead of Alarm:"
1140 " %s(%s):\n%s" %
1141 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001142 else:
1143 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001144 finally:
1145 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001146 except Alarm:
1147 self.fail("got Alarm in wrong place")
1148 finally:
1149 # no alarm can be pending. Safe to restore old handler.
1150 signal.signal(signal.SIGALRM, old_alarm)
1151
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001152class UDPTimeoutTest(SocketTCPTest):
1153
1154 def testUDPTimeout(self):
1155 def raise_timeout(*args, **kwargs):
1156 self.serv.settimeout(1.0)
1157 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001158 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001159 "Error generating a timeout exception (UDP)")
1160
1161 def testTimeoutZero(self):
1162 ok = False
1163 try:
1164 self.serv.settimeout(0.0)
1165 foo = self.serv.recv(1024)
1166 except socket.timeout:
1167 self.fail("caught timeout instead of error (UDP)")
1168 except socket.error:
1169 ok = True
1170 except:
1171 self.fail("caught unexpected exception (UDP)")
1172 if not ok:
1173 self.fail("recv() returned success when we did not expect it")
1174
1175class TestExceptions(unittest.TestCase):
1176
1177 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001178 self.assertTrue(issubclass(socket.error, Exception))
1179 self.assertTrue(issubclass(socket.herror, socket.error))
1180 self.assertTrue(issubclass(socket.gaierror, socket.error))
1181 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001182
Armin Rigoa9017c32006-04-19 11:50:27 +00001183class TestLinuxAbstractNamespace(unittest.TestCase):
1184
1185 UNIX_PATH_MAX = 108
1186
1187 def testLinuxAbstractNamespace(self):
1188 address = "\x00python-test-hello\x00\xff"
1189 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1190 s1.bind(address)
1191 s1.listen(1)
1192 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1193 s2.connect(s1.getsockname())
1194 s1.accept()
1195 self.assertEqual(s1.getsockname(), address)
1196 self.assertEqual(s2.getpeername(), address)
1197
1198 def testMaxName(self):
1199 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1200 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1201 s.bind(address)
1202 self.assertEqual(s.getsockname(), address)
1203
1204 def testNameOverflow(self):
1205 address = "\x00" + "h" * self.UNIX_PATH_MAX
1206 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1207 self.assertRaises(socket.error, s.bind, address)
1208
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001209
Martin Blais2856e5f2006-05-26 12:03:27 +00001210class BufferIOTest(SocketConnectedTest):
1211 """
1212 Test the buffer versions of socket.recv() and socket.send().
1213 """
1214 def __init__(self, methodName='runTest'):
1215 SocketConnectedTest.__init__(self, methodName=methodName)
1216
Martin Blaisaf2ae722006-06-04 13:49:49 +00001217 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001218 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001219 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001220 self.assertEqual(nbytes, len(MSG))
1221 msg = buf.tostring()[:len(MSG)]
1222 self.assertEqual(msg, MSG)
1223
Martin Blaisaf2ae722006-06-04 13:49:49 +00001224 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001225 buf = buffer(MSG)
1226 self.serv_conn.send(buf)
1227
Martin Blaisaf2ae722006-06-04 13:49:49 +00001228 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001229 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001230 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001231 self.assertEqual(nbytes, len(MSG))
1232 msg = buf.tostring()[:len(MSG)]
1233 self.assertEqual(msg, MSG)
1234
Martin Blaisaf2ae722006-06-04 13:49:49 +00001235 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001236 buf = buffer(MSG)
1237 self.serv_conn.send(buf)
1238
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001239
1240TIPC_STYPE = 2000
1241TIPC_LOWER = 200
1242TIPC_UPPER = 210
1243
1244def isTipcAvailable():
1245 """Check if the TIPC module is loaded
1246
1247 The TIPC module is not loaded automatically on Ubuntu and probably
1248 other Linux distros.
1249 """
1250 if not hasattr(socket, "AF_TIPC"):
1251 return False
1252 if not os.path.isfile("/proc/modules"):
1253 return False
1254 with open("/proc/modules") as f:
1255 for line in f:
1256 if line.startswith("tipc "):
1257 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001258 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001259 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1260 return False
1261
1262class TIPCTest (unittest.TestCase):
1263 def testRDM(self):
1264 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1265 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1266
1267 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1268 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1269 TIPC_LOWER, TIPC_UPPER)
1270 srv.bind(srvaddr)
1271
1272 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1273 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1274 cli.sendto(MSG, sendaddr)
1275
1276 msg, recvaddr = srv.recvfrom(1024)
1277
1278 self.assertEqual(cli.getsockname(), recvaddr)
1279 self.assertEqual(msg, MSG)
1280
1281
1282class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1283 def __init__(self, methodName = 'runTest'):
1284 unittest.TestCase.__init__(self, methodName = methodName)
1285 ThreadableTest.__init__(self)
1286
1287 def setUp(self):
1288 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1289 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1290 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1291 TIPC_LOWER, TIPC_UPPER)
1292 self.srv.bind(srvaddr)
1293 self.srv.listen(5)
1294 self.serverExplicitReady()
1295 self.conn, self.connaddr = self.srv.accept()
1296
1297 def clientSetUp(self):
1298 # The is a hittable race between serverExplicitReady() and the
1299 # accept() call; sleep a little while to avoid it, otherwise
1300 # we could get an exception
1301 time.sleep(0.1)
1302 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1303 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1304 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1305 self.cli.connect(addr)
1306 self.cliaddr = self.cli.getsockname()
1307
1308 def testStream(self):
1309 msg = self.conn.recv(1024)
1310 self.assertEqual(msg, MSG)
1311 self.assertEqual(self.cliaddr, self.connaddr)
1312
1313 def _testStream(self):
1314 self.cli.send(MSG)
1315 self.cli.close()
1316
1317
Guido van Rossumb995eb72002-07-31 16:08:40 +00001318def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001319 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001320 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001321 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001322 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001323
1324 tests.extend([
1325 NonBlockingTCPTests,
1326 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001327 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001328 UnbufferedFileObjectClassTestCase,
1329 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001330 SmallBufferedFileObjectClassTestCase,
1331 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001332 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001333 NetworkConnectionAttributesTest,
1334 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001335 ])
Dave Cole331708b2004-08-09 04:51:41 +00001336 if hasattr(socket, "socketpair"):
1337 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001338 if sys.platform == 'linux2':
1339 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001340 if isTipcAvailable():
1341 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001342 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001343
1344 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001345 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001346 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001347
1348if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001349 test_main()