blob: e0aa58cc1cc84eea53807517c633448f018b1026 [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)
Neal Norwitz909eb122006-06-12 02:13:21 +000024 global PORT
25 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000026 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000027
Guido van Rossum24e4af82002-06-12 19:18:08 +000028 def tearDown(self):
29 self.serv.close()
30 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000031
Guido van Rossum24e4af82002-06-12 19:18:08 +000032class SocketUDPTest(unittest.TestCase):
33
34 def setUp(self):
35 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
36 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000037 global PORT
38 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000039
40 def tearDown(self):
41 self.serv.close()
42 self.serv = None
43
44class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000045 """Threadable Test class
46
47 The ThreadableTest class makes it easy to create a threaded
48 client/server pair from an existing unit test. To create a
49 new threaded class from an existing unit test, use multiple
50 inheritance:
51
52 class NewClass (OldClass, ThreadableTest):
53 pass
54
55 This class defines two new fixture functions with obvious
56 purposes for overriding:
57
58 clientSetUp ()
59 clientTearDown ()
60
61 Any new test functions within the class must then define
62 tests in pairs, where the test name is preceeded with a
63 '_' to indicate the client portion of the test. Ex:
64
65 def testFoo(self):
66 # Server portion
67
68 def _testFoo(self):
69 # Client portion
70
71 Any exceptions raised by the clients during their tests
72 are caught and transferred to the main thread to alert
73 the testing framework.
74
75 Note, the server setup function cannot call any blocking
76 functions that rely on the client thread during setup,
77 unless serverExplicityReady() is called just before
78 the blocking call (such as in setting up a client/server
79 connection and performing the accept() in setUp().
80 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000081
82 def __init__(self):
83 # Swap the true setup function
84 self.__setUp = self.setUp
85 self.__tearDown = self.tearDown
86 self.setUp = self._setUp
87 self.tearDown = self._tearDown
88
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000089 def serverExplicitReady(self):
90 """This method allows the server to explicitly indicate that
91 it wants the client thread to proceed. This is useful if the
92 server is about to execute a blocking routine that is
93 dependent upon the client thread during its setup routine."""
94 self.server_ready.set()
95
Guido van Rossum24e4af82002-06-12 19:18:08 +000096 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000097 self.server_ready = threading.Event()
98 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000099 self.done = threading.Event()
100 self.queue = Queue.Queue(1)
101
102 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000103 methodname = self.id()
104 i = methodname.rfind('.')
105 methodname = methodname[i+1:]
106 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000107 self.client_thread = thread.start_new_thread(
108 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000109
110 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 if not self.server_ready.isSet():
112 self.server_ready.set()
113 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000114
115 def _tearDown(self):
116 self.__tearDown()
117 self.done.wait()
118
119 if not self.queue.empty():
120 msg = self.queue.get()
121 self.fail(msg)
122
123 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000124 self.server_ready.wait()
125 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000126 self.clientSetUp()
127 if not callable(test_func):
128 raise TypeError, "test_func must be a callable function"
129 try:
130 test_func()
131 except Exception, strerror:
132 self.queue.put(strerror)
133 self.clientTearDown()
134
135 def clientSetUp(self):
136 raise NotImplementedError, "clientSetUp must be implemented."
137
138 def clientTearDown(self):
139 self.done.set()
140 thread.exit()
141
142class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
143
144 def __init__(self, methodName='runTest'):
145 SocketTCPTest.__init__(self, methodName=methodName)
146 ThreadableTest.__init__(self)
147
148 def clientSetUp(self):
149 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
150
151 def clientTearDown(self):
152 self.cli.close()
153 self.cli = None
154 ThreadableTest.clientTearDown(self)
155
156class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
157
158 def __init__(self, methodName='runTest'):
159 SocketUDPTest.__init__(self, methodName=methodName)
160 ThreadableTest.__init__(self)
161
162 def clientSetUp(self):
163 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
164
165class SocketConnectedTest(ThreadedTCPSocketTest):
166
167 def __init__(self, methodName='runTest'):
168 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
169
170 def setUp(self):
171 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000172 # Indicate explicitly we're ready for the client thread to
173 # proceed and then perform the blocking call to accept
174 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175 conn, addr = self.serv.accept()
176 self.cli_conn = conn
177
178 def tearDown(self):
179 self.cli_conn.close()
180 self.cli_conn = None
181 ThreadedTCPSocketTest.tearDown(self)
182
183 def clientSetUp(self):
184 ThreadedTCPSocketTest.clientSetUp(self)
185 self.cli.connect((HOST, PORT))
186 self.serv_conn = self.cli
187
188 def clientTearDown(self):
189 self.serv_conn.close()
190 self.serv_conn = None
191 ThreadedTCPSocketTest.clientTearDown(self)
192
Dave Cole331708b2004-08-09 04:51:41 +0000193class SocketPairTest(unittest.TestCase, ThreadableTest):
194
195 def __init__(self, methodName='runTest'):
196 unittest.TestCase.__init__(self, methodName=methodName)
197 ThreadableTest.__init__(self)
198
199 def setUp(self):
200 self.serv, self.cli = socket.socketpair()
201
202 def tearDown(self):
203 self.serv.close()
204 self.serv = None
205
206 def clientSetUp(self):
207 pass
208
209 def clientTearDown(self):
210 self.cli.close()
211 self.cli = None
212 ThreadableTest.clientTearDown(self)
213
Tim Peters494aaee2004-08-09 18:54:11 +0000214
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215#######################################################################
216## Begin Tests
217
218class GeneralModuleTests(unittest.TestCase):
219
Raymond Hettinger027bb632004-05-31 03:09:25 +0000220 def test_weakref(self):
221 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
222 p = proxy(s)
223 self.assertEqual(p.fileno(), s.fileno())
224 s.close()
225 s = None
226 try:
227 p.fileno()
228 except ReferenceError:
229 pass
230 else:
231 self.fail('Socket proxy still exists')
232
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000234 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000235 def raise_error(*args, **kwargs):
236 raise socket.error
237 def raise_herror(*args, **kwargs):
238 raise socket.herror
239 def raise_gaierror(*args, **kwargs):
240 raise socket.gaierror
241 self.failUnlessRaises(socket.error, raise_error,
242 "Error raising socket exception.")
243 self.failUnlessRaises(socket.error, raise_herror,
244 "Error raising socket exception.")
245 self.failUnlessRaises(socket.error, raise_gaierror,
246 "Error raising socket exception.")
247
248 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000249 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 socket.AF_INET
251 socket.SOCK_STREAM
252 socket.SOCK_DGRAM
253 socket.SOCK_RAW
254 socket.SOCK_RDM
255 socket.SOCK_SEQPACKET
256 socket.SOL_SOCKET
257 socket.SO_REUSEADDR
258
Guido van Rossum654c11e2002-06-13 20:24:17 +0000259 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000260 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000261 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000262 try:
263 ip = socket.gethostbyname(hostname)
264 except socket.error:
265 # Probably name lookup wasn't set up right; skip this test
266 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000267 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000268 try:
269 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
270 except socket.error:
271 # Probably a similar problem as above; skip this test
272 return
Brett Cannon01668a12005-03-11 00:04:17 +0000273 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000274 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000275 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000276 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000277
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000278 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000279 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000281 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000282 try:
283 # On some versions, this loses a reference
284 orig = sys.getrefcount(__name__)
285 socket.getnameinfo(__name__,0)
286 except SystemError:
287 if sys.getrefcount(__name__) <> orig:
288 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000289
Guido van Rossum24e4af82002-06-12 19:18:08 +0000290 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000291 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 try:
293 # On some versions, this crashes the interpreter.
294 socket.getnameinfo(('x', 0, 0, 0), 0)
295 except socket.error:
296 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000297
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000298 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000299 # This just checks that htons etc. are their own inverse,
300 # when looking at the lower 16 or 32 bits.
301 sizes = {socket.htonl: 32, socket.ntohl: 32,
302 socket.htons: 16, socket.ntohs: 16}
303 for func, size in sizes.items():
304 mask = (1L<<size) - 1
305 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
306 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000307
Guido van Rossuma2627af2002-09-14 00:58:46 +0000308 swapped = func(mask)
309 self.assertEqual(swapped & mask, mask)
310 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000311
Barry Warsaw11b91a02004-06-28 00:50:43 +0000312 def testGetServBy(self):
313 eq = self.assertEqual
314 # Find one service that exists, then check all the related interfaces.
315 # I've ordered this by protocols that have both a tcp and udp
316 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000317 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Chang4e422812005-07-17 02:36:59 +0000318 'freebsd7', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000319 # avoid the 'echo' service on this platform, as there is an
320 # assumption breaking non-standard port/protocol entry
321 services = ('daytime', 'qotd', 'domain')
322 else:
323 services = ('echo', 'daytime', 'domain')
324 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000325 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000326 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000327 break
328 except socket.error:
329 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000330 else:
331 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000332 # Try same call with optional protocol omitted
333 port2 = socket.getservbyname(service)
334 eq(port, port2)
335 # Try udp, but don't barf it it doesn't exist
336 try:
337 udpport = socket.getservbyname(service, 'udp')
338 except socket.error:
339 udpport = None
340 else:
341 eq(udpport, port)
342 # Now make sure the lookup by port returns the same service name
343 eq(socket.getservbyport(port2), service)
344 eq(socket.getservbyport(port, 'tcp'), service)
345 if udpport is not None:
346 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000347
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000348 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000349 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000350 # The default timeout should initially be None
351 self.assertEqual(socket.getdefaulttimeout(), None)
352 s = socket.socket()
353 self.assertEqual(s.gettimeout(), None)
354 s.close()
355
356 # Set the default timeout to 10, and see if it propagates
357 socket.setdefaulttimeout(10)
358 self.assertEqual(socket.getdefaulttimeout(), 10)
359 s = socket.socket()
360 self.assertEqual(s.gettimeout(), 10)
361 s.close()
362
363 # Reset the default timeout to None, and see if it propagates
364 socket.setdefaulttimeout(None)
365 self.assertEqual(socket.getdefaulttimeout(), None)
366 s = socket.socket()
367 self.assertEqual(s.gettimeout(), None)
368 s.close()
369
370 # Check that setting it to an invalid value raises ValueError
371 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
372
373 # Check that setting it to an invalid type raises TypeError
374 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
375
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000376 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000377 if not hasattr(socket, 'inet_pton'):
378 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000379 from socket import inet_aton as f, inet_pton, AF_INET
380 g = lambda a: inet_pton(AF_INET, a)
381
382 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
383 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
384 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
385 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000386 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000387
388 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
389 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
390 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000391 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000392
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000393 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000394 if not hasattr(socket, 'inet_pton'):
395 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000396 try:
397 from socket import inet_pton, AF_INET6, has_ipv6
398 if not has_ipv6:
399 return
400 except ImportError:
401 return
402 f = lambda a: inet_pton(AF_INET6, a)
403
404 self.assertEquals('\x00' * 16, f('::'))
405 self.assertEquals('\x00' * 16, f('0::0'))
406 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
407 self.assertEquals(
408 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
409 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
410 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000411
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000412 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000413 if not hasattr(socket, 'inet_ntop'):
414 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000415 from socket import inet_ntoa as f, inet_ntop, AF_INET
416 g = lambda a: inet_ntop(AF_INET, a)
417
418 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
419 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
420 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
421 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000422
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000423 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
424 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
425 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
426
427 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000428 if not hasattr(socket, 'inet_ntop'):
429 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000430 try:
431 from socket import inet_ntop, AF_INET6, has_ipv6
432 if not has_ipv6:
433 return
434 except ImportError:
435 return
436 f = lambda a: inet_ntop(AF_INET6, a)
437
438 self.assertEquals('::', f('\x00' * 16))
439 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
440 self.assertEquals(
441 'aef:b01:506:1001:ffff:9997:55:170',
442 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
443 )
444
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000445 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000446
Guido van Rossum24e4af82002-06-12 19:18:08 +0000447 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000448 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000449 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000450 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000451 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000452 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
453 # it reasonable to get the host's addr in addition to 0.0.0.0.
454 # At least for eCos. This is required for the S/390 to pass.
455 my_ip_addr = socket.gethostbyname(socket.gethostname())
456 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
457 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000458
459 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000460 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000461 # We know a socket should start without reuse==0
462 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
463 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000464 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465
466 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000467 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000468 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
469 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
470 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000471 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000472
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000473 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000474 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000475 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
476 sock.settimeout(1)
477 sock.close()
478 self.assertRaises(socket.error, sock.send, "spam")
479
Georg Brandlbb03ac02006-03-21 18:17:25 +0000480 def testNewAttributes(self):
481 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000482 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000483 self.assertEqual(sock.family, socket.AF_INET)
484 self.assertEqual(sock.type, socket.SOCK_STREAM)
485 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000486 sock.close()
487
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488class BasicTCPTest(SocketConnectedTest):
489
490 def __init__(self, methodName='runTest'):
491 SocketConnectedTest.__init__(self, methodName=methodName)
492
493 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000494 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000496 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000497
498 def _testRecv(self):
499 self.serv_conn.send(MSG)
500
501 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000502 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000503 seg1 = self.cli_conn.recv(len(MSG) - 3)
504 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000505 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000506 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000507
508 def _testOverFlowRecv(self):
509 self.serv_conn.send(MSG)
510
511 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000512 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000514 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000515
516 def _testRecvFrom(self):
517 self.serv_conn.send(MSG)
518
519 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000520 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
522 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000523 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000524 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525
526 def _testOverFlowRecvFrom(self):
527 self.serv_conn.send(MSG)
528
529 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000530 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000531 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532 while 1:
533 read = self.cli_conn.recv(1024)
534 if not read:
535 break
Guido van Rossume531e292002-08-08 20:28:34 +0000536 msg += read
537 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538
539 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000540 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000541 self.serv_conn.sendall(big_chunk)
542
543 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000544 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000545 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000546 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000547 fd = self.cli_conn.fileno()
548 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
549 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000550 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000551
552 def _testFromFd(self):
553 self.serv_conn.send(MSG)
554
555 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000556 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000558 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000559
560 def _testShutdown(self):
561 self.serv_conn.send(MSG)
562 self.serv_conn.shutdown(2)
563
564class BasicUDPTest(ThreadedUDPSocketTest):
565
566 def __init__(self, methodName='runTest'):
567 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
568
569 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000570 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000572 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573
574 def _testSendtoAndRecv(self):
575 self.cli.sendto(MSG, 0, (HOST, PORT))
576
Guido van Rossum1c938012002-06-12 21:17:20 +0000577 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000578 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000579 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000580 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000581
Guido van Rossum1c938012002-06-12 21:17:20 +0000582 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000583 self.cli.sendto(MSG, 0, (HOST, PORT))
584
Dave Cole331708b2004-08-09 04:51:41 +0000585class BasicSocketPairTest(SocketPairTest):
586
587 def __init__(self, methodName='runTest'):
588 SocketPairTest.__init__(self, methodName=methodName)
589
590 def testRecv(self):
591 msg = self.serv.recv(1024)
592 self.assertEqual(msg, MSG)
593
594 def _testRecv(self):
595 self.cli.send(MSG)
596
597 def testSend(self):
598 self.serv.send(MSG)
599
600 def _testSend(self):
601 msg = self.cli.recv(1024)
602 self.assertEqual(msg, MSG)
603
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604class NonBlockingTCPTests(ThreadedTCPSocketTest):
605
606 def __init__(self, methodName='runTest'):
607 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
608
609 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000610 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611 self.serv.setblocking(0)
612 start = time.time()
613 try:
614 self.serv.accept()
615 except socket.error:
616 pass
617 end = time.time()
618 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
619
620 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000621 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000622
Guido van Rossum24e4af82002-06-12 19:18:08 +0000623 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000624 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000625 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000626 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000627 conn, addr = self.serv.accept()
628 except socket.error:
629 pass
630 else:
631 self.fail("Error trying to do non-blocking accept.")
632 read, write, err = select.select([self.serv], [], [])
633 if self.serv in read:
634 conn, addr = self.serv.accept()
635 else:
636 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000637
Guido van Rossum24e4af82002-06-12 19:18:08 +0000638 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000639 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640 self.cli.connect((HOST, PORT))
641
642 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000643 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000644 conn, addr = self.serv.accept()
645
646 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000647 self.cli.settimeout(10)
648 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649
650 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000651 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000652 conn, addr = self.serv.accept()
653 conn.setblocking(0)
654 try:
655 msg = conn.recv(len(MSG))
656 except socket.error:
657 pass
658 else:
659 self.fail("Error trying to do non-blocking recv.")
660 read, write, err = select.select([conn], [], [])
661 if conn in read:
662 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000663 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000664 else:
665 self.fail("Error during select call to non-blocking socket.")
666
667 def _testRecv(self):
668 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000669 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000670 self.cli.send(MSG)
671
672class FileObjectClassTestCase(SocketConnectedTest):
673
Guido van Rossume9f66142002-08-07 15:46:19 +0000674 bufsize = -1 # Use default buffer size
675
Guido van Rossum24e4af82002-06-12 19:18:08 +0000676 def __init__(self, methodName='runTest'):
677 SocketConnectedTest.__init__(self, methodName=methodName)
678
679 def setUp(self):
680 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000681 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000682
683 def tearDown(self):
684 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000685 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000686 self.serv_file = None
687 SocketConnectedTest.tearDown(self)
688
689 def clientSetUp(self):
690 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000691 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000692
693 def clientTearDown(self):
694 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000695 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696 self.cli_file = None
697 SocketConnectedTest.clientTearDown(self)
698
699 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000700 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 first_seg = self.serv_file.read(len(MSG)-3)
702 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000703 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000704 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705
706 def _testSmallRead(self):
707 self.cli_file.write(MSG)
708 self.cli_file.flush()
709
Guido van Rossum8c943832002-08-08 01:00:28 +0000710 def testFullRead(self):
711 # read until EOF
712 msg = self.serv_file.read()
713 self.assertEqual(msg, MSG)
714
715 def _testFullRead(self):
716 self.cli_file.write(MSG)
717 self.cli_file.close()
718
Guido van Rossum24e4af82002-06-12 19:18:08 +0000719 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000720 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721 buf = ''
722 while 1:
723 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000724 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000725 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000726 buf += char
727 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728
729 def _testUnbufferedRead(self):
730 self.cli_file.write(MSG)
731 self.cli_file.flush()
732
733 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000734 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000736 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737
738 def _testReadline(self):
739 self.cli_file.write(MSG)
740 self.cli_file.flush()
741
Tim Peters116d83c2004-03-28 02:20:45 +0000742 def testClosedAttr(self):
743 self.assert_(not self.serv_file.closed)
744
745 def _testClosedAttr(self):
746 self.assert_(not self.cli_file.closed)
747
Guido van Rossume9f66142002-08-07 15:46:19 +0000748class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
749
750 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000751
Guido van Rossume9f66142002-08-07 15:46:19 +0000752 In this case (and in this case only), it should be possible to
753 create a file object, read a line from it, create another file
754 object, read another line from it, without loss of data in the
755 first file object's buffer. Note that httplib relies on this
756 when reading multiple requests from the same socket."""
757
758 bufsize = 0 # Use unbuffered mode
759
760 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000761 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000762 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000763 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000764 self.serv_file = self.cli_conn.makefile('rb', 0)
765 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000766 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000767
768 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000769 self.cli_file.write("A. " + MSG)
770 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000771 self.cli_file.flush()
772
Guido van Rossum8c943832002-08-08 01:00:28 +0000773class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
774
775 bufsize = 1 # Default-buffered for reading; line-buffered for writing
776
777
778class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
779
780 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000781
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000782class TCPTimeoutTest(SocketTCPTest):
783
784 def testTCPTimeout(self):
785 def raise_timeout(*args, **kwargs):
786 self.serv.settimeout(1.0)
787 self.serv.accept()
788 self.failUnlessRaises(socket.timeout, raise_timeout,
789 "Error generating a timeout exception (TCP)")
790
791 def testTimeoutZero(self):
792 ok = False
793 try:
794 self.serv.settimeout(0.0)
795 foo = self.serv.accept()
796 except socket.timeout:
797 self.fail("caught timeout instead of error (TCP)")
798 except socket.error:
799 ok = True
800 except:
801 self.fail("caught unexpected exception (TCP)")
802 if not ok:
803 self.fail("accept() returned success when we did not expect it")
804
805class UDPTimeoutTest(SocketTCPTest):
806
807 def testUDPTimeout(self):
808 def raise_timeout(*args, **kwargs):
809 self.serv.settimeout(1.0)
810 self.serv.recv(1024)
811 self.failUnlessRaises(socket.timeout, raise_timeout,
812 "Error generating a timeout exception (UDP)")
813
814 def testTimeoutZero(self):
815 ok = False
816 try:
817 self.serv.settimeout(0.0)
818 foo = self.serv.recv(1024)
819 except socket.timeout:
820 self.fail("caught timeout instead of error (UDP)")
821 except socket.error:
822 ok = True
823 except:
824 self.fail("caught unexpected exception (UDP)")
825 if not ok:
826 self.fail("recv() returned success when we did not expect it")
827
828class TestExceptions(unittest.TestCase):
829
830 def testExceptionTree(self):
831 self.assert_(issubclass(socket.error, Exception))
832 self.assert_(issubclass(socket.herror, socket.error))
833 self.assert_(issubclass(socket.gaierror, socket.error))
834 self.assert_(issubclass(socket.timeout, socket.error))
835
Armin Rigoa9017c32006-04-19 11:50:27 +0000836class TestLinuxAbstractNamespace(unittest.TestCase):
837
838 UNIX_PATH_MAX = 108
839
840 def testLinuxAbstractNamespace(self):
841 address = "\x00python-test-hello\x00\xff"
842 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
843 s1.bind(address)
844 s1.listen(1)
845 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
846 s2.connect(s1.getsockname())
847 s1.accept()
848 self.assertEqual(s1.getsockname(), address)
849 self.assertEqual(s2.getpeername(), address)
850
851 def testMaxName(self):
852 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
853 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
854 s.bind(address)
855 self.assertEqual(s.getsockname(), address)
856
857 def testNameOverflow(self):
858 address = "\x00" + "h" * self.UNIX_PATH_MAX
859 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
860 self.assertRaises(socket.error, s.bind, address)
861
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000862
Martin Blais2856e5f2006-05-26 12:03:27 +0000863class BufferIOTest(SocketConnectedTest):
864 """
865 Test the buffer versions of socket.recv() and socket.send().
866 """
867 def __init__(self, methodName='runTest'):
868 SocketConnectedTest.__init__(self, methodName=methodName)
869
Martin Blaisaf2ae722006-06-04 13:49:49 +0000870 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000871 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +0000872 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +0000873 self.assertEqual(nbytes, len(MSG))
874 msg = buf.tostring()[:len(MSG)]
875 self.assertEqual(msg, MSG)
876
Martin Blaisaf2ae722006-06-04 13:49:49 +0000877 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000878 buf = buffer(MSG)
879 self.serv_conn.send(buf)
880
Martin Blaisaf2ae722006-06-04 13:49:49 +0000881 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000882 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +0000883 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +0000884 self.assertEqual(nbytes, len(MSG))
885 msg = buf.tostring()[:len(MSG)]
886 self.assertEqual(msg, MSG)
887
Martin Blaisaf2ae722006-06-04 13:49:49 +0000888 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000889 buf = buffer(MSG)
890 self.serv_conn.send(buf)
891
Guido van Rossumb995eb72002-07-31 16:08:40 +0000892def test_main():
Martin Blais2856e5f2006-05-26 12:03:27 +0000893 tests = [GeneralModuleTests, BasicTCPTest, TCPTimeoutTest, TestExceptions,
894 BufferIOTest]
Jack Jansen522e7692002-09-06 21:57:50 +0000895 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000896 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000897
898 tests.extend([
899 NonBlockingTCPTests,
900 FileObjectClassTestCase,
901 UnbufferedFileObjectClassTestCase,
902 LineBufferedFileObjectClassTestCase,
903 SmallBufferedFileObjectClassTestCase
904 ])
Dave Cole331708b2004-08-09 04:51:41 +0000905 if hasattr(socket, "socketpair"):
906 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +0000907 if sys.platform == 'linux2':
908 tests.append(TestLinuxAbstractNamespace)
Walter Dörwald21d3a322003-05-01 17:45:56 +0000909 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000910
911if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000912 test_main()