blob: 4100c34452c7fd0ff99898b79836e261b410d811 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitroub1c54962010-10-14 15:05:38 +000021try:
22 import fcntl
23except ImportError:
24 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000026def try_address(host, port=0, family=socket.AF_INET):
27 """Try to bind a socket on the given host:port and return True
28 if that has been possible."""
29 try:
30 sock = socket.socket(family, socket.SOCK_STREAM)
31 sock.bind((host, port))
32 except (socket.error, socket.gaierror):
33 return False
34 else:
35 sock.close()
36 return True
37
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000038def linux_version():
39 try:
40 # platform.release() is something like '2.6.33.7-desktop-2mnb'
41 version_string = platform.release().split('-')[0]
42 return tuple(map(int, version_string.split('.')))
43 except ValueError:
44 return 0, 0, 0
45
Benjamin Petersonee8712c2008-05-20 21:35:26 +000046HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000047MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000048SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Victor Stinner45df8202010-04-28 22:31:17 +000050try:
51 import _thread as thread
52 import threading
53except ImportError:
54 thread = None
55 threading = None
56
Guido van Rossum24e4af82002-06-12 19:18:08 +000057class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000058
Guido van Rossum24e4af82002-06-12 19:18:08 +000059 def setUp(self):
60 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000061 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000062 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000063
Guido van Rossum24e4af82002-06-12 19:18:08 +000064 def tearDown(self):
65 self.serv.close()
66 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000067
Guido van Rossum24e4af82002-06-12 19:18:08 +000068class SocketUDPTest(unittest.TestCase):
69
70 def setUp(self):
71 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000072 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000073
74 def tearDown(self):
75 self.serv.close()
76 self.serv = None
77
78class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000079 """Threadable Test class
80
81 The ThreadableTest class makes it easy to create a threaded
82 client/server pair from an existing unit test. To create a
83 new threaded class from an existing unit test, use multiple
84 inheritance:
85
86 class NewClass (OldClass, ThreadableTest):
87 pass
88
89 This class defines two new fixture functions with obvious
90 purposes for overriding:
91
92 clientSetUp ()
93 clientTearDown ()
94
95 Any new test functions within the class must then define
96 tests in pairs, where the test name is preceeded with a
97 '_' to indicate the client portion of the test. Ex:
98
99 def testFoo(self):
100 # Server portion
101
102 def _testFoo(self):
103 # Client portion
104
105 Any exceptions raised by the clients during their tests
106 are caught and transferred to the main thread to alert
107 the testing framework.
108
109 Note, the server setup function cannot call any blocking
110 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 the blocking call (such as in setting up a client/server
113 connection and performing the accept() in setUp().
114 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def __init__(self):
117 # Swap the true setup function
118 self.__setUp = self.setUp
119 self.__tearDown = self.tearDown
120 self.setUp = self._setUp
121 self.tearDown = self._tearDown
122
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 def serverExplicitReady(self):
124 """This method allows the server to explicitly indicate that
125 it wants the client thread to proceed. This is useful if the
126 server is about to execute a blocking routine that is
127 dependent upon the client thread during its setup routine."""
128 self.server_ready.set()
129
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000131 self.server_ready = threading.Event()
132 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000134 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000137 methodname = self.id()
138 i = methodname.rfind('.')
139 methodname = methodname[i+1:]
140 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000141 self.client_thread = thread.start_new_thread(
142 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000145 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.set()
147 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148
149 def _tearDown(self):
150 self.__tearDown()
151 self.done.wait()
152
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000153 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000154 exc = self.queue.get()
155 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000158 self.server_ready.wait()
159 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000161 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000162 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000163 try:
164 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000165 except BaseException as e:
166 self.queue.put(e)
167 finally:
168 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000169
170 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000171 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172
173 def clientTearDown(self):
174 self.done.set()
175 thread.exit()
176
177class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
178
179 def __init__(self, methodName='runTest'):
180 SocketTCPTest.__init__(self, methodName=methodName)
181 ThreadableTest.__init__(self)
182
183 def clientSetUp(self):
184 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
185
186 def clientTearDown(self):
187 self.cli.close()
188 self.cli = None
189 ThreadableTest.clientTearDown(self)
190
191class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
192
193 def __init__(self, methodName='runTest'):
194 SocketUDPTest.__init__(self, methodName=methodName)
195 ThreadableTest.__init__(self)
196
197 def clientSetUp(self):
198 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
199
Brian Curtin3beb38f2010-11-04 03:41:43 +0000200 def clientTearDown(self):
201 self.cli.close()
202 self.cli = None
203 ThreadableTest.clientTearDown(self)
204
Guido van Rossum24e4af82002-06-12 19:18:08 +0000205class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000206 """Socket tests for client-server connection.
207
208 self.cli_conn is a client socket connected to the server. The
209 setUp() method guarantees that it is connected to the server.
210 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211
212 def __init__(self, methodName='runTest'):
213 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
214
215 def setUp(self):
216 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000217 # Indicate explicitly we're ready for the client thread to
218 # proceed and then perform the blocking call to accept
219 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000220 conn, addr = self.serv.accept()
221 self.cli_conn = conn
222
223 def tearDown(self):
224 self.cli_conn.close()
225 self.cli_conn = None
226 ThreadedTCPSocketTest.tearDown(self)
227
228 def clientSetUp(self):
229 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000230 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 self.serv_conn = self.cli
232
233 def clientTearDown(self):
234 self.serv_conn.close()
235 self.serv_conn = None
236 ThreadedTCPSocketTest.clientTearDown(self)
237
Dave Cole331708b2004-08-09 04:51:41 +0000238class SocketPairTest(unittest.TestCase, ThreadableTest):
239
240 def __init__(self, methodName='runTest'):
241 unittest.TestCase.__init__(self, methodName=methodName)
242 ThreadableTest.__init__(self)
243
244 def setUp(self):
245 self.serv, self.cli = socket.socketpair()
246
247 def tearDown(self):
248 self.serv.close()
249 self.serv = None
250
251 def clientSetUp(self):
252 pass
253
254 def clientTearDown(self):
255 self.cli.close()
256 self.cli = None
257 ThreadableTest.clientTearDown(self)
258
Tim Peters494aaee2004-08-09 18:54:11 +0000259
Guido van Rossum24e4af82002-06-12 19:18:08 +0000260#######################################################################
261## Begin Tests
262
263class GeneralModuleTests(unittest.TestCase):
264
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000265 def test_repr(self):
266 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000267 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000269
Raymond Hettinger027bb632004-05-31 03:09:25 +0000270 def test_weakref(self):
271 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
272 p = proxy(s)
273 self.assertEqual(p.fileno(), s.fileno())
274 s.close()
275 s = None
276 try:
277 p.fileno()
278 except ReferenceError:
279 pass
280 else:
281 self.fail('Socket proxy still exists')
282
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000284 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000285 def raise_error(*args, **kwargs):
286 raise socket.error
287 def raise_herror(*args, **kwargs):
288 raise socket.herror
289 def raise_gaierror(*args, **kwargs):
290 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000291 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000293 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000295 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296 "Error raising socket exception.")
297
Ezio Melotti63e42302011-05-07 19:47:48 +0300298 def testSendtoErrors(self):
299 # Testing that sendto doens't masks failures. See #10169.
300 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
301 self.addCleanup(s.close)
302 s.bind(('', 0))
303 sockname = s.getsockname()
304 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300305 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300306 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300307 self.assertEqual(str(cm.exception),
308 "'str' does not support the buffer interface")
309 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300310 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300311 self.assertEqual(str(cm.exception),
312 "'complex' does not support the buffer interface")
313 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300314 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300315 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300316 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300317 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300318 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300319 self.assertEqual(str(cm.exception),
320 "'str' does not support the buffer interface")
321 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300322 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300323 self.assertEqual(str(cm.exception),
324 "'complex' does not support the buffer interface")
325 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300326 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300327 self.assertIn('not NoneType', str(cm.exception))
328 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300329 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300330 self.assertIn('an integer is required', str(cm.exception))
331 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300332 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300333 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300334 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300335 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300336 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300337 self.assertIn('(1 given)', str(cm.exception))
338 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300339 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300340 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300341
Guido van Rossum24e4af82002-06-12 19:18:08 +0000342 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000343 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000344 socket.AF_INET
345 socket.SOCK_STREAM
346 socket.SOCK_DGRAM
347 socket.SOCK_RAW
348 socket.SOCK_RDM
349 socket.SOCK_SEQPACKET
350 socket.SOL_SOCKET
351 socket.SO_REUSEADDR
352
Guido van Rossum654c11e2002-06-13 20:24:17 +0000353 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000354 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000355 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000356 try:
357 ip = socket.gethostbyname(hostname)
358 except socket.error:
359 # Probably name lookup wasn't set up right; skip this test
360 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000361 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000362 try:
363 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
364 except socket.error:
365 # Probably a similar problem as above; skip this test
366 return
Brett Cannon01668a12005-03-11 00:04:17 +0000367 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000368 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000369 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000370 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000371
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000372 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000373 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000374 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375 try:
376 # On some versions, this loses a reference
377 orig = sys.getrefcount(__name__)
378 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000379 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000380 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000381 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000382
Guido van Rossum24e4af82002-06-12 19:18:08 +0000383 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000384 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000385 try:
386 # On some versions, this crashes the interpreter.
387 socket.getnameinfo(('x', 0, 0, 0), 0)
388 except socket.error:
389 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000390
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000391 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000392 # This just checks that htons etc. are their own inverse,
393 # when looking at the lower 16 or 32 bits.
394 sizes = {socket.htonl: 32, socket.ntohl: 32,
395 socket.htons: 16, socket.ntohs: 16}
396 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000397 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000398 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
399 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000400
Guido van Rossuma2627af2002-09-14 00:58:46 +0000401 swapped = func(mask)
402 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000403 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000404
Guido van Rossum018919a2007-01-15 00:07:32 +0000405 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000406 good_values = [ 1, 2, 3, 1, 2, 3 ]
407 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000408 for k in good_values:
409 socket.ntohl(k)
410 socket.ntohs(k)
411 socket.htonl(k)
412 socket.htons(k)
413 for k in bad_values:
414 self.assertRaises(OverflowError, socket.ntohl, k)
415 self.assertRaises(OverflowError, socket.ntohs, k)
416 self.assertRaises(OverflowError, socket.htonl, k)
417 self.assertRaises(OverflowError, socket.htons, k)
418
Barry Warsaw11b91a02004-06-28 00:50:43 +0000419 def testGetServBy(self):
420 eq = self.assertEqual
421 # Find one service that exists, then check all the related interfaces.
422 # I've ordered this by protocols that have both a tcp and udp
423 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000424 if (sys.platform.startswith('linux') or
425 sys.platform.startswith('freebsd') or
426 sys.platform.startswith('netbsd') or
427 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000428 # avoid the 'echo' service on this platform, as there is an
429 # assumption breaking non-standard port/protocol entry
430 services = ('daytime', 'qotd', 'domain')
431 else:
432 services = ('echo', 'daytime', 'domain')
433 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000434 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000435 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000436 break
437 except socket.error:
438 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000439 else:
440 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000441 # Try same call with optional protocol omitted
442 port2 = socket.getservbyname(service)
443 eq(port, port2)
444 # Try udp, but don't barf it it doesn't exist
445 try:
446 udpport = socket.getservbyname(service, 'udp')
447 except socket.error:
448 udpport = None
449 else:
450 eq(udpport, port)
451 # Now make sure the lookup by port returns the same service name
452 eq(socket.getservbyport(port2), service)
453 eq(socket.getservbyport(port, 'tcp'), service)
454 if udpport is not None:
455 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000456 # Make sure getservbyport does not accept out of range ports.
457 self.assertRaises(OverflowError, socket.getservbyport, -1)
458 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000459
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000460 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000461 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000462 # The default timeout should initially be None
463 self.assertEqual(socket.getdefaulttimeout(), None)
464 s = socket.socket()
465 self.assertEqual(s.gettimeout(), None)
466 s.close()
467
468 # Set the default timeout to 10, and see if it propagates
469 socket.setdefaulttimeout(10)
470 self.assertEqual(socket.getdefaulttimeout(), 10)
471 s = socket.socket()
472 self.assertEqual(s.gettimeout(), 10)
473 s.close()
474
475 # Reset the default timeout to None, and see if it propagates
476 socket.setdefaulttimeout(None)
477 self.assertEqual(socket.getdefaulttimeout(), None)
478 s = socket.socket()
479 self.assertEqual(s.gettimeout(), None)
480 s.close()
481
482 # Check that setting it to an invalid value raises ValueError
483 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
484
485 # Check that setting it to an invalid type raises TypeError
486 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
487
Benjamin Petersonf91df042009-02-13 02:50:59 +0000488 def testIPv4_inet_aton_fourbytes(self):
489 if not hasattr(socket, 'inet_aton'):
490 return # No inet_aton, nothing to check
491 # Test that issue1008086 and issue767150 are fixed.
492 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000493 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
494 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000495
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000496 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000497 if not hasattr(socket, 'inet_pton'):
498 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000499 from socket import inet_aton as f, inet_pton, AF_INET
500 g = lambda a: inet_pton(AF_INET, a)
501
Ezio Melottib3aedd42010-11-20 19:04:17 +0000502 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
503 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
504 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
505 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
506 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000507
Ezio Melottib3aedd42010-11-20 19:04:17 +0000508 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
509 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
510 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
511 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000512
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000513 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000514 if not hasattr(socket, 'inet_pton'):
515 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000516 try:
517 from socket import inet_pton, AF_INET6, has_ipv6
518 if not has_ipv6:
519 return
520 except ImportError:
521 return
522 f = lambda a: inet_pton(AF_INET6, a)
523
Ezio Melottib3aedd42010-11-20 19:04:17 +0000524 self.assertEqual(b'\x00' * 16, f('::'))
525 self.assertEqual(b'\x00' * 16, f('0::0'))
526 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
527 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000528 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000529 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
530 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000531
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000532 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000533 if not hasattr(socket, 'inet_ntop'):
534 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000535 from socket import inet_ntoa as f, inet_ntop, AF_INET
536 g = lambda a: inet_ntop(AF_INET, a)
537
Ezio Melottib3aedd42010-11-20 19:04:17 +0000538 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
539 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
540 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
541 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000542
Ezio Melottib3aedd42010-11-20 19:04:17 +0000543 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
544 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
545 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000546
547 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000548 if not hasattr(socket, 'inet_ntop'):
549 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000550 try:
551 from socket import inet_ntop, AF_INET6, has_ipv6
552 if not has_ipv6:
553 return
554 except ImportError:
555 return
556 f = lambda a: inet_ntop(AF_INET6, a)
557
Ezio Melottib3aedd42010-11-20 19:04:17 +0000558 self.assertEqual('::', f(b'\x00' * 16))
559 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
560 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000561 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000562 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000563 )
564
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000565 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000566
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000567 def _get_unused_port(self, bind_address='0.0.0.0'):
568 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000569
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000570 Args:
571 bind_address: Hostname or IP address to search for a port on.
572
573 Returns: A most likely to be unused port.
574 """
575 tempsock = socket.socket()
576 tempsock.bind((bind_address, 0))
577 host, port = tempsock.getsockname()
578 tempsock.close()
579 return port
580
581 def testSockName(self):
582 # Testing getsockname()
583 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000585 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000586 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000588 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
589 # it reasonable to get the host's addr in addition to 0.0.0.0.
590 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000591 try:
592 my_ip_addr = socket.gethostbyname(socket.gethostname())
593 except socket.error:
594 # Probably name lookup wasn't set up right; skip this test
595 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000596 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000597 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000598
599 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000600 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000601 # We know a socket should start without reuse==0
602 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000603 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000605 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000606
607 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000608 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000609 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000610 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
612 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000613 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000615 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000616 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000617 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
618 sock.settimeout(1)
619 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000620 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000621
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000622 def testNewAttributes(self):
623 # testing .family, .type and .protocol
624 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
625 self.assertEqual(sock.family, socket.AF_INET)
626 self.assertEqual(sock.type, socket.SOCK_STREAM)
627 self.assertEqual(sock.proto, 0)
628 sock.close()
629
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000630 def test_getsockaddrarg(self):
631 host = '0.0.0.0'
632 port = self._get_unused_port(bind_address=host)
633 big_port = port + 65536
634 neg_port = port - 65536
635 sock = socket.socket()
636 try:
637 self.assertRaises(OverflowError, sock.bind, (host, big_port))
638 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
639 sock.bind((host, port))
640 finally:
641 sock.close()
642
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000643 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000644 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000645 self.assertTrue(hasattr(socket.socket, 'ioctl'))
646 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
647 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
648 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000649 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
650 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000651 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000652 self.assertRaises(ValueError, s.ioctl, -1, None)
653 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000654
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000655 def testGetaddrinfo(self):
656 try:
657 socket.getaddrinfo('localhost', 80)
658 except socket.gaierror as err:
659 if err.errno == socket.EAI_SERVICE:
660 # see http://bugs.python.org/issue1282647
661 self.skipTest("buggy libc version")
662 raise
663 # len of every sequence is supposed to be == 5
664 for info in socket.getaddrinfo(HOST, None):
665 self.assertEqual(len(info), 5)
666 # host can be a domain name, a string representation of an
667 # IPv4/v6 address or None
668 socket.getaddrinfo('localhost', 80)
669 socket.getaddrinfo('127.0.0.1', 80)
670 socket.getaddrinfo(None, 80)
671 if SUPPORTS_IPV6:
672 socket.getaddrinfo('::1', 80)
673 # port can be a string service name such as "http", a numeric
674 # port number or None
675 socket.getaddrinfo(HOST, "http")
676 socket.getaddrinfo(HOST, 80)
677 socket.getaddrinfo(HOST, None)
678 # test family and socktype filters
679 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
680 for family, _, _, _, _ in infos:
681 self.assertEqual(family, socket.AF_INET)
682 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
683 for _, socktype, _, _, _ in infos:
684 self.assertEqual(socktype, socket.SOCK_STREAM)
685 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000686 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000687 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
688 # a server willing to support both IPv4 and IPv6 will
689 # usually do this
690 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
691 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000692 # test keyword arguments
693 a = socket.getaddrinfo(HOST, None)
694 b = socket.getaddrinfo(host=HOST, port=None)
695 self.assertEqual(a, b)
696 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
697 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
698 self.assertEqual(a, b)
699 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
700 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
701 self.assertEqual(a, b)
702 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
703 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
704 self.assertEqual(a, b)
705 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
706 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
707 self.assertEqual(a, b)
708 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
709 socket.AI_PASSIVE)
710 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
711 type=socket.SOCK_STREAM, proto=0,
712 flags=socket.AI_PASSIVE)
713 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000714 # Issue #6697.
715 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000716
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000717 def test_getnameinfo(self):
718 # only IP addresses are allowed
719 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
720
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000721 @unittest.skipUnless(support.is_resource_enabled('network'),
722 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000723 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000724 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000725 # these should all be successful
726 socket.gethostbyname('испытание.python.org')
727 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000728 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
729 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
730 # have a reverse entry yet
731 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000732
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000733 def check_sendall_interrupted(self, with_timeout):
734 # socketpair() is not stricly required, but it makes things easier.
735 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
736 self.skipTest("signal.alarm and socket.socketpair required for this test")
737 # Our signal handlers clobber the C errno by calling a math function
738 # with an invalid domain value.
739 def ok_handler(*args):
740 self.assertRaises(ValueError, math.acosh, 0)
741 def raising_handler(*args):
742 self.assertRaises(ValueError, math.acosh, 0)
743 1 // 0
744 c, s = socket.socketpair()
745 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
746 try:
747 if with_timeout:
748 # Just above the one second minimum for signal.alarm
749 c.settimeout(1.5)
750 with self.assertRaises(ZeroDivisionError):
751 signal.alarm(1)
752 c.sendall(b"x" * (1024**2))
753 if with_timeout:
754 signal.signal(signal.SIGALRM, ok_handler)
755 signal.alarm(1)
756 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
757 finally:
758 signal.signal(signal.SIGALRM, old_alarm)
759 c.close()
760 s.close()
761
762 def test_sendall_interrupted(self):
763 self.check_sendall_interrupted(False)
764
765 def test_sendall_interrupted_with_timeout(self):
766 self.check_sendall_interrupted(True)
767
Antoine Pitroue033e062010-10-29 10:38:18 +0000768 def test_dealloc_warn(self):
769 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
770 r = repr(sock)
771 with self.assertWarns(ResourceWarning) as cm:
772 sock = None
773 support.gc_collect()
774 self.assertIn(r, str(cm.warning.args[0]))
775 # An open socket file object gets dereferenced after the socket
776 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
777 f = sock.makefile('rb')
778 r = repr(sock)
779 sock = None
780 support.gc_collect()
781 with self.assertWarns(ResourceWarning):
782 f = None
783 support.gc_collect()
784
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000785 def test_name_closed_socketio(self):
786 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
787 fp = sock.makefile("rb")
788 fp.close()
789 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
790
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200791 def testListenBacklog0(self):
792 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
793 srv.bind((HOST, 0))
794 # backlog = 0
795 srv.listen(0)
796 srv.close()
797
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000798
Victor Stinner45df8202010-04-28 22:31:17 +0000799@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800class BasicTCPTest(SocketConnectedTest):
801
802 def __init__(self, methodName='runTest'):
803 SocketConnectedTest.__init__(self, methodName=methodName)
804
805 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000806 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000807 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000808 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809
810 def _testRecv(self):
811 self.serv_conn.send(MSG)
812
813 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000814 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000815 seg1 = self.cli_conn.recv(len(MSG) - 3)
816 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000817 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000818 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819
820 def _testOverFlowRecv(self):
821 self.serv_conn.send(MSG)
822
823 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000824 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000825 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000826 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000827
828 def _testRecvFrom(self):
829 self.serv_conn.send(MSG)
830
831 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000832 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000833 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
834 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000835 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000836 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000837
838 def _testOverFlowRecvFrom(self):
839 self.serv_conn.send(MSG)
840
841 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000842 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000843 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000844 while 1:
845 read = self.cli_conn.recv(1024)
846 if not read:
847 break
Guido van Rossume531e292002-08-08 20:28:34 +0000848 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000849 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850
851 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000852 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853 self.serv_conn.sendall(big_chunk)
854
855 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000856 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 fd = self.cli_conn.fileno()
858 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000859 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000860 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000862 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863
864 def _testFromFd(self):
865 self.serv_conn.send(MSG)
866
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000867 def testDup(self):
868 # Testing dup()
869 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000870 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000871 msg = sock.recv(1024)
872 self.assertEqual(msg, MSG)
873
874 def _testDup(self):
875 self.serv_conn.send(MSG)
876
Guido van Rossum24e4af82002-06-12 19:18:08 +0000877 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000880 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000881 # wait for _testShutdown to finish: on OS X, when the server
882 # closes the connection the client also becomes disconnected,
883 # and the client's shutdown call will fail. (Issue #4397.)
884 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000885
886 def _testShutdown(self):
887 self.serv_conn.send(MSG)
888 self.serv_conn.shutdown(2)
889
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000890 def testDetach(self):
891 # Testing detach()
892 fileno = self.cli_conn.fileno()
893 f = self.cli_conn.detach()
894 self.assertEqual(f, fileno)
895 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000896 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
897 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000898 # ...but we can create another socket using the (still open)
899 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000900 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000901 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000902 msg = sock.recv(1024)
903 self.assertEqual(msg, MSG)
904
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000905 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000906 self.serv_conn.send(MSG)
907
Victor Stinner45df8202010-04-28 22:31:17 +0000908@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000909class BasicUDPTest(ThreadedUDPSocketTest):
910
911 def __init__(self, methodName='runTest'):
912 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
913
914 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000915 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000917 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000918
919 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000920 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000921
Guido van Rossum1c938012002-06-12 21:17:20 +0000922 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000923 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000924 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000925 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000926
Guido van Rossum1c938012002-06-12 21:17:20 +0000927 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000928 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929
Guido van Rossumd8faa362007-04-27 19:54:29 +0000930 def testRecvFromNegative(self):
931 # Negative lengths passed to recvfrom should give ValueError.
932 self.assertRaises(ValueError, self.serv.recvfrom, -1)
933
934 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000935 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000936
Victor Stinner45df8202010-04-28 22:31:17 +0000937@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000938class TCPCloserTest(ThreadedTCPSocketTest):
939
940 def testClose(self):
941 conn, addr = self.serv.accept()
942 conn.close()
943
944 sd = self.cli
945 read, write, err = select.select([sd], [], [], 1.0)
946 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000947 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000948
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000949 # Calling close() many times should be safe.
950 conn.close()
951 conn.close()
952
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000953 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000954 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000955 time.sleep(1.0)
956
Victor Stinner45df8202010-04-28 22:31:17 +0000957@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000958class BasicSocketPairTest(SocketPairTest):
959
960 def __init__(self, methodName='runTest'):
961 SocketPairTest.__init__(self, methodName=methodName)
962
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000963 def _check_defaults(self, sock):
964 self.assertIsInstance(sock, socket.socket)
965 if hasattr(socket, 'AF_UNIX'):
966 self.assertEqual(sock.family, socket.AF_UNIX)
967 else:
968 self.assertEqual(sock.family, socket.AF_INET)
969 self.assertEqual(sock.type, socket.SOCK_STREAM)
970 self.assertEqual(sock.proto, 0)
971
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000972 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000973 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000974
975 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000976 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000977
Dave Cole331708b2004-08-09 04:51:41 +0000978 def testRecv(self):
979 msg = self.serv.recv(1024)
980 self.assertEqual(msg, MSG)
981
982 def _testRecv(self):
983 self.cli.send(MSG)
984
985 def testSend(self):
986 self.serv.send(MSG)
987
988 def _testSend(self):
989 msg = self.cli.recv(1024)
990 self.assertEqual(msg, MSG)
991
Victor Stinner45df8202010-04-28 22:31:17 +0000992@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000993class NonBlockingTCPTests(ThreadedTCPSocketTest):
994
995 def __init__(self, methodName='runTest'):
996 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
997
998 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000999 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001000 self.serv.setblocking(0)
1001 start = time.time()
1002 try:
1003 self.serv.accept()
1004 except socket.error:
1005 pass
1006 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001007 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001008
1009 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001010 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001011
Antoine Pitroub1c54962010-10-14 15:05:38 +00001012 if hasattr(socket, "SOCK_NONBLOCK"):
1013 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001014 v = linux_version()
1015 if v < (2, 6, 28):
1016 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1017 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001018 # reinit server socket
1019 self.serv.close()
1020 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001021 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001022 self.port = support.bind_port(self.serv)
1023 self.serv.listen(1)
1024 # actual testing
1025 start = time.time()
1026 try:
1027 self.serv.accept()
1028 except socket.error:
1029 pass
1030 end = time.time()
1031 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1032
1033 def _testInitNonBlocking(self):
1034 pass
1035
Antoine Pitrou600232b2011-01-05 21:03:42 +00001036 def testInheritFlags(self):
1037 # Issue #7995: when calling accept() on a listening socket with a
1038 # timeout, the resulting socket should not be non-blocking.
1039 self.serv.settimeout(10)
1040 try:
1041 conn, addr = self.serv.accept()
1042 message = conn.recv(len(MSG))
1043 finally:
1044 conn.close()
1045 self.serv.settimeout(None)
1046
1047 def _testInheritFlags(self):
1048 time.sleep(0.1)
1049 self.cli.connect((HOST, self.port))
1050 time.sleep(0.5)
1051 self.cli.send(MSG)
1052
Guido van Rossum24e4af82002-06-12 19:18:08 +00001053 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001054 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001056 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001057 conn, addr = self.serv.accept()
1058 except socket.error:
1059 pass
1060 else:
1061 self.fail("Error trying to do non-blocking accept.")
1062 read, write, err = select.select([self.serv], [], [])
1063 if self.serv in read:
1064 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001065 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066 else:
1067 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001068
Guido van Rossum24e4af82002-06-12 19:18:08 +00001069 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001070 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001071 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001072
1073 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001074 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001075 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001076 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001077
1078 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001079 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001080 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001081
1082 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001083 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084 conn, addr = self.serv.accept()
1085 conn.setblocking(0)
1086 try:
1087 msg = conn.recv(len(MSG))
1088 except socket.error:
1089 pass
1090 else:
1091 self.fail("Error trying to do non-blocking recv.")
1092 read, write, err = select.select([conn], [], [])
1093 if conn in read:
1094 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001095 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001096 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097 else:
1098 self.fail("Error during select call to non-blocking socket.")
1099
1100 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001101 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001102 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001103 self.cli.send(MSG)
1104
Victor Stinner45df8202010-04-28 22:31:17 +00001105@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001106class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001107 """Unit tests for the object returned by socket.makefile()
1108
Antoine Pitrou834bd812010-10-13 16:17:14 +00001109 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001110 the client connection. You can read from this file to
1111 get output from the server.
1112
Antoine Pitrou834bd812010-10-13 16:17:14 +00001113 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001114 server connection. You can write to this file to send output
1115 to the client.
1116 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001117
Guido van Rossume9f66142002-08-07 15:46:19 +00001118 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001119 encoding = 'utf8'
1120 errors = 'strict'
1121 newline = None
1122
1123 read_mode = 'rb'
1124 read_msg = MSG
1125 write_mode = 'wb'
1126 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001127
Guido van Rossum24e4af82002-06-12 19:18:08 +00001128 def __init__(self, methodName='runTest'):
1129 SocketConnectedTest.__init__(self, methodName=methodName)
1130
1131 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001132 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1133 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001134 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001135 self.read_file = self.cli_conn.makefile(
1136 self.read_mode, self.bufsize,
1137 encoding = self.encoding,
1138 errors = self.errors,
1139 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001140
1141 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001142 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001143 self.read_file.close()
1144 self.assertTrue(self.read_file.closed)
1145 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001146 SocketConnectedTest.tearDown(self)
1147
1148 def clientSetUp(self):
1149 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001150 self.write_file = self.serv_conn.makefile(
1151 self.write_mode, self.bufsize,
1152 encoding = self.encoding,
1153 errors = self.errors,
1154 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155
1156 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001157 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001158 self.write_file.close()
1159 self.assertTrue(self.write_file.closed)
1160 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001161 SocketConnectedTest.clientTearDown(self)
1162
Antoine Pitrou5d5381e2011-02-25 23:14:08 +00001163 def testReadAfterTimeout(self):
1164 # Issue #7322: A file object must disallow further reads
1165 # after a timeout has occurred.
1166 self.cli_conn.settimeout(1)
1167 self.read_file.read(3)
1168 # First read raises a timeout
1169 self.assertRaises(socket.timeout, self.read_file.read, 1)
1170 # Second read is disallowed
1171 with self.assertRaises(IOError) as ctx:
1172 self.read_file.read(1)
1173 self.assertIn("cannot read from timed out object", str(ctx.exception))
1174
1175 def _testReadAfterTimeout(self):
1176 self.write_file.write(self.write_msg[0:3])
1177 self.write_file.flush()
1178 self.serv_finished.wait()
1179
Guido van Rossum24e4af82002-06-12 19:18:08 +00001180 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001181 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001182 first_seg = self.read_file.read(len(self.read_msg)-3)
1183 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001184 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001185 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001186
1187 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001188 self.write_file.write(self.write_msg)
1189 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001190
Guido van Rossum8c943832002-08-08 01:00:28 +00001191 def testFullRead(self):
1192 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001193 msg = self.read_file.read()
1194 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001195
1196 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001197 self.write_file.write(self.write_msg)
1198 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001199
Guido van Rossum24e4af82002-06-12 19:18:08 +00001200 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001201 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001202 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001203 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001204 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001205 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001206 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001207 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001208 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001209
1210 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001211 self.write_file.write(self.write_msg)
1212 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001213
1214 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001215 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001216 line = self.read_file.readline()
1217 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001218
1219 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001220 self.write_file.write(self.write_msg)
1221 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001222
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001223 def testCloseAfterMakefile(self):
1224 # The file returned by makefile should keep the socket open.
1225 self.cli_conn.close()
1226 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001227 msg = self.read_file.read()
1228 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001229
1230 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001231 self.write_file.write(self.write_msg)
1232 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001233
1234 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001235 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001236 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001237 if isinstance(self.read_msg, str):
1238 msg = msg.decode()
1239 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001240
1241 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001242 self.write_file.write(self.write_msg)
1243 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001244
Tim Peters116d83c2004-03-28 02:20:45 +00001245 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001246 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001247
1248 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001249 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001250
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001251 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001252 self.assertEqual(self.read_file.mode, self.read_mode)
1253 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001254
1255 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001256 self.assertEqual(self.write_file.mode, self.write_mode)
1257 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001258
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001259 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001260 self.read_file.close()
1261 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001262 self.cli_conn.close()
1263 self.assertRaises(socket.error, self.cli_conn.getsockname)
1264
1265 def _testRealClose(self):
1266 pass
1267
1268
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001269class FileObjectInterruptedTestCase(unittest.TestCase):
1270 """Test that the file object correctly handles EINTR internally."""
1271
1272 class MockSocket(object):
1273 def __init__(self, recv_funcs=()):
1274 # A generator that returns callables that we'll call for each
1275 # call to recv().
1276 self._recv_step = iter(recv_funcs)
1277
1278 def recv_into(self, buffer):
1279 data = next(self._recv_step)()
1280 assert len(buffer) >= len(data)
1281 buffer[:len(data)] = data
1282 return len(data)
1283
1284 def _decref_socketios(self):
1285 pass
1286
1287 def _textiowrap_for_test(self, buffering=-1):
1288 raw = socket.SocketIO(self, "r")
1289 if buffering < 0:
1290 buffering = io.DEFAULT_BUFFER_SIZE
1291 if buffering == 0:
1292 return raw
1293 buffer = io.BufferedReader(raw, buffering)
1294 text = io.TextIOWrapper(buffer, None, None)
1295 text.mode = "rb"
1296 return text
1297
1298 @staticmethod
1299 def _raise_eintr():
1300 raise socket.error(errno.EINTR)
1301
1302 def _textiowrap_mock_socket(self, mock, buffering=-1):
1303 raw = socket.SocketIO(mock, "r")
1304 if buffering < 0:
1305 buffering = io.DEFAULT_BUFFER_SIZE
1306 if buffering == 0:
1307 return raw
1308 buffer = io.BufferedReader(raw, buffering)
1309 text = io.TextIOWrapper(buffer, None, None)
1310 text.mode = "rb"
1311 return text
1312
1313 def _test_readline(self, size=-1, buffering=-1):
1314 mock_sock = self.MockSocket(recv_funcs=[
1315 lambda : b"This is the first line\nAnd the sec",
1316 self._raise_eintr,
1317 lambda : b"ond line is here\n",
1318 lambda : b"",
1319 lambda : b"", # XXX(gps): io library does an extra EOF read
1320 ])
1321 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001322 self.assertEqual(fo.readline(size), "This is the first line\n")
1323 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001324
1325 def _test_read(self, size=-1, buffering=-1):
1326 mock_sock = self.MockSocket(recv_funcs=[
1327 lambda : b"This is the first line\nAnd the sec",
1328 self._raise_eintr,
1329 lambda : b"ond line is here\n",
1330 lambda : b"",
1331 lambda : b"", # XXX(gps): io library does an extra EOF read
1332 ])
1333 expecting = (b"This is the first line\n"
1334 b"And the second line is here\n")
1335 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1336 if buffering == 0:
1337 data = b''
1338 else:
1339 data = ''
1340 expecting = expecting.decode('utf8')
1341 while len(data) != len(expecting):
1342 part = fo.read(size)
1343 if not part:
1344 break
1345 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001346 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001347
1348 def test_default(self):
1349 self._test_readline()
1350 self._test_readline(size=100)
1351 self._test_read()
1352 self._test_read(size=100)
1353
1354 def test_with_1k_buffer(self):
1355 self._test_readline(buffering=1024)
1356 self._test_readline(size=100, buffering=1024)
1357 self._test_read(buffering=1024)
1358 self._test_read(size=100, buffering=1024)
1359
1360 def _test_readline_no_buffer(self, size=-1):
1361 mock_sock = self.MockSocket(recv_funcs=[
1362 lambda : b"a",
1363 lambda : b"\n",
1364 lambda : b"B",
1365 self._raise_eintr,
1366 lambda : b"b",
1367 lambda : b"",
1368 ])
1369 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001370 self.assertEqual(fo.readline(size), b"a\n")
1371 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001372
1373 def test_no_buffer(self):
1374 self._test_readline_no_buffer()
1375 self._test_readline_no_buffer(size=4)
1376 self._test_read(buffering=0)
1377 self._test_read(size=100, buffering=0)
1378
1379
Guido van Rossume9f66142002-08-07 15:46:19 +00001380class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1381
1382 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001383
Guido van Rossume9f66142002-08-07 15:46:19 +00001384 In this case (and in this case only), it should be possible to
1385 create a file object, read a line from it, create another file
1386 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001387 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001388 when reading multiple requests from the same socket."""
1389
1390 bufsize = 0 # Use unbuffered mode
1391
1392 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001393 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001394 line = self.read_file.readline() # first line
1395 self.assertEqual(line, b"A. " + self.write_msg) # first line
1396 self.read_file = self.cli_conn.makefile('rb', 0)
1397 line = self.read_file.readline() # second line
1398 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001399
1400 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001401 self.write_file.write(b"A. " + self.write_msg)
1402 self.write_file.write(b"B. " + self.write_msg)
1403 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001404
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001405 def testMakefileClose(self):
1406 # The file returned by makefile should keep the socket open...
1407 self.cli_conn.close()
1408 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001409 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001410 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001411 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001412 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1413
1414 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001415 self.write_file.write(self.write_msg)
1416 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001417
1418 def testMakefileCloseSocketDestroy(self):
1419 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001420 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001421 refcount_after = sys.getrefcount(self.cli_conn)
1422 self.assertEqual(refcount_before - 1, refcount_after)
1423
1424 def _testMakefileCloseSocketDestroy(self):
1425 pass
1426
Antoine Pitrou98b46702010-09-18 22:59:00 +00001427 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001428 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001429 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1430
1431 def testSmallReadNonBlocking(self):
1432 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001433 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1434 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001435 self.evt1.set()
1436 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001437 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001438 if first_seg is None:
1439 # Data not arrived (can happen under Windows), wait a bit
1440 time.sleep(0.5)
1441 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001442 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001443 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001444 self.assertEqual(n, 3)
1445 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001446 self.assertEqual(msg, self.read_msg)
1447 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1448 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001449
1450 def _testSmallReadNonBlocking(self):
1451 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001452 self.write_file.write(self.write_msg)
1453 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001454 self.evt2.set()
1455 # Avoid cloding the socket before the server test has finished,
1456 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1457 self.serv_finished.wait(5.0)
1458
1459 def testWriteNonBlocking(self):
1460 self.cli_finished.wait(5.0)
1461 # The client thread can't skip directly - the SkipTest exception
1462 # would appear as a failure.
1463 if self.serv_skipped:
1464 self.skipTest(self.serv_skipped)
1465
1466 def _testWriteNonBlocking(self):
1467 self.serv_skipped = None
1468 self.serv_conn.setblocking(False)
1469 # Try to saturate the socket buffer pipe with repeated large writes.
1470 BIG = b"x" * (1024 ** 2)
1471 LIMIT = 10
1472 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001473 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001474 self.assertGreater(n, 0)
1475 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001476 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001477 if n is None:
1478 # Succeeded
1479 break
1480 self.assertGreater(n, 0)
1481 else:
1482 # Let us know that this test didn't manage to establish
1483 # the expected conditions. This is not a failure in itself but,
1484 # if it happens repeatedly, the test should be fixed.
1485 self.serv_skipped = "failed to saturate the socket buffer"
1486
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001487
Guido van Rossum8c943832002-08-08 01:00:28 +00001488class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1489
1490 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1491
1492
1493class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1494
1495 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001496
Thomas Woutersb2137042007-02-01 18:02:27 +00001497
Antoine Pitrou834bd812010-10-13 16:17:14 +00001498class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1499 """Tests for socket.makefile() in text mode (rather than binary)"""
1500
1501 read_mode = 'r'
1502 read_msg = MSG.decode('utf8')
1503 write_mode = 'wb'
1504 write_msg = MSG
1505 newline = ''
1506
1507
1508class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1509 """Tests for socket.makefile() in text mode (rather than binary)"""
1510
1511 read_mode = 'rb'
1512 read_msg = MSG
1513 write_mode = 'w'
1514 write_msg = MSG.decode('utf8')
1515 newline = ''
1516
1517
1518class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1519 """Tests for socket.makefile() in text mode (rather than binary)"""
1520
1521 read_mode = 'r'
1522 read_msg = MSG.decode('utf8')
1523 write_mode = 'w'
1524 write_msg = MSG.decode('utf8')
1525 newline = ''
1526
1527
Guido van Rossumd8faa362007-04-27 19:54:29 +00001528class NetworkConnectionTest(object):
1529 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001530
Guido van Rossumd8faa362007-04-27 19:54:29 +00001531 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001532 # We're inherited below by BasicTCPTest2, which also inherits
1533 # BasicTCPTest, which defines self.port referenced below.
1534 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001535 self.serv_conn = self.cli
1536
1537class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1538 """Tests that NetworkConnection does not break existing TCP functionality.
1539 """
1540
1541class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001542
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001543 class MockSocket(socket.socket):
1544 def connect(self, *args):
1545 raise socket.timeout('timed out')
1546
1547 @contextlib.contextmanager
1548 def mocked_socket_module(self):
1549 """Return a socket which times out on connect"""
1550 old_socket = socket.socket
1551 socket.socket = self.MockSocket
1552 try:
1553 yield
1554 finally:
1555 socket.socket = old_socket
1556
1557 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001558 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001559 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001560 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001561 with self.assertRaises(socket.error) as cm:
1562 cli.connect((HOST, port))
1563 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1564
1565 def test_create_connection(self):
1566 # Issue #9792: errors raised by create_connection() should have
1567 # a proper errno attribute.
1568 port = support.find_unused_port()
1569 with self.assertRaises(socket.error) as cm:
1570 socket.create_connection((HOST, port))
1571 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1572
1573 def test_create_connection_timeout(self):
1574 # Issue #9792: create_connection() should not recast timeout errors
1575 # as generic socket errors.
1576 with self.mocked_socket_module():
1577 with self.assertRaises(socket.timeout):
1578 socket.create_connection((HOST, 1234))
1579
Guido van Rossumd8faa362007-04-27 19:54:29 +00001580
Victor Stinner45df8202010-04-28 22:31:17 +00001581@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001582class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1583
1584 def __init__(self, methodName='runTest'):
1585 SocketTCPTest.__init__(self, methodName=methodName)
1586 ThreadableTest.__init__(self)
1587
1588 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001589 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001590
1591 def clientTearDown(self):
1592 self.cli.close()
1593 self.cli = None
1594 ThreadableTest.clientTearDown(self)
1595
1596 def _justAccept(self):
1597 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001598 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001599
1600 testFamily = _justAccept
1601 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001602 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001603 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001604 self.assertEqual(self.cli.family, 2)
1605
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001606 testSourceAddress = _justAccept
1607 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001608 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1609 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001610 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001611 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001612 # The port number being used is sufficient to show that the bind()
1613 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001614
Guido van Rossumd8faa362007-04-27 19:54:29 +00001615 testTimeoutDefault = _justAccept
1616 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001617 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001618 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001619 socket.setdefaulttimeout(42)
1620 try:
1621 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001622 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001623 finally:
1624 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001625 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001626
1627 testTimeoutNone = _justAccept
1628 def _testTimeoutNone(self):
1629 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001630 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001631 socket.setdefaulttimeout(30)
1632 try:
1633 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001634 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001635 finally:
1636 socket.setdefaulttimeout(None)
1637 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001638
1639 testTimeoutValueNamed = _justAccept
1640 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001641 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001642 self.assertEqual(self.cli.gettimeout(), 30)
1643
1644 testTimeoutValueNonamed = _justAccept
1645 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001646 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001647 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001648 self.assertEqual(self.cli.gettimeout(), 30)
1649
Victor Stinner45df8202010-04-28 22:31:17 +00001650@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001651class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1652
1653 def __init__(self, methodName='runTest'):
1654 SocketTCPTest.__init__(self, methodName=methodName)
1655 ThreadableTest.__init__(self)
1656
1657 def clientSetUp(self):
1658 pass
1659
1660 def clientTearDown(self):
1661 self.cli.close()
1662 self.cli = None
1663 ThreadableTest.clientTearDown(self)
1664
1665 def testInsideTimeout(self):
1666 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001667 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001668 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001669 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001670 testOutsideTimeout = testInsideTimeout
1671
1672 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001673 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001674 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001675 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001676
1677 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001678 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001679 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001680
1681
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001682class TCPTimeoutTest(SocketTCPTest):
1683
1684 def testTCPTimeout(self):
1685 def raise_timeout(*args, **kwargs):
1686 self.serv.settimeout(1.0)
1687 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001688 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001689 "Error generating a timeout exception (TCP)")
1690
1691 def testTimeoutZero(self):
1692 ok = False
1693 try:
1694 self.serv.settimeout(0.0)
1695 foo = self.serv.accept()
1696 except socket.timeout:
1697 self.fail("caught timeout instead of error (TCP)")
1698 except socket.error:
1699 ok = True
1700 except:
1701 self.fail("caught unexpected exception (TCP)")
1702 if not ok:
1703 self.fail("accept() returned success when we did not expect it")
1704
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001705 def testInterruptedTimeout(self):
1706 # XXX I don't know how to do this test on MSWindows or any other
1707 # plaform that doesn't support signal.alarm() or os.kill(), though
1708 # the bug should have existed on all platforms.
1709 if not hasattr(signal, "alarm"):
1710 return # can only test on *nix
1711 self.serv.settimeout(5.0) # must be longer than alarm
1712 class Alarm(Exception):
1713 pass
1714 def alarm_handler(signal, frame):
1715 raise Alarm
1716 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1717 try:
1718 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1719 try:
1720 foo = self.serv.accept()
1721 except socket.timeout:
1722 self.fail("caught timeout instead of Alarm")
1723 except Alarm:
1724 pass
1725 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001726 self.fail("caught other exception instead of Alarm:"
1727 " %s(%s):\n%s" %
1728 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001729 else:
1730 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001731 finally:
1732 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001733 except Alarm:
1734 self.fail("got Alarm in wrong place")
1735 finally:
1736 # no alarm can be pending. Safe to restore old handler.
1737 signal.signal(signal.SIGALRM, old_alarm)
1738
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001739class UDPTimeoutTest(SocketTCPTest):
1740
1741 def testUDPTimeout(self):
1742 def raise_timeout(*args, **kwargs):
1743 self.serv.settimeout(1.0)
1744 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001745 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001746 "Error generating a timeout exception (UDP)")
1747
1748 def testTimeoutZero(self):
1749 ok = False
1750 try:
1751 self.serv.settimeout(0.0)
1752 foo = self.serv.recv(1024)
1753 except socket.timeout:
1754 self.fail("caught timeout instead of error (UDP)")
1755 except socket.error:
1756 ok = True
1757 except:
1758 self.fail("caught unexpected exception (UDP)")
1759 if not ok:
1760 self.fail("recv() returned success when we did not expect it")
1761
1762class TestExceptions(unittest.TestCase):
1763
1764 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001765 self.assertTrue(issubclass(socket.error, Exception))
1766 self.assertTrue(issubclass(socket.herror, socket.error))
1767 self.assertTrue(issubclass(socket.gaierror, socket.error))
1768 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001769
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001770class TestLinuxAbstractNamespace(unittest.TestCase):
1771
1772 UNIX_PATH_MAX = 108
1773
1774 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001775 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001776 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1777 s1.bind(address)
1778 s1.listen(1)
1779 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1780 s2.connect(s1.getsockname())
1781 with s1.accept()[0] as s3:
1782 self.assertEqual(s1.getsockname(), address)
1783 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001784
1785 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001786 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001787 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1788 s.bind(address)
1789 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001790
1791 def testNameOverflow(self):
1792 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001793 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1794 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001795
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001796
Victor Stinner45df8202010-04-28 22:31:17 +00001797@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001798class BufferIOTest(SocketConnectedTest):
1799 """
1800 Test the buffer versions of socket.recv() and socket.send().
1801 """
1802 def __init__(self, methodName='runTest'):
1803 SocketConnectedTest.__init__(self, methodName=methodName)
1804
Antoine Pitrou25480782010-03-17 22:50:28 +00001805 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001806 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001807 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001809 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001810 self.assertEqual(msg, MSG)
1811
Antoine Pitrou25480782010-03-17 22:50:28 +00001812 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001813 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001814 self.serv_conn.send(buf)
1815
Antoine Pitrou25480782010-03-17 22:50:28 +00001816 def testRecvIntoBytearray(self):
1817 buf = bytearray(1024)
1818 nbytes = self.cli_conn.recv_into(buf)
1819 self.assertEqual(nbytes, len(MSG))
1820 msg = buf[:len(MSG)]
1821 self.assertEqual(msg, MSG)
1822
1823 _testRecvIntoBytearray = _testRecvIntoArray
1824
1825 def testRecvIntoMemoryview(self):
1826 buf = bytearray(1024)
1827 nbytes = self.cli_conn.recv_into(memoryview(buf))
1828 self.assertEqual(nbytes, len(MSG))
1829 msg = buf[:len(MSG)]
1830 self.assertEqual(msg, MSG)
1831
1832 _testRecvIntoMemoryview = _testRecvIntoArray
1833
1834 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001835 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001836 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001837 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001838 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001839 self.assertEqual(msg, MSG)
1840
Antoine Pitrou25480782010-03-17 22:50:28 +00001841 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001842 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001843 self.serv_conn.send(buf)
1844
Antoine Pitrou25480782010-03-17 22:50:28 +00001845 def testRecvFromIntoBytearray(self):
1846 buf = bytearray(1024)
1847 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1848 self.assertEqual(nbytes, len(MSG))
1849 msg = buf[:len(MSG)]
1850 self.assertEqual(msg, MSG)
1851
1852 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1853
1854 def testRecvFromIntoMemoryview(self):
1855 buf = bytearray(1024)
1856 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1857 self.assertEqual(nbytes, len(MSG))
1858 msg = buf[:len(MSG)]
1859 self.assertEqual(msg, MSG)
1860
1861 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1862
Christian Heimes043d6f62008-01-07 17:19:16 +00001863
1864TIPC_STYPE = 2000
1865TIPC_LOWER = 200
1866TIPC_UPPER = 210
1867
1868def isTipcAvailable():
1869 """Check if the TIPC module is loaded
1870
1871 The TIPC module is not loaded automatically on Ubuntu and probably
1872 other Linux distros.
1873 """
1874 if not hasattr(socket, "AF_TIPC"):
1875 return False
1876 if not os.path.isfile("/proc/modules"):
1877 return False
1878 with open("/proc/modules") as f:
1879 for line in f:
1880 if line.startswith("tipc "):
1881 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001882 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001883 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1884 return False
1885
1886class TIPCTest (unittest.TestCase):
1887 def testRDM(self):
1888 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1889 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1890
1891 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1892 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1893 TIPC_LOWER, TIPC_UPPER)
1894 srv.bind(srvaddr)
1895
1896 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1897 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1898 cli.sendto(MSG, sendaddr)
1899
1900 msg, recvaddr = srv.recvfrom(1024)
1901
1902 self.assertEqual(cli.getsockname(), recvaddr)
1903 self.assertEqual(msg, MSG)
1904
1905
1906class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1907 def __init__(self, methodName = 'runTest'):
1908 unittest.TestCase.__init__(self, methodName = methodName)
1909 ThreadableTest.__init__(self)
1910
1911 def setUp(self):
1912 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1913 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1914 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1915 TIPC_LOWER, TIPC_UPPER)
1916 self.srv.bind(srvaddr)
1917 self.srv.listen(5)
1918 self.serverExplicitReady()
1919 self.conn, self.connaddr = self.srv.accept()
1920
1921 def clientSetUp(self):
1922 # The is a hittable race between serverExplicitReady() and the
1923 # accept() call; sleep a little while to avoid it, otherwise
1924 # we could get an exception
1925 time.sleep(0.1)
1926 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1927 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1928 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1929 self.cli.connect(addr)
1930 self.cliaddr = self.cli.getsockname()
1931
1932 def testStream(self):
1933 msg = self.conn.recv(1024)
1934 self.assertEqual(msg, MSG)
1935 self.assertEqual(self.cliaddr, self.connaddr)
1936
1937 def _testStream(self):
1938 self.cli.send(MSG)
1939 self.cli.close()
1940
1941
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001942@unittest.skipUnless(thread, 'Threading required for this test.')
1943class ContextManagersTest(ThreadedTCPSocketTest):
1944
1945 def _testSocketClass(self):
1946 # base test
1947 with socket.socket() as sock:
1948 self.assertFalse(sock._closed)
1949 self.assertTrue(sock._closed)
1950 # close inside with block
1951 with socket.socket() as sock:
1952 sock.close()
1953 self.assertTrue(sock._closed)
1954 # exception inside with block
1955 with socket.socket() as sock:
1956 self.assertRaises(socket.error, sock.sendall, b'foo')
1957 self.assertTrue(sock._closed)
1958
1959 def testCreateConnectionBase(self):
1960 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001961 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001962 data = conn.recv(1024)
1963 conn.sendall(data)
1964
1965 def _testCreateConnectionBase(self):
1966 address = self.serv.getsockname()
1967 with socket.create_connection(address) as sock:
1968 self.assertFalse(sock._closed)
1969 sock.sendall(b'foo')
1970 self.assertEqual(sock.recv(1024), b'foo')
1971 self.assertTrue(sock._closed)
1972
1973 def testCreateConnectionClose(self):
1974 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001975 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001976 data = conn.recv(1024)
1977 conn.sendall(data)
1978
1979 def _testCreateConnectionClose(self):
1980 address = self.serv.getsockname()
1981 with socket.create_connection(address) as sock:
1982 sock.close()
1983 self.assertTrue(sock._closed)
1984 self.assertRaises(socket.error, sock.sendall, b'foo')
1985
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001986
Antoine Pitroub1c54962010-10-14 15:05:38 +00001987@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1988 "SOCK_CLOEXEC not defined")
1989@unittest.skipUnless(fcntl, "module fcntl not available")
1990class CloexecConstantTest(unittest.TestCase):
1991 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001992 v = linux_version()
1993 if v < (2, 6, 28):
1994 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1995 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00001996 with socket.socket(socket.AF_INET,
1997 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
1998 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1999 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002000
2001
2002@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2003 "SOCK_NONBLOCK not defined")
2004class NonblockConstantTest(unittest.TestCase):
2005 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2006 if nonblock:
2007 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2008 self.assertEqual(s.gettimeout(), timeout)
2009 else:
2010 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2011 self.assertEqual(s.gettimeout(), None)
2012
2013 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002014 v = linux_version()
2015 if v < (2, 6, 28):
2016 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2017 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002018 # a lot of it seems silly and redundant, but I wanted to test that
2019 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002020 with socket.socket(socket.AF_INET,
2021 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2022 self.checkNonblock(s)
2023 s.setblocking(1)
2024 self.checkNonblock(s, False)
2025 s.setblocking(0)
2026 self.checkNonblock(s)
2027 s.settimeout(None)
2028 self.checkNonblock(s, False)
2029 s.settimeout(2.0)
2030 self.checkNonblock(s, timeout=2.0)
2031 s.setblocking(1)
2032 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002033 # defaulttimeout
2034 t = socket.getdefaulttimeout()
2035 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002036 with socket.socket() as s:
2037 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002038 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002039 with socket.socket() as s:
2040 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002041 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002042 with socket.socket() as s:
2043 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002044 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002045 with socket.socket() as s:
2046 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002047 socket.setdefaulttimeout(t)
2048
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002049
Guido van Rossumb995eb72002-07-31 16:08:40 +00002050def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002051 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002052 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002053
2054 tests.extend([
2055 NonBlockingTCPTests,
2056 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002057 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002058 UnbufferedFileObjectClassTestCase,
2059 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002060 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002061 UnicodeReadFileObjectClassTestCase,
2062 UnicodeWriteFileObjectClassTestCase,
2063 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002064 NetworkConnectionNoServer,
2065 NetworkConnectionAttributesTest,
2066 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002067 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002068 CloexecConstantTest,
2069 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002070 ])
Dave Cole331708b2004-08-09 04:51:41 +00002071 if hasattr(socket, "socketpair"):
2072 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002073 if sys.platform == 'linux2':
2074 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002075 if isTipcAvailable():
2076 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002077 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002078
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002079 thread_info = support.threading_setup()
2080 support.run_unittest(*tests)
2081 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002082
2083if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002084 test_main()