blob: 59415aec712e7140de271abc7246a551dd3cd7d3 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001#!/usr/bin/env python
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00004from test import test_support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import time
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import thread, threading
10import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000011import sys
Martin Blais2856e5f2006-05-26 12:03:27 +000012import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000013from weakref import proxy
Barry Warsawcf3d4b51997-01-03 20:03:32 +000014
Guido van Rossum24e4af82002-06-12 19:18:08 +000015PORT = 50007
16HOST = 'localhost'
17MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Guido van Rossum24e4af82002-06-12 19:18:08 +000019class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000020
Guido van Rossum24e4af82002-06-12 19:18:08 +000021 def setUp(self):
22 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
23 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
24 self.serv.bind((HOST, PORT))
25 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000026
Guido van Rossum24e4af82002-06-12 19:18:08 +000027 def tearDown(self):
28 self.serv.close()
29 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000030
Guido van Rossum24e4af82002-06-12 19:18:08 +000031class SocketUDPTest(unittest.TestCase):
32
33 def setUp(self):
34 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
35 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
36 self.serv.bind((HOST, PORT))
37
38 def tearDown(self):
39 self.serv.close()
40 self.serv = None
41
42class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000043 """Threadable Test class
44
45 The ThreadableTest class makes it easy to create a threaded
46 client/server pair from an existing unit test. To create a
47 new threaded class from an existing unit test, use multiple
48 inheritance:
49
50 class NewClass (OldClass, ThreadableTest):
51 pass
52
53 This class defines two new fixture functions with obvious
54 purposes for overriding:
55
56 clientSetUp ()
57 clientTearDown ()
58
59 Any new test functions within the class must then define
60 tests in pairs, where the test name is preceeded with a
61 '_' to indicate the client portion of the test. Ex:
62
63 def testFoo(self):
64 # Server portion
65
66 def _testFoo(self):
67 # Client portion
68
69 Any exceptions raised by the clients during their tests
70 are caught and transferred to the main thread to alert
71 the testing framework.
72
73 Note, the server setup function cannot call any blocking
74 functions that rely on the client thread during setup,
75 unless serverExplicityReady() is called just before
76 the blocking call (such as in setting up a client/server
77 connection and performing the accept() in setUp().
78 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000079
80 def __init__(self):
81 # Swap the true setup function
82 self.__setUp = self.setUp
83 self.__tearDown = self.tearDown
84 self.setUp = self._setUp
85 self.tearDown = self._tearDown
86
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000087 def serverExplicitReady(self):
88 """This method allows the server to explicitly indicate that
89 it wants the client thread to proceed. This is useful if the
90 server is about to execute a blocking routine that is
91 dependent upon the client thread during its setup routine."""
92 self.server_ready.set()
93
Guido van Rossum24e4af82002-06-12 19:18:08 +000094 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000095 self.server_ready = threading.Event()
96 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000097 self.done = threading.Event()
98 self.queue = Queue.Queue(1)
99
100 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000101 methodname = self.id()
102 i = methodname.rfind('.')
103 methodname = methodname[i+1:]
104 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000105 self.client_thread = thread.start_new_thread(
106 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000107
108 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000109 if not self.server_ready.isSet():
110 self.server_ready.set()
111 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000112
113 def _tearDown(self):
114 self.__tearDown()
115 self.done.wait()
116
117 if not self.queue.empty():
118 msg = self.queue.get()
119 self.fail(msg)
120
121 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000122 self.server_ready.wait()
123 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000124 self.clientSetUp()
125 if not callable(test_func):
126 raise TypeError, "test_func must be a callable function"
127 try:
128 test_func()
129 except Exception, strerror:
130 self.queue.put(strerror)
131 self.clientTearDown()
132
133 def clientSetUp(self):
134 raise NotImplementedError, "clientSetUp must be implemented."
135
136 def clientTearDown(self):
137 self.done.set()
138 thread.exit()
139
140class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
141
142 def __init__(self, methodName='runTest'):
143 SocketTCPTest.__init__(self, methodName=methodName)
144 ThreadableTest.__init__(self)
145
146 def clientSetUp(self):
147 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
148
149 def clientTearDown(self):
150 self.cli.close()
151 self.cli = None
152 ThreadableTest.clientTearDown(self)
153
154class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
155
156 def __init__(self, methodName='runTest'):
157 SocketUDPTest.__init__(self, methodName=methodName)
158 ThreadableTest.__init__(self)
159
160 def clientSetUp(self):
161 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
162
163class SocketConnectedTest(ThreadedTCPSocketTest):
164
165 def __init__(self, methodName='runTest'):
166 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
167
168 def setUp(self):
169 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000170 # Indicate explicitly we're ready for the client thread to
171 # proceed and then perform the blocking call to accept
172 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000173 conn, addr = self.serv.accept()
174 self.cli_conn = conn
175
176 def tearDown(self):
177 self.cli_conn.close()
178 self.cli_conn = None
179 ThreadedTCPSocketTest.tearDown(self)
180
181 def clientSetUp(self):
182 ThreadedTCPSocketTest.clientSetUp(self)
183 self.cli.connect((HOST, PORT))
184 self.serv_conn = self.cli
185
186 def clientTearDown(self):
187 self.serv_conn.close()
188 self.serv_conn = None
189 ThreadedTCPSocketTest.clientTearDown(self)
190
Dave Cole331708b2004-08-09 04:51:41 +0000191class SocketPairTest(unittest.TestCase, ThreadableTest):
192
193 def __init__(self, methodName='runTest'):
194 unittest.TestCase.__init__(self, methodName=methodName)
195 ThreadableTest.__init__(self)
196
197 def setUp(self):
198 self.serv, self.cli = socket.socketpair()
199
200 def tearDown(self):
201 self.serv.close()
202 self.serv = None
203
204 def clientSetUp(self):
205 pass
206
207 def clientTearDown(self):
208 self.cli.close()
209 self.cli = None
210 ThreadableTest.clientTearDown(self)
211
Tim Peters494aaee2004-08-09 18:54:11 +0000212
Guido van Rossum24e4af82002-06-12 19:18:08 +0000213#######################################################################
214## Begin Tests
215
216class GeneralModuleTests(unittest.TestCase):
217
Raymond Hettinger027bb632004-05-31 03:09:25 +0000218 def test_weakref(self):
219 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
220 p = proxy(s)
221 self.assertEqual(p.fileno(), s.fileno())
222 s.close()
223 s = None
224 try:
225 p.fileno()
226 except ReferenceError:
227 pass
228 else:
229 self.fail('Socket proxy still exists')
230
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000232 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 def raise_error(*args, **kwargs):
234 raise socket.error
235 def raise_herror(*args, **kwargs):
236 raise socket.herror
237 def raise_gaierror(*args, **kwargs):
238 raise socket.gaierror
239 self.failUnlessRaises(socket.error, raise_error,
240 "Error raising socket exception.")
241 self.failUnlessRaises(socket.error, raise_herror,
242 "Error raising socket exception.")
243 self.failUnlessRaises(socket.error, raise_gaierror,
244 "Error raising socket exception.")
245
246 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000247 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000248 socket.AF_INET
249 socket.SOCK_STREAM
250 socket.SOCK_DGRAM
251 socket.SOCK_RAW
252 socket.SOCK_RDM
253 socket.SOCK_SEQPACKET
254 socket.SOL_SOCKET
255 socket.SO_REUSEADDR
256
Guido van Rossum654c11e2002-06-13 20:24:17 +0000257 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000258 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000259 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000260 try:
261 ip = socket.gethostbyname(hostname)
262 except socket.error:
263 # Probably name lookup wasn't set up right; skip this test
264 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000265 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000266 try:
267 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
268 except socket.error:
269 # Probably a similar problem as above; skip this test
270 return
Brett Cannon01668a12005-03-11 00:04:17 +0000271 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000272 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000273 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000274 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000275
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000276 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000277 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278 import sys
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
Barry Warsaw11b91a02004-06-28 00:50:43 +0000310 def testGetServBy(self):
311 eq = self.assertEqual
312 # Find one service that exists, then check all the related interfaces.
313 # I've ordered this by protocols that have both a tcp and udp
314 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000315 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Chang4e422812005-07-17 02:36:59 +0000316 'freebsd7', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000317 # avoid the 'echo' service on this platform, as there is an
318 # assumption breaking non-standard port/protocol entry
319 services = ('daytime', 'qotd', 'domain')
320 else:
321 services = ('echo', 'daytime', 'domain')
322 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000323 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000324 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000325 break
326 except socket.error:
327 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000328 else:
329 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000330 # Try same call with optional protocol omitted
331 port2 = socket.getservbyname(service)
332 eq(port, port2)
333 # Try udp, but don't barf it it doesn't exist
334 try:
335 udpport = socket.getservbyname(service, 'udp')
336 except socket.error:
337 udpport = None
338 else:
339 eq(udpport, port)
340 # Now make sure the lookup by port returns the same service name
341 eq(socket.getservbyport(port2), service)
342 eq(socket.getservbyport(port, 'tcp'), service)
343 if udpport is not None:
344 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000345
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000346 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000347 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000348 # The default timeout should initially be None
349 self.assertEqual(socket.getdefaulttimeout(), None)
350 s = socket.socket()
351 self.assertEqual(s.gettimeout(), None)
352 s.close()
353
354 # Set the default timeout to 10, and see if it propagates
355 socket.setdefaulttimeout(10)
356 self.assertEqual(socket.getdefaulttimeout(), 10)
357 s = socket.socket()
358 self.assertEqual(s.gettimeout(), 10)
359 s.close()
360
361 # Reset the default timeout to None, and see if it propagates
362 socket.setdefaulttimeout(None)
363 self.assertEqual(socket.getdefaulttimeout(), None)
364 s = socket.socket()
365 self.assertEqual(s.gettimeout(), None)
366 s.close()
367
368 # Check that setting it to an invalid value raises ValueError
369 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
370
371 # Check that setting it to an invalid type raises TypeError
372 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
373
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000374 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000375 if not hasattr(socket, 'inet_pton'):
376 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000377 from socket import inet_aton as f, inet_pton, AF_INET
378 g = lambda a: inet_pton(AF_INET, a)
379
380 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
381 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
382 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
383 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000384 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000385
386 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
387 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
388 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000389 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000390
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000391 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000392 if not hasattr(socket, 'inet_pton'):
393 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000394 try:
395 from socket import inet_pton, AF_INET6, has_ipv6
396 if not has_ipv6:
397 return
398 except ImportError:
399 return
400 f = lambda a: inet_pton(AF_INET6, a)
401
402 self.assertEquals('\x00' * 16, f('::'))
403 self.assertEquals('\x00' * 16, f('0::0'))
404 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
405 self.assertEquals(
406 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
407 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
408 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000409
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000410 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000411 if not hasattr(socket, 'inet_ntop'):
412 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000413 from socket import inet_ntoa as f, inet_ntop, AF_INET
414 g = lambda a: inet_ntop(AF_INET, a)
415
416 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
417 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
418 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
419 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000420
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000421 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
422 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
423 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
424
425 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000426 if not hasattr(socket, 'inet_ntop'):
427 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000428 try:
429 from socket import inet_ntop, AF_INET6, has_ipv6
430 if not has_ipv6:
431 return
432 except ImportError:
433 return
434 f = lambda a: inet_ntop(AF_INET6, a)
435
436 self.assertEquals('::', f('\x00' * 16))
437 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
438 self.assertEquals(
439 'aef:b01:506:1001:ffff:9997:55:170',
440 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
441 )
442
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000443 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000444
Guido van Rossum24e4af82002-06-12 19:18:08 +0000445 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000446 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000447 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000448 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000449 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000450 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
451 # it reasonable to get the host's addr in addition to 0.0.0.0.
452 # At least for eCos. This is required for the S/390 to pass.
453 my_ip_addr = socket.gethostbyname(socket.gethostname())
454 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
455 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000456
457 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000458 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000459 # We know a socket should start without reuse==0
460 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
461 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000462 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000463
464 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000465 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000466 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
467 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
468 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000469 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000470
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000471 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000472 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000473 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
474 sock.settimeout(1)
475 sock.close()
476 self.assertRaises(socket.error, sock.send, "spam")
477
Georg Brandlbb03ac02006-03-21 18:17:25 +0000478 def testNewAttributes(self):
479 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000480 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000481 self.assertEqual(sock.family, socket.AF_INET)
482 self.assertEqual(sock.type, socket.SOCK_STREAM)
483 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000484 sock.close()
485
Guido van Rossum24e4af82002-06-12 19:18:08 +0000486class BasicTCPTest(SocketConnectedTest):
487
488 def __init__(self, methodName='runTest'):
489 SocketConnectedTest.__init__(self, methodName=methodName)
490
491 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000492 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000493 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000494 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495
496 def _testRecv(self):
497 self.serv_conn.send(MSG)
498
499 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000500 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000501 seg1 = self.cli_conn.recv(len(MSG) - 3)
502 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000503 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000504 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000505
506 def _testOverFlowRecv(self):
507 self.serv_conn.send(MSG)
508
509 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000510 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000511 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000512 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513
514 def _testRecvFrom(self):
515 self.serv_conn.send(MSG)
516
517 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000518 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
520 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000521 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000522 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000523
524 def _testOverFlowRecvFrom(self):
525 self.serv_conn.send(MSG)
526
527 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000528 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000529 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530 while 1:
531 read = self.cli_conn.recv(1024)
532 if not read:
533 break
Guido van Rossume531e292002-08-08 20:28:34 +0000534 msg += read
535 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000536
537 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000538 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539 self.serv_conn.sendall(big_chunk)
540
541 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000542 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000543 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000544 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000545 fd = self.cli_conn.fileno()
546 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
547 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000548 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000549
550 def _testFromFd(self):
551 self.serv_conn.send(MSG)
552
553 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000554 # Testing shutdown()
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 _testShutdown(self):
559 self.serv_conn.send(MSG)
560 self.serv_conn.shutdown(2)
561
562class BasicUDPTest(ThreadedUDPSocketTest):
563
564 def __init__(self, methodName='runTest'):
565 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
566
567 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000568 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000569 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000570 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571
572 def _testSendtoAndRecv(self):
573 self.cli.sendto(MSG, 0, (HOST, PORT))
574
Guido van Rossum1c938012002-06-12 21:17:20 +0000575 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000576 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000577 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000578 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000579
Guido van Rossum1c938012002-06-12 21:17:20 +0000580 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000581 self.cli.sendto(MSG, 0, (HOST, PORT))
582
Dave Cole331708b2004-08-09 04:51:41 +0000583class BasicSocketPairTest(SocketPairTest):
584
585 def __init__(self, methodName='runTest'):
586 SocketPairTest.__init__(self, methodName=methodName)
587
588 def testRecv(self):
589 msg = self.serv.recv(1024)
590 self.assertEqual(msg, MSG)
591
592 def _testRecv(self):
593 self.cli.send(MSG)
594
595 def testSend(self):
596 self.serv.send(MSG)
597
598 def _testSend(self):
599 msg = self.cli.recv(1024)
600 self.assertEqual(msg, MSG)
601
Guido van Rossum24e4af82002-06-12 19:18:08 +0000602class NonBlockingTCPTests(ThreadedTCPSocketTest):
603
604 def __init__(self, methodName='runTest'):
605 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
606
607 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000608 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000609 self.serv.setblocking(0)
610 start = time.time()
611 try:
612 self.serv.accept()
613 except socket.error:
614 pass
615 end = time.time()
616 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
617
618 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000619 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000620
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000622 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000623 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000624 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000625 conn, addr = self.serv.accept()
626 except socket.error:
627 pass
628 else:
629 self.fail("Error trying to do non-blocking accept.")
630 read, write, err = select.select([self.serv], [], [])
631 if self.serv in read:
632 conn, addr = self.serv.accept()
633 else:
634 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000635
Guido van Rossum24e4af82002-06-12 19:18:08 +0000636 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000637 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000638 self.cli.connect((HOST, PORT))
639
640 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000641 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000642 conn, addr = self.serv.accept()
643
644 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000645 self.cli.settimeout(10)
646 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000647
648 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000649 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650 conn, addr = self.serv.accept()
651 conn.setblocking(0)
652 try:
653 msg = conn.recv(len(MSG))
654 except socket.error:
655 pass
656 else:
657 self.fail("Error trying to do non-blocking recv.")
658 read, write, err = select.select([conn], [], [])
659 if conn in read:
660 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000661 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000662 else:
663 self.fail("Error during select call to non-blocking socket.")
664
665 def _testRecv(self):
666 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000667 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000668 self.cli.send(MSG)
669
670class FileObjectClassTestCase(SocketConnectedTest):
671
Guido van Rossume9f66142002-08-07 15:46:19 +0000672 bufsize = -1 # Use default buffer size
673
Guido van Rossum24e4af82002-06-12 19:18:08 +0000674 def __init__(self, methodName='runTest'):
675 SocketConnectedTest.__init__(self, methodName=methodName)
676
677 def setUp(self):
678 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000679 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000680
681 def tearDown(self):
682 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000683 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684 self.serv_file = None
685 SocketConnectedTest.tearDown(self)
686
687 def clientSetUp(self):
688 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000689 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000690
691 def clientTearDown(self):
692 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000693 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000694 self.cli_file = None
695 SocketConnectedTest.clientTearDown(self)
696
697 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000698 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000699 first_seg = self.serv_file.read(len(MSG)-3)
700 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000701 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000702 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703
704 def _testSmallRead(self):
705 self.cli_file.write(MSG)
706 self.cli_file.flush()
707
Guido van Rossum8c943832002-08-08 01:00:28 +0000708 def testFullRead(self):
709 # read until EOF
710 msg = self.serv_file.read()
711 self.assertEqual(msg, MSG)
712
713 def _testFullRead(self):
714 self.cli_file.write(MSG)
715 self.cli_file.close()
716
Guido van Rossum24e4af82002-06-12 19:18:08 +0000717 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000718 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000719 buf = ''
720 while 1:
721 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000722 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000723 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000724 buf += char
725 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000726
727 def _testUnbufferedRead(self):
728 self.cli_file.write(MSG)
729 self.cli_file.flush()
730
731 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000732 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000734 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735
736 def _testReadline(self):
737 self.cli_file.write(MSG)
738 self.cli_file.flush()
739
Tim Peters116d83c2004-03-28 02:20:45 +0000740 def testClosedAttr(self):
741 self.assert_(not self.serv_file.closed)
742
743 def _testClosedAttr(self):
744 self.assert_(not self.cli_file.closed)
745
Guido van Rossume9f66142002-08-07 15:46:19 +0000746class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
747
748 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000749
Guido van Rossume9f66142002-08-07 15:46:19 +0000750 In this case (and in this case only), it should be possible to
751 create a file object, read a line from it, create another file
752 object, read another line from it, without loss of data in the
753 first file object's buffer. Note that httplib relies on this
754 when reading multiple requests from the same socket."""
755
756 bufsize = 0 # Use unbuffered mode
757
758 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000759 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000760 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000761 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000762 self.serv_file = self.cli_conn.makefile('rb', 0)
763 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000764 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000765
766 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000767 self.cli_file.write("A. " + MSG)
768 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000769 self.cli_file.flush()
770
Guido van Rossum8c943832002-08-08 01:00:28 +0000771class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
772
773 bufsize = 1 # Default-buffered for reading; line-buffered for writing
774
775
776class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
777
778 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000779
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000780class TCPTimeoutTest(SocketTCPTest):
781
782 def testTCPTimeout(self):
783 def raise_timeout(*args, **kwargs):
784 self.serv.settimeout(1.0)
785 self.serv.accept()
786 self.failUnlessRaises(socket.timeout, raise_timeout,
787 "Error generating a timeout exception (TCP)")
788
789 def testTimeoutZero(self):
790 ok = False
791 try:
792 self.serv.settimeout(0.0)
793 foo = self.serv.accept()
794 except socket.timeout:
795 self.fail("caught timeout instead of error (TCP)")
796 except socket.error:
797 ok = True
798 except:
799 self.fail("caught unexpected exception (TCP)")
800 if not ok:
801 self.fail("accept() returned success when we did not expect it")
802
803class UDPTimeoutTest(SocketTCPTest):
804
805 def testUDPTimeout(self):
806 def raise_timeout(*args, **kwargs):
807 self.serv.settimeout(1.0)
808 self.serv.recv(1024)
809 self.failUnlessRaises(socket.timeout, raise_timeout,
810 "Error generating a timeout exception (UDP)")
811
812 def testTimeoutZero(self):
813 ok = False
814 try:
815 self.serv.settimeout(0.0)
816 foo = self.serv.recv(1024)
817 except socket.timeout:
818 self.fail("caught timeout instead of error (UDP)")
819 except socket.error:
820 ok = True
821 except:
822 self.fail("caught unexpected exception (UDP)")
823 if not ok:
824 self.fail("recv() returned success when we did not expect it")
825
826class TestExceptions(unittest.TestCase):
827
828 def testExceptionTree(self):
829 self.assert_(issubclass(socket.error, Exception))
830 self.assert_(issubclass(socket.herror, socket.error))
831 self.assert_(issubclass(socket.gaierror, socket.error))
832 self.assert_(issubclass(socket.timeout, socket.error))
833
Armin Rigoa9017c32006-04-19 11:50:27 +0000834class TestLinuxAbstractNamespace(unittest.TestCase):
835
836 UNIX_PATH_MAX = 108
837
838 def testLinuxAbstractNamespace(self):
839 address = "\x00python-test-hello\x00\xff"
840 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
841 s1.bind(address)
842 s1.listen(1)
843 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
844 s2.connect(s1.getsockname())
845 s1.accept()
846 self.assertEqual(s1.getsockname(), address)
847 self.assertEqual(s2.getpeername(), address)
848
849 def testMaxName(self):
850 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
851 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
852 s.bind(address)
853 self.assertEqual(s.getsockname(), address)
854
855 def testNameOverflow(self):
856 address = "\x00" + "h" * self.UNIX_PATH_MAX
857 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
858 self.assertRaises(socket.error, s.bind, address)
859
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000860
Martin Blais2856e5f2006-05-26 12:03:27 +0000861class BufferIOTest(SocketConnectedTest):
862 """
863 Test the buffer versions of socket.recv() and socket.send().
864 """
865 def __init__(self, methodName='runTest'):
866 SocketConnectedTest.__init__(self, methodName=methodName)
867
Martin Blaisaf2ae722006-06-04 13:49:49 +0000868 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000869 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +0000870 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +0000871 self.assertEqual(nbytes, len(MSG))
872 msg = buf.tostring()[:len(MSG)]
873 self.assertEqual(msg, MSG)
874
Martin Blaisaf2ae722006-06-04 13:49:49 +0000875 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000876 buf = buffer(MSG)
877 self.serv_conn.send(buf)
878
Martin Blaisaf2ae722006-06-04 13:49:49 +0000879 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000880 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +0000881 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +0000882 self.assertEqual(nbytes, len(MSG))
883 msg = buf.tostring()[:len(MSG)]
884 self.assertEqual(msg, MSG)
885
Martin Blaisaf2ae722006-06-04 13:49:49 +0000886 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000887 buf = buffer(MSG)
888 self.serv_conn.send(buf)
889
Guido van Rossumb995eb72002-07-31 16:08:40 +0000890def test_main():
Martin Blais2856e5f2006-05-26 12:03:27 +0000891 tests = [GeneralModuleTests, BasicTCPTest, TCPTimeoutTest, TestExceptions,
892 BufferIOTest]
Jack Jansen522e7692002-09-06 21:57:50 +0000893 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000894 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000895
896 tests.extend([
897 NonBlockingTCPTests,
898 FileObjectClassTestCase,
899 UnbufferedFileObjectClassTestCase,
900 LineBufferedFileObjectClassTestCase,
901 SmallBufferedFileObjectClassTestCase
902 ])
Dave Cole331708b2004-08-09 04:51:41 +0000903 if hasattr(socket, "socketpair"):
904 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +0000905 if sys.platform == 'linux2':
906 tests.append(TestLinuxAbstractNamespace)
Walter Dörwald21d3a322003-05-01 17:45:56 +0000907 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000908
909if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000910 test_main()