blob: b7d39166b070552d2a4ccc13587435028ebc6347 [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
Martin v. Löwis7596e832006-07-01 15:33:37 +0000585class TCPCloserTest(ThreadedTCPSocketTest):
586
587 def testClose(self):
588 conn, addr = self.serv.accept()
589 conn.close()
590
591 sd = self.cli
592 read, write, err = select.select([sd], [], [], 1.0)
593 self.assertEqual(read, [sd])
594 self.assertEqual(sd.recv(1), '')
595
596 def _testClose(self):
597 self.cli.connect((HOST, PORT))
598 time.sleep(1.0)
599
Dave Cole331708b2004-08-09 04:51:41 +0000600class BasicSocketPairTest(SocketPairTest):
601
602 def __init__(self, methodName='runTest'):
603 SocketPairTest.__init__(self, methodName=methodName)
604
605 def testRecv(self):
606 msg = self.serv.recv(1024)
607 self.assertEqual(msg, MSG)
608
609 def _testRecv(self):
610 self.cli.send(MSG)
611
612 def testSend(self):
613 self.serv.send(MSG)
614
615 def _testSend(self):
616 msg = self.cli.recv(1024)
617 self.assertEqual(msg, MSG)
618
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619class NonBlockingTCPTests(ThreadedTCPSocketTest):
620
621 def __init__(self, methodName='runTest'):
622 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
623
624 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000625 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000626 self.serv.setblocking(0)
627 start = time.time()
628 try:
629 self.serv.accept()
630 except socket.error:
631 pass
632 end = time.time()
633 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
634
635 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000636 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000637
Guido van Rossum24e4af82002-06-12 19:18:08 +0000638 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000639 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000641 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000642 conn, addr = self.serv.accept()
643 except socket.error:
644 pass
645 else:
646 self.fail("Error trying to do non-blocking accept.")
647 read, write, err = select.select([self.serv], [], [])
648 if self.serv in read:
649 conn, addr = self.serv.accept()
650 else:
651 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000652
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000654 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000655 self.cli.connect((HOST, PORT))
656
657 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000658 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659 conn, addr = self.serv.accept()
660
661 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000662 self.cli.settimeout(10)
663 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000664
665 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000666 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667 conn, addr = self.serv.accept()
668 conn.setblocking(0)
669 try:
670 msg = conn.recv(len(MSG))
671 except socket.error:
672 pass
673 else:
674 self.fail("Error trying to do non-blocking recv.")
675 read, write, err = select.select([conn], [], [])
676 if conn in read:
677 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000678 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679 else:
680 self.fail("Error during select call to non-blocking socket.")
681
682 def _testRecv(self):
683 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000684 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685 self.cli.send(MSG)
686
687class FileObjectClassTestCase(SocketConnectedTest):
688
Guido van Rossume9f66142002-08-07 15:46:19 +0000689 bufsize = -1 # Use default buffer size
690
Guido van Rossum24e4af82002-06-12 19:18:08 +0000691 def __init__(self, methodName='runTest'):
692 SocketConnectedTest.__init__(self, methodName=methodName)
693
694 def setUp(self):
695 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000696 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000697
698 def tearDown(self):
699 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000700 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 self.serv_file = None
702 SocketConnectedTest.tearDown(self)
703
704 def clientSetUp(self):
705 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000706 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707
708 def clientTearDown(self):
709 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000710 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 self.cli_file = None
712 SocketConnectedTest.clientTearDown(self)
713
714 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000715 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716 first_seg = self.serv_file.read(len(MSG)-3)
717 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000718 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000719 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000720
721 def _testSmallRead(self):
722 self.cli_file.write(MSG)
723 self.cli_file.flush()
724
Guido van Rossum8c943832002-08-08 01:00:28 +0000725 def testFullRead(self):
726 # read until EOF
727 msg = self.serv_file.read()
728 self.assertEqual(msg, MSG)
729
730 def _testFullRead(self):
731 self.cli_file.write(MSG)
732 self.cli_file.close()
733
Guido van Rossum24e4af82002-06-12 19:18:08 +0000734 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000735 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000736 buf = ''
737 while 1:
738 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000739 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000741 buf += char
742 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743
744 def _testUnbufferedRead(self):
745 self.cli_file.write(MSG)
746 self.cli_file.flush()
747
748 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000749 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000751 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000752
753 def _testReadline(self):
754 self.cli_file.write(MSG)
755 self.cli_file.flush()
756
Tim Peters116d83c2004-03-28 02:20:45 +0000757 def testClosedAttr(self):
758 self.assert_(not self.serv_file.closed)
759
760 def _testClosedAttr(self):
761 self.assert_(not self.cli_file.closed)
762
Guido van Rossume9f66142002-08-07 15:46:19 +0000763class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
764
765 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000766
Guido van Rossume9f66142002-08-07 15:46:19 +0000767 In this case (and in this case only), it should be possible to
768 create a file object, read a line from it, create another file
769 object, read another line from it, without loss of data in the
770 first file object's buffer. Note that httplib relies on this
771 when reading multiple requests from the same socket."""
772
773 bufsize = 0 # Use unbuffered mode
774
775 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000776 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000777 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000778 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000779 self.serv_file = self.cli_conn.makefile('rb', 0)
780 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000781 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000782
783 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000784 self.cli_file.write("A. " + MSG)
785 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000786 self.cli_file.flush()
787
Guido van Rossum8c943832002-08-08 01:00:28 +0000788class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
789
790 bufsize = 1 # Default-buffered for reading; line-buffered for writing
791
792
793class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
794
795 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000796
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000797class TCPTimeoutTest(SocketTCPTest):
798
799 def testTCPTimeout(self):
800 def raise_timeout(*args, **kwargs):
801 self.serv.settimeout(1.0)
802 self.serv.accept()
803 self.failUnlessRaises(socket.timeout, raise_timeout,
804 "Error generating a timeout exception (TCP)")
805
806 def testTimeoutZero(self):
807 ok = False
808 try:
809 self.serv.settimeout(0.0)
810 foo = self.serv.accept()
811 except socket.timeout:
812 self.fail("caught timeout instead of error (TCP)")
813 except socket.error:
814 ok = True
815 except:
816 self.fail("caught unexpected exception (TCP)")
817 if not ok:
818 self.fail("accept() returned success when we did not expect it")
819
820class UDPTimeoutTest(SocketTCPTest):
821
822 def testUDPTimeout(self):
823 def raise_timeout(*args, **kwargs):
824 self.serv.settimeout(1.0)
825 self.serv.recv(1024)
826 self.failUnlessRaises(socket.timeout, raise_timeout,
827 "Error generating a timeout exception (UDP)")
828
829 def testTimeoutZero(self):
830 ok = False
831 try:
832 self.serv.settimeout(0.0)
833 foo = self.serv.recv(1024)
834 except socket.timeout:
835 self.fail("caught timeout instead of error (UDP)")
836 except socket.error:
837 ok = True
838 except:
839 self.fail("caught unexpected exception (UDP)")
840 if not ok:
841 self.fail("recv() returned success when we did not expect it")
842
843class TestExceptions(unittest.TestCase):
844
845 def testExceptionTree(self):
846 self.assert_(issubclass(socket.error, Exception))
847 self.assert_(issubclass(socket.herror, socket.error))
848 self.assert_(issubclass(socket.gaierror, socket.error))
849 self.assert_(issubclass(socket.timeout, socket.error))
850
Armin Rigoa9017c32006-04-19 11:50:27 +0000851class TestLinuxAbstractNamespace(unittest.TestCase):
852
853 UNIX_PATH_MAX = 108
854
855 def testLinuxAbstractNamespace(self):
856 address = "\x00python-test-hello\x00\xff"
857 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
858 s1.bind(address)
859 s1.listen(1)
860 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
861 s2.connect(s1.getsockname())
862 s1.accept()
863 self.assertEqual(s1.getsockname(), address)
864 self.assertEqual(s2.getpeername(), address)
865
866 def testMaxName(self):
867 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
868 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
869 s.bind(address)
870 self.assertEqual(s.getsockname(), address)
871
872 def testNameOverflow(self):
873 address = "\x00" + "h" * self.UNIX_PATH_MAX
874 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
875 self.assertRaises(socket.error, s.bind, address)
876
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000877
Martin Blais2856e5f2006-05-26 12:03:27 +0000878class BufferIOTest(SocketConnectedTest):
879 """
880 Test the buffer versions of socket.recv() and socket.send().
881 """
882 def __init__(self, methodName='runTest'):
883 SocketConnectedTest.__init__(self, methodName=methodName)
884
Martin Blaisaf2ae722006-06-04 13:49:49 +0000885 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000886 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +0000887 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +0000888 self.assertEqual(nbytes, len(MSG))
889 msg = buf.tostring()[:len(MSG)]
890 self.assertEqual(msg, MSG)
891
Martin Blaisaf2ae722006-06-04 13:49:49 +0000892 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000893 buf = buffer(MSG)
894 self.serv_conn.send(buf)
895
Martin Blaisaf2ae722006-06-04 13:49:49 +0000896 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000897 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +0000898 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +0000899 self.assertEqual(nbytes, len(MSG))
900 msg = buf.tostring()[:len(MSG)]
901 self.assertEqual(msg, MSG)
902
Martin Blaisaf2ae722006-06-04 13:49:49 +0000903 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000904 buf = buffer(MSG)
905 self.serv_conn.send(buf)
906
Guido van Rossumb995eb72002-07-31 16:08:40 +0000907def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +0000908 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
909 TestExceptions, BufferIOTest]
Jack Jansen522e7692002-09-06 21:57:50 +0000910 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000911 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000912
913 tests.extend([
914 NonBlockingTCPTests,
915 FileObjectClassTestCase,
916 UnbufferedFileObjectClassTestCase,
917 LineBufferedFileObjectClassTestCase,
918 SmallBufferedFileObjectClassTestCase
919 ])
Dave Cole331708b2004-08-09 04:51:41 +0000920 if hasattr(socket, "socketpair"):
921 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +0000922 if sys.platform == 'linux2':
923 tests.append(TestLinuxAbstractNamespace)
Neal Norwitz9602cc22006-06-18 19:35:01 +0000924
925 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +0000926 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +0000927 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000928
929if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000930 test_main()