blob: 197ca0933f2ff78788dcd6707988c8bc08ed8ef9 [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()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000159 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200160 self.client_ready.set()
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 testSockName(self):
568 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200569 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000570 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000571 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000572 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000574 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
575 # it reasonable to get the host's addr in addition to 0.0.0.0.
576 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000577 try:
578 my_ip_addr = socket.gethostbyname(socket.gethostname())
579 except socket.error:
580 # Probably name lookup wasn't set up right; skip this test
581 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000582 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000583 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584
585 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000586 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587 # We know a socket should start without reuse==0
588 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000589 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000591 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000592
593 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000594 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000595 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000596 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
598 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000599 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000600
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000601 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000602 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000603 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
604 sock.settimeout(1)
605 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000606 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000607
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000608 def testNewAttributes(self):
609 # testing .family, .type and .protocol
610 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
611 self.assertEqual(sock.family, socket.AF_INET)
612 self.assertEqual(sock.type, socket.SOCK_STREAM)
613 self.assertEqual(sock.proto, 0)
614 sock.close()
615
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000616 def test_getsockaddrarg(self):
617 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200618 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000619 big_port = port + 65536
620 neg_port = port - 65536
621 sock = socket.socket()
622 try:
623 self.assertRaises(OverflowError, sock.bind, (host, big_port))
624 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
625 sock.bind((host, port))
626 finally:
627 sock.close()
628
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000629 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000630 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000631 self.assertTrue(hasattr(socket.socket, 'ioctl'))
632 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
633 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
634 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000635 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
636 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000637 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000638 self.assertRaises(ValueError, s.ioctl, -1, None)
639 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000640
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000641 def testGetaddrinfo(self):
642 try:
643 socket.getaddrinfo('localhost', 80)
644 except socket.gaierror as err:
645 if err.errno == socket.EAI_SERVICE:
646 # see http://bugs.python.org/issue1282647
647 self.skipTest("buggy libc version")
648 raise
649 # len of every sequence is supposed to be == 5
650 for info in socket.getaddrinfo(HOST, None):
651 self.assertEqual(len(info), 5)
652 # host can be a domain name, a string representation of an
653 # IPv4/v6 address or None
654 socket.getaddrinfo('localhost', 80)
655 socket.getaddrinfo('127.0.0.1', 80)
656 socket.getaddrinfo(None, 80)
657 if SUPPORTS_IPV6:
658 socket.getaddrinfo('::1', 80)
659 # port can be a string service name such as "http", a numeric
660 # port number or None
661 socket.getaddrinfo(HOST, "http")
662 socket.getaddrinfo(HOST, 80)
663 socket.getaddrinfo(HOST, None)
664 # test family and socktype filters
665 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
666 for family, _, _, _, _ in infos:
667 self.assertEqual(family, socket.AF_INET)
668 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
669 for _, socktype, _, _, _ in infos:
670 self.assertEqual(socktype, socket.SOCK_STREAM)
671 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000672 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000673 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
674 # a server willing to support both IPv4 and IPv6 will
675 # usually do this
676 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
677 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000678 # test keyword arguments
679 a = socket.getaddrinfo(HOST, None)
680 b = socket.getaddrinfo(host=HOST, port=None)
681 self.assertEqual(a, b)
682 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
683 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
684 self.assertEqual(a, b)
685 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
686 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
687 self.assertEqual(a, b)
688 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
689 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
690 self.assertEqual(a, b)
691 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
692 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
693 self.assertEqual(a, b)
694 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
695 socket.AI_PASSIVE)
696 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
697 type=socket.SOCK_STREAM, proto=0,
698 flags=socket.AI_PASSIVE)
699 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000700 # Issue #6697.
701 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000702
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000703 def test_getnameinfo(self):
704 # only IP addresses are allowed
705 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
706
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000707 @unittest.skipUnless(support.is_resource_enabled('network'),
708 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000709 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000710 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000711 # these should all be successful
712 socket.gethostbyname('испытание.python.org')
713 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000714 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
715 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
716 # have a reverse entry yet
717 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000718
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000719 def check_sendall_interrupted(self, with_timeout):
720 # socketpair() is not stricly required, but it makes things easier.
721 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
722 self.skipTest("signal.alarm and socket.socketpair required for this test")
723 # Our signal handlers clobber the C errno by calling a math function
724 # with an invalid domain value.
725 def ok_handler(*args):
726 self.assertRaises(ValueError, math.acosh, 0)
727 def raising_handler(*args):
728 self.assertRaises(ValueError, math.acosh, 0)
729 1 // 0
730 c, s = socket.socketpair()
731 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
732 try:
733 if with_timeout:
734 # Just above the one second minimum for signal.alarm
735 c.settimeout(1.5)
736 with self.assertRaises(ZeroDivisionError):
737 signal.alarm(1)
738 c.sendall(b"x" * (1024**2))
739 if with_timeout:
740 signal.signal(signal.SIGALRM, ok_handler)
741 signal.alarm(1)
742 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
743 finally:
744 signal.signal(signal.SIGALRM, old_alarm)
745 c.close()
746 s.close()
747
748 def test_sendall_interrupted(self):
749 self.check_sendall_interrupted(False)
750
751 def test_sendall_interrupted_with_timeout(self):
752 self.check_sendall_interrupted(True)
753
Antoine Pitroue033e062010-10-29 10:38:18 +0000754 def test_dealloc_warn(self):
755 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
756 r = repr(sock)
757 with self.assertWarns(ResourceWarning) as cm:
758 sock = None
759 support.gc_collect()
760 self.assertIn(r, str(cm.warning.args[0]))
761 # An open socket file object gets dereferenced after the socket
762 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
763 f = sock.makefile('rb')
764 r = repr(sock)
765 sock = None
766 support.gc_collect()
767 with self.assertWarns(ResourceWarning):
768 f = None
769 support.gc_collect()
770
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000771 def test_name_closed_socketio(self):
772 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
773 fp = sock.makefile("rb")
774 fp.close()
775 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
776
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200777 def testListenBacklog0(self):
778 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
779 srv.bind((HOST, 0))
780 # backlog = 0
781 srv.listen(0)
782 srv.close()
783
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000784
Victor Stinner45df8202010-04-28 22:31:17 +0000785@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786class BasicTCPTest(SocketConnectedTest):
787
788 def __init__(self, methodName='runTest'):
789 SocketConnectedTest.__init__(self, methodName=methodName)
790
791 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000792 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000794 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000795
796 def _testRecv(self):
797 self.serv_conn.send(MSG)
798
799 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000800 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000801 seg1 = self.cli_conn.recv(len(MSG) - 3)
802 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000803 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000804 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000805
806 def _testOverFlowRecv(self):
807 self.serv_conn.send(MSG)
808
809 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000810 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000812 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813
814 def _testRecvFrom(self):
815 self.serv_conn.send(MSG)
816
817 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000818 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
820 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000821 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000822 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823
824 def _testOverFlowRecvFrom(self):
825 self.serv_conn.send(MSG)
826
827 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000828 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000829 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830 while 1:
831 read = self.cli_conn.recv(1024)
832 if not read:
833 break
Guido van Rossume531e292002-08-08 20:28:34 +0000834 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000835 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836
837 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000838 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000839 self.serv_conn.sendall(big_chunk)
840
841 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000842 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000843 fd = self.cli_conn.fileno()
844 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000845 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000846 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000847 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000848 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849
850 def _testFromFd(self):
851 self.serv_conn.send(MSG)
852
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000853 def testDup(self):
854 # Testing dup()
855 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000856 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000857 msg = sock.recv(1024)
858 self.assertEqual(msg, MSG)
859
860 def _testDup(self):
861 self.serv_conn.send(MSG)
862
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000864 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000866 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000867 # wait for _testShutdown to finish: on OS X, when the server
868 # closes the connection the client also becomes disconnected,
869 # and the client's shutdown call will fail. (Issue #4397.)
870 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871
872 def _testShutdown(self):
873 self.serv_conn.send(MSG)
874 self.serv_conn.shutdown(2)
875
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000876 def testDetach(self):
877 # Testing detach()
878 fileno = self.cli_conn.fileno()
879 f = self.cli_conn.detach()
880 self.assertEqual(f, fileno)
881 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000882 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
883 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000884 # ...but we can create another socket using the (still open)
885 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000886 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000887 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000888 msg = sock.recv(1024)
889 self.assertEqual(msg, MSG)
890
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000891 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000892 self.serv_conn.send(MSG)
893
Victor Stinner45df8202010-04-28 22:31:17 +0000894@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895class BasicUDPTest(ThreadedUDPSocketTest):
896
897 def __init__(self, methodName='runTest'):
898 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
899
900 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000901 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000902 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000903 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000904
905 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000906 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000907
Guido van Rossum1c938012002-06-12 21:17:20 +0000908 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000909 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000910 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000911 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000912
Guido van Rossum1c938012002-06-12 21:17:20 +0000913 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000914 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000915
Guido van Rossumd8faa362007-04-27 19:54:29 +0000916 def testRecvFromNegative(self):
917 # Negative lengths passed to recvfrom should give ValueError.
918 self.assertRaises(ValueError, self.serv.recvfrom, -1)
919
920 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000921 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000922
Victor Stinner45df8202010-04-28 22:31:17 +0000923@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000924class TCPCloserTest(ThreadedTCPSocketTest):
925
926 def testClose(self):
927 conn, addr = self.serv.accept()
928 conn.close()
929
930 sd = self.cli
931 read, write, err = select.select([sd], [], [], 1.0)
932 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000933 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000934
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000935 # Calling close() many times should be safe.
936 conn.close()
937 conn.close()
938
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000939 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000940 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000941 time.sleep(1.0)
942
Victor Stinner45df8202010-04-28 22:31:17 +0000943@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000944class BasicSocketPairTest(SocketPairTest):
945
946 def __init__(self, methodName='runTest'):
947 SocketPairTest.__init__(self, methodName=methodName)
948
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000949 def _check_defaults(self, sock):
950 self.assertIsInstance(sock, socket.socket)
951 if hasattr(socket, 'AF_UNIX'):
952 self.assertEqual(sock.family, socket.AF_UNIX)
953 else:
954 self.assertEqual(sock.family, socket.AF_INET)
955 self.assertEqual(sock.type, socket.SOCK_STREAM)
956 self.assertEqual(sock.proto, 0)
957
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000958 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000959 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000960
961 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000962 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000963
Dave Cole331708b2004-08-09 04:51:41 +0000964 def testRecv(self):
965 msg = self.serv.recv(1024)
966 self.assertEqual(msg, MSG)
967
968 def _testRecv(self):
969 self.cli.send(MSG)
970
971 def testSend(self):
972 self.serv.send(MSG)
973
974 def _testSend(self):
975 msg = self.cli.recv(1024)
976 self.assertEqual(msg, MSG)
977
Victor Stinner45df8202010-04-28 22:31:17 +0000978@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979class NonBlockingTCPTests(ThreadedTCPSocketTest):
980
981 def __init__(self, methodName='runTest'):
982 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
983
984 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000985 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986 self.serv.setblocking(0)
987 start = time.time()
988 try:
989 self.serv.accept()
990 except socket.error:
991 pass
992 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000993 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000994
995 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000996 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000997
Antoine Pitroub1c54962010-10-14 15:05:38 +0000998 if hasattr(socket, "SOCK_NONBLOCK"):
999 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001000 v = linux_version()
1001 if v < (2, 6, 28):
1002 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1003 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001004 # reinit server socket
1005 self.serv.close()
1006 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001007 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001008 self.port = support.bind_port(self.serv)
1009 self.serv.listen(1)
1010 # actual testing
1011 start = time.time()
1012 try:
1013 self.serv.accept()
1014 except socket.error:
1015 pass
1016 end = time.time()
1017 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1018
1019 def _testInitNonBlocking(self):
1020 pass
1021
Antoine Pitrou600232b2011-01-05 21:03:42 +00001022 def testInheritFlags(self):
1023 # Issue #7995: when calling accept() on a listening socket with a
1024 # timeout, the resulting socket should not be non-blocking.
1025 self.serv.settimeout(10)
1026 try:
1027 conn, addr = self.serv.accept()
1028 message = conn.recv(len(MSG))
1029 finally:
1030 conn.close()
1031 self.serv.settimeout(None)
1032
1033 def _testInheritFlags(self):
1034 time.sleep(0.1)
1035 self.cli.connect((HOST, self.port))
1036 time.sleep(0.5)
1037 self.cli.send(MSG)
1038
Guido van Rossum24e4af82002-06-12 19:18:08 +00001039 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001040 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001041 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001042 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001043 conn, addr = self.serv.accept()
1044 except socket.error:
1045 pass
1046 else:
1047 self.fail("Error trying to do non-blocking accept.")
1048 read, write, err = select.select([self.serv], [], [])
1049 if self.serv in read:
1050 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001051 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001052 else:
1053 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001054
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001056 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001057 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058
1059 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001060 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001062 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001063
1064 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001065 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001066 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067
1068 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001069 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070 conn, addr = self.serv.accept()
1071 conn.setblocking(0)
1072 try:
1073 msg = conn.recv(len(MSG))
1074 except socket.error:
1075 pass
1076 else:
1077 self.fail("Error trying to do non-blocking recv.")
1078 read, write, err = select.select([conn], [], [])
1079 if conn in read:
1080 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001081 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001082 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001083 else:
1084 self.fail("Error during select call to non-blocking socket.")
1085
1086 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001087 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001088 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089 self.cli.send(MSG)
1090
Victor Stinner45df8202010-04-28 22:31:17 +00001091@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001092class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001093 """Unit tests for the object returned by socket.makefile()
1094
Antoine Pitrou834bd812010-10-13 16:17:14 +00001095 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001096 the client connection. You can read from this file to
1097 get output from the server.
1098
Antoine Pitrou834bd812010-10-13 16:17:14 +00001099 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001100 server connection. You can write to this file to send output
1101 to the client.
1102 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001103
Guido van Rossume9f66142002-08-07 15:46:19 +00001104 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001105 encoding = 'utf8'
1106 errors = 'strict'
1107 newline = None
1108
1109 read_mode = 'rb'
1110 read_msg = MSG
1111 write_mode = 'wb'
1112 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001113
Guido van Rossum24e4af82002-06-12 19:18:08 +00001114 def __init__(self, methodName='runTest'):
1115 SocketConnectedTest.__init__(self, methodName=methodName)
1116
1117 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001118 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1119 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001120 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001121 self.read_file = self.cli_conn.makefile(
1122 self.read_mode, self.bufsize,
1123 encoding = self.encoding,
1124 errors = self.errors,
1125 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126
1127 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001128 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001129 self.read_file.close()
1130 self.assertTrue(self.read_file.closed)
1131 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001132 SocketConnectedTest.tearDown(self)
1133
1134 def clientSetUp(self):
1135 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001136 self.write_file = self.serv_conn.makefile(
1137 self.write_mode, self.bufsize,
1138 encoding = self.encoding,
1139 errors = self.errors,
1140 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001141
1142 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001143 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001144 self.write_file.close()
1145 self.assertTrue(self.write_file.closed)
1146 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001147 SocketConnectedTest.clientTearDown(self)
1148
Antoine Pitrou5d5381e2011-02-25 23:14:08 +00001149 def testReadAfterTimeout(self):
1150 # Issue #7322: A file object must disallow further reads
1151 # after a timeout has occurred.
1152 self.cli_conn.settimeout(1)
1153 self.read_file.read(3)
1154 # First read raises a timeout
1155 self.assertRaises(socket.timeout, self.read_file.read, 1)
1156 # Second read is disallowed
1157 with self.assertRaises(IOError) as ctx:
1158 self.read_file.read(1)
1159 self.assertIn("cannot read from timed out object", str(ctx.exception))
1160
1161 def _testReadAfterTimeout(self):
1162 self.write_file.write(self.write_msg[0:3])
1163 self.write_file.flush()
1164 self.serv_finished.wait()
1165
Guido van Rossum24e4af82002-06-12 19:18:08 +00001166 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001167 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001168 first_seg = self.read_file.read(len(self.read_msg)-3)
1169 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001170 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001171 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001172
1173 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001174 self.write_file.write(self.write_msg)
1175 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001176
Guido van Rossum8c943832002-08-08 01:00:28 +00001177 def testFullRead(self):
1178 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001179 msg = self.read_file.read()
1180 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001181
1182 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001183 self.write_file.write(self.write_msg)
1184 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001185
Guido van Rossum24e4af82002-06-12 19:18:08 +00001186 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001187 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001188 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001189 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001190 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001191 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001192 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001193 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001194 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001195
1196 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001197 self.write_file.write(self.write_msg)
1198 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001199
1200 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001201 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001202 line = self.read_file.readline()
1203 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001204
1205 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001206 self.write_file.write(self.write_msg)
1207 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001208
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001209 def testCloseAfterMakefile(self):
1210 # The file returned by makefile should keep the socket open.
1211 self.cli_conn.close()
1212 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001213 msg = self.read_file.read()
1214 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001215
1216 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001217 self.write_file.write(self.write_msg)
1218 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001219
1220 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001221 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001222 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001223 if isinstance(self.read_msg, str):
1224 msg = msg.decode()
1225 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001226
1227 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001228 self.write_file.write(self.write_msg)
1229 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001230
Tim Peters116d83c2004-03-28 02:20:45 +00001231 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001232 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001233
1234 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001235 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001236
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001237 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001238 self.assertEqual(self.read_file.mode, self.read_mode)
1239 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001240
1241 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001242 self.assertEqual(self.write_file.mode, self.write_mode)
1243 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001244
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001245 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001246 self.read_file.close()
1247 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001248 self.cli_conn.close()
1249 self.assertRaises(socket.error, self.cli_conn.getsockname)
1250
1251 def _testRealClose(self):
1252 pass
1253
1254
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001255class FileObjectInterruptedTestCase(unittest.TestCase):
1256 """Test that the file object correctly handles EINTR internally."""
1257
1258 class MockSocket(object):
1259 def __init__(self, recv_funcs=()):
1260 # A generator that returns callables that we'll call for each
1261 # call to recv().
1262 self._recv_step = iter(recv_funcs)
1263
1264 def recv_into(self, buffer):
1265 data = next(self._recv_step)()
1266 assert len(buffer) >= len(data)
1267 buffer[:len(data)] = data
1268 return len(data)
1269
1270 def _decref_socketios(self):
1271 pass
1272
1273 def _textiowrap_for_test(self, buffering=-1):
1274 raw = socket.SocketIO(self, "r")
1275 if buffering < 0:
1276 buffering = io.DEFAULT_BUFFER_SIZE
1277 if buffering == 0:
1278 return raw
1279 buffer = io.BufferedReader(raw, buffering)
1280 text = io.TextIOWrapper(buffer, None, None)
1281 text.mode = "rb"
1282 return text
1283
1284 @staticmethod
1285 def _raise_eintr():
1286 raise socket.error(errno.EINTR)
1287
1288 def _textiowrap_mock_socket(self, mock, buffering=-1):
1289 raw = socket.SocketIO(mock, "r")
1290 if buffering < 0:
1291 buffering = io.DEFAULT_BUFFER_SIZE
1292 if buffering == 0:
1293 return raw
1294 buffer = io.BufferedReader(raw, buffering)
1295 text = io.TextIOWrapper(buffer, None, None)
1296 text.mode = "rb"
1297 return text
1298
1299 def _test_readline(self, size=-1, buffering=-1):
1300 mock_sock = self.MockSocket(recv_funcs=[
1301 lambda : b"This is the first line\nAnd the sec",
1302 self._raise_eintr,
1303 lambda : b"ond line is here\n",
1304 lambda : b"",
1305 lambda : b"", # XXX(gps): io library does an extra EOF read
1306 ])
1307 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001308 self.assertEqual(fo.readline(size), "This is the first line\n")
1309 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001310
1311 def _test_read(self, size=-1, buffering=-1):
1312 mock_sock = self.MockSocket(recv_funcs=[
1313 lambda : b"This is the first line\nAnd the sec",
1314 self._raise_eintr,
1315 lambda : b"ond line is here\n",
1316 lambda : b"",
1317 lambda : b"", # XXX(gps): io library does an extra EOF read
1318 ])
1319 expecting = (b"This is the first line\n"
1320 b"And the second line is here\n")
1321 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1322 if buffering == 0:
1323 data = b''
1324 else:
1325 data = ''
1326 expecting = expecting.decode('utf8')
1327 while len(data) != len(expecting):
1328 part = fo.read(size)
1329 if not part:
1330 break
1331 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001332 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001333
1334 def test_default(self):
1335 self._test_readline()
1336 self._test_readline(size=100)
1337 self._test_read()
1338 self._test_read(size=100)
1339
1340 def test_with_1k_buffer(self):
1341 self._test_readline(buffering=1024)
1342 self._test_readline(size=100, buffering=1024)
1343 self._test_read(buffering=1024)
1344 self._test_read(size=100, buffering=1024)
1345
1346 def _test_readline_no_buffer(self, size=-1):
1347 mock_sock = self.MockSocket(recv_funcs=[
1348 lambda : b"a",
1349 lambda : b"\n",
1350 lambda : b"B",
1351 self._raise_eintr,
1352 lambda : b"b",
1353 lambda : b"",
1354 ])
1355 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001356 self.assertEqual(fo.readline(size), b"a\n")
1357 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001358
1359 def test_no_buffer(self):
1360 self._test_readline_no_buffer()
1361 self._test_readline_no_buffer(size=4)
1362 self._test_read(buffering=0)
1363 self._test_read(size=100, buffering=0)
1364
1365
Guido van Rossume9f66142002-08-07 15:46:19 +00001366class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1367
1368 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001369
Guido van Rossume9f66142002-08-07 15:46:19 +00001370 In this case (and in this case only), it should be possible to
1371 create a file object, read a line from it, create another file
1372 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001373 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001374 when reading multiple requests from the same socket."""
1375
1376 bufsize = 0 # Use unbuffered mode
1377
1378 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001379 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001380 line = self.read_file.readline() # first line
1381 self.assertEqual(line, b"A. " + self.write_msg) # first line
1382 self.read_file = self.cli_conn.makefile('rb', 0)
1383 line = self.read_file.readline() # second line
1384 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001385
1386 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001387 self.write_file.write(b"A. " + self.write_msg)
1388 self.write_file.write(b"B. " + self.write_msg)
1389 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001390
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001391 def testMakefileClose(self):
1392 # The file returned by makefile should keep the socket open...
1393 self.cli_conn.close()
1394 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001395 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001396 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001397 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001398 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1399
1400 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001401 self.write_file.write(self.write_msg)
1402 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001403
1404 def testMakefileCloseSocketDestroy(self):
1405 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001406 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001407 refcount_after = sys.getrefcount(self.cli_conn)
1408 self.assertEqual(refcount_before - 1, refcount_after)
1409
1410 def _testMakefileCloseSocketDestroy(self):
1411 pass
1412
Antoine Pitrou98b46702010-09-18 22:59:00 +00001413 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001414 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001415 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1416
1417 def testSmallReadNonBlocking(self):
1418 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001419 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1420 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001421 self.evt1.set()
1422 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001423 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001424 if first_seg is None:
1425 # Data not arrived (can happen under Windows), wait a bit
1426 time.sleep(0.5)
1427 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001428 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001429 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001430 self.assertEqual(n, 3)
1431 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001432 self.assertEqual(msg, self.read_msg)
1433 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1434 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001435
1436 def _testSmallReadNonBlocking(self):
1437 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001438 self.write_file.write(self.write_msg)
1439 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001440 self.evt2.set()
1441 # Avoid cloding the socket before the server test has finished,
1442 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1443 self.serv_finished.wait(5.0)
1444
1445 def testWriteNonBlocking(self):
1446 self.cli_finished.wait(5.0)
1447 # The client thread can't skip directly - the SkipTest exception
1448 # would appear as a failure.
1449 if self.serv_skipped:
1450 self.skipTest(self.serv_skipped)
1451
1452 def _testWriteNonBlocking(self):
1453 self.serv_skipped = None
1454 self.serv_conn.setblocking(False)
1455 # Try to saturate the socket buffer pipe with repeated large writes.
1456 BIG = b"x" * (1024 ** 2)
1457 LIMIT = 10
1458 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001459 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001460 self.assertGreater(n, 0)
1461 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001462 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001463 if n is None:
1464 # Succeeded
1465 break
1466 self.assertGreater(n, 0)
1467 else:
1468 # Let us know that this test didn't manage to establish
1469 # the expected conditions. This is not a failure in itself but,
1470 # if it happens repeatedly, the test should be fixed.
1471 self.serv_skipped = "failed to saturate the socket buffer"
1472
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001473
Guido van Rossum8c943832002-08-08 01:00:28 +00001474class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1475
1476 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1477
1478
1479class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1480
1481 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001482
Thomas Woutersb2137042007-02-01 18:02:27 +00001483
Antoine Pitrou834bd812010-10-13 16:17:14 +00001484class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1485 """Tests for socket.makefile() in text mode (rather than binary)"""
1486
1487 read_mode = 'r'
1488 read_msg = MSG.decode('utf8')
1489 write_mode = 'wb'
1490 write_msg = MSG
1491 newline = ''
1492
1493
1494class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1495 """Tests for socket.makefile() in text mode (rather than binary)"""
1496
1497 read_mode = 'rb'
1498 read_msg = MSG
1499 write_mode = 'w'
1500 write_msg = MSG.decode('utf8')
1501 newline = ''
1502
1503
1504class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1505 """Tests for socket.makefile() in text mode (rather than binary)"""
1506
1507 read_mode = 'r'
1508 read_msg = MSG.decode('utf8')
1509 write_mode = 'w'
1510 write_msg = MSG.decode('utf8')
1511 newline = ''
1512
1513
Guido van Rossumd8faa362007-04-27 19:54:29 +00001514class NetworkConnectionTest(object):
1515 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001516
Guido van Rossumd8faa362007-04-27 19:54:29 +00001517 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001518 # We're inherited below by BasicTCPTest2, which also inherits
1519 # BasicTCPTest, which defines self.port referenced below.
1520 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001521 self.serv_conn = self.cli
1522
1523class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1524 """Tests that NetworkConnection does not break existing TCP functionality.
1525 """
1526
1527class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001528
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001529 class MockSocket(socket.socket):
1530 def connect(self, *args):
1531 raise socket.timeout('timed out')
1532
1533 @contextlib.contextmanager
1534 def mocked_socket_module(self):
1535 """Return a socket which times out on connect"""
1536 old_socket = socket.socket
1537 socket.socket = self.MockSocket
1538 try:
1539 yield
1540 finally:
1541 socket.socket = old_socket
1542
1543 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001544 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001545 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001546 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001547 with self.assertRaises(socket.error) as cm:
1548 cli.connect((HOST, port))
1549 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1550
1551 def test_create_connection(self):
1552 # Issue #9792: errors raised by create_connection() should have
1553 # a proper errno attribute.
1554 port = support.find_unused_port()
1555 with self.assertRaises(socket.error) as cm:
1556 socket.create_connection((HOST, port))
1557 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1558
1559 def test_create_connection_timeout(self):
1560 # Issue #9792: create_connection() should not recast timeout errors
1561 # as generic socket errors.
1562 with self.mocked_socket_module():
1563 with self.assertRaises(socket.timeout):
1564 socket.create_connection((HOST, 1234))
1565
Guido van Rossumd8faa362007-04-27 19:54:29 +00001566
Victor Stinner45df8202010-04-28 22:31:17 +00001567@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001568class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1569
1570 def __init__(self, methodName='runTest'):
1571 SocketTCPTest.__init__(self, methodName=methodName)
1572 ThreadableTest.__init__(self)
1573
1574 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001575 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001576
1577 def clientTearDown(self):
1578 self.cli.close()
1579 self.cli = None
1580 ThreadableTest.clientTearDown(self)
1581
1582 def _justAccept(self):
1583 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001584 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001585
1586 testFamily = _justAccept
1587 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001588 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001589 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001590 self.assertEqual(self.cli.family, 2)
1591
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001592 testSourceAddress = _justAccept
1593 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001594 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1595 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001596 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001597 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001598 # The port number being used is sufficient to show that the bind()
1599 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001600
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601 testTimeoutDefault = _justAccept
1602 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001603 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001604 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001605 socket.setdefaulttimeout(42)
1606 try:
1607 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001608 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001609 finally:
1610 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001611 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001612
1613 testTimeoutNone = _justAccept
1614 def _testTimeoutNone(self):
1615 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001616 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001617 socket.setdefaulttimeout(30)
1618 try:
1619 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001620 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001621 finally:
1622 socket.setdefaulttimeout(None)
1623 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624
1625 testTimeoutValueNamed = _justAccept
1626 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001627 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001628 self.assertEqual(self.cli.gettimeout(), 30)
1629
1630 testTimeoutValueNonamed = _justAccept
1631 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001632 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001633 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001634 self.assertEqual(self.cli.gettimeout(), 30)
1635
Victor Stinner45df8202010-04-28 22:31:17 +00001636@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001637class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1638
1639 def __init__(self, methodName='runTest'):
1640 SocketTCPTest.__init__(self, methodName=methodName)
1641 ThreadableTest.__init__(self)
1642
1643 def clientSetUp(self):
1644 pass
1645
1646 def clientTearDown(self):
1647 self.cli.close()
1648 self.cli = None
1649 ThreadableTest.clientTearDown(self)
1650
1651 def testInsideTimeout(self):
1652 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001653 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001654 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001655 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001656 testOutsideTimeout = testInsideTimeout
1657
1658 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001659 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001660 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001661 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001662
1663 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001664 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001665 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001666
1667
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001668class TCPTimeoutTest(SocketTCPTest):
1669
1670 def testTCPTimeout(self):
1671 def raise_timeout(*args, **kwargs):
1672 self.serv.settimeout(1.0)
1673 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001674 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001675 "Error generating a timeout exception (TCP)")
1676
1677 def testTimeoutZero(self):
1678 ok = False
1679 try:
1680 self.serv.settimeout(0.0)
1681 foo = self.serv.accept()
1682 except socket.timeout:
1683 self.fail("caught timeout instead of error (TCP)")
1684 except socket.error:
1685 ok = True
1686 except:
1687 self.fail("caught unexpected exception (TCP)")
1688 if not ok:
1689 self.fail("accept() returned success when we did not expect it")
1690
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001691 def testInterruptedTimeout(self):
1692 # XXX I don't know how to do this test on MSWindows or any other
1693 # plaform that doesn't support signal.alarm() or os.kill(), though
1694 # the bug should have existed on all platforms.
1695 if not hasattr(signal, "alarm"):
1696 return # can only test on *nix
1697 self.serv.settimeout(5.0) # must be longer than alarm
1698 class Alarm(Exception):
1699 pass
1700 def alarm_handler(signal, frame):
1701 raise Alarm
1702 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1703 try:
1704 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1705 try:
1706 foo = self.serv.accept()
1707 except socket.timeout:
1708 self.fail("caught timeout instead of Alarm")
1709 except Alarm:
1710 pass
1711 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001712 self.fail("caught other exception instead of Alarm:"
1713 " %s(%s):\n%s" %
1714 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001715 else:
1716 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001717 finally:
1718 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001719 except Alarm:
1720 self.fail("got Alarm in wrong place")
1721 finally:
1722 # no alarm can be pending. Safe to restore old handler.
1723 signal.signal(signal.SIGALRM, old_alarm)
1724
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001725class UDPTimeoutTest(SocketTCPTest):
1726
1727 def testUDPTimeout(self):
1728 def raise_timeout(*args, **kwargs):
1729 self.serv.settimeout(1.0)
1730 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001731 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001732 "Error generating a timeout exception (UDP)")
1733
1734 def testTimeoutZero(self):
1735 ok = False
1736 try:
1737 self.serv.settimeout(0.0)
1738 foo = self.serv.recv(1024)
1739 except socket.timeout:
1740 self.fail("caught timeout instead of error (UDP)")
1741 except socket.error:
1742 ok = True
1743 except:
1744 self.fail("caught unexpected exception (UDP)")
1745 if not ok:
1746 self.fail("recv() returned success when we did not expect it")
1747
1748class TestExceptions(unittest.TestCase):
1749
1750 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001751 self.assertTrue(issubclass(socket.error, Exception))
1752 self.assertTrue(issubclass(socket.herror, socket.error))
1753 self.assertTrue(issubclass(socket.gaierror, socket.error))
1754 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001755
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001756class TestLinuxAbstractNamespace(unittest.TestCase):
1757
1758 UNIX_PATH_MAX = 108
1759
1760 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001761 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001762 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1763 s1.bind(address)
1764 s1.listen(1)
1765 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1766 s2.connect(s1.getsockname())
1767 with s1.accept()[0] as s3:
1768 self.assertEqual(s1.getsockname(), address)
1769 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001770
1771 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001772 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001773 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1774 s.bind(address)
1775 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001776
1777 def testNameOverflow(self):
1778 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001779 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1780 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001781
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001782
Victor Stinner45df8202010-04-28 22:31:17 +00001783@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001784class BufferIOTest(SocketConnectedTest):
1785 """
1786 Test the buffer versions of socket.recv() and socket.send().
1787 """
1788 def __init__(self, methodName='runTest'):
1789 SocketConnectedTest.__init__(self, methodName=methodName)
1790
Antoine Pitrou25480782010-03-17 22:50:28 +00001791 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001792 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001793 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001794 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001795 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001796 self.assertEqual(msg, MSG)
1797
Antoine Pitrou25480782010-03-17 22:50:28 +00001798 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001799 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001800 self.serv_conn.send(buf)
1801
Antoine Pitrou25480782010-03-17 22:50:28 +00001802 def testRecvIntoBytearray(self):
1803 buf = bytearray(1024)
1804 nbytes = self.cli_conn.recv_into(buf)
1805 self.assertEqual(nbytes, len(MSG))
1806 msg = buf[:len(MSG)]
1807 self.assertEqual(msg, MSG)
1808
1809 _testRecvIntoBytearray = _testRecvIntoArray
1810
1811 def testRecvIntoMemoryview(self):
1812 buf = bytearray(1024)
1813 nbytes = self.cli_conn.recv_into(memoryview(buf))
1814 self.assertEqual(nbytes, len(MSG))
1815 msg = buf[:len(MSG)]
1816 self.assertEqual(msg, MSG)
1817
1818 _testRecvIntoMemoryview = _testRecvIntoArray
1819
1820 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001821 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001822 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001823 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001824 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001825 self.assertEqual(msg, MSG)
1826
Antoine Pitrou25480782010-03-17 22:50:28 +00001827 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001828 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001829 self.serv_conn.send(buf)
1830
Antoine Pitrou25480782010-03-17 22:50:28 +00001831 def testRecvFromIntoBytearray(self):
1832 buf = bytearray(1024)
1833 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1834 self.assertEqual(nbytes, len(MSG))
1835 msg = buf[:len(MSG)]
1836 self.assertEqual(msg, MSG)
1837
1838 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1839
1840 def testRecvFromIntoMemoryview(self):
1841 buf = bytearray(1024)
1842 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1843 self.assertEqual(nbytes, len(MSG))
1844 msg = buf[:len(MSG)]
1845 self.assertEqual(msg, MSG)
1846
1847 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1848
Christian Heimes043d6f62008-01-07 17:19:16 +00001849
1850TIPC_STYPE = 2000
1851TIPC_LOWER = 200
1852TIPC_UPPER = 210
1853
1854def isTipcAvailable():
1855 """Check if the TIPC module is loaded
1856
1857 The TIPC module is not loaded automatically on Ubuntu and probably
1858 other Linux distros.
1859 """
1860 if not hasattr(socket, "AF_TIPC"):
1861 return False
1862 if not os.path.isfile("/proc/modules"):
1863 return False
1864 with open("/proc/modules") as f:
1865 for line in f:
1866 if line.startswith("tipc "):
1867 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001868 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001869 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1870 return False
1871
1872class TIPCTest (unittest.TestCase):
1873 def testRDM(self):
1874 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1875 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1876
1877 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1878 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1879 TIPC_LOWER, TIPC_UPPER)
1880 srv.bind(srvaddr)
1881
1882 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1883 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1884 cli.sendto(MSG, sendaddr)
1885
1886 msg, recvaddr = srv.recvfrom(1024)
1887
1888 self.assertEqual(cli.getsockname(), recvaddr)
1889 self.assertEqual(msg, MSG)
1890
1891
1892class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1893 def __init__(self, methodName = 'runTest'):
1894 unittest.TestCase.__init__(self, methodName = methodName)
1895 ThreadableTest.__init__(self)
1896
1897 def setUp(self):
1898 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1899 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1900 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1901 TIPC_LOWER, TIPC_UPPER)
1902 self.srv.bind(srvaddr)
1903 self.srv.listen(5)
1904 self.serverExplicitReady()
1905 self.conn, self.connaddr = self.srv.accept()
1906
1907 def clientSetUp(self):
1908 # The is a hittable race between serverExplicitReady() and the
1909 # accept() call; sleep a little while to avoid it, otherwise
1910 # we could get an exception
1911 time.sleep(0.1)
1912 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1913 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1914 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1915 self.cli.connect(addr)
1916 self.cliaddr = self.cli.getsockname()
1917
1918 def testStream(self):
1919 msg = self.conn.recv(1024)
1920 self.assertEqual(msg, MSG)
1921 self.assertEqual(self.cliaddr, self.connaddr)
1922
1923 def _testStream(self):
1924 self.cli.send(MSG)
1925 self.cli.close()
1926
1927
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001928@unittest.skipUnless(thread, 'Threading required for this test.')
1929class ContextManagersTest(ThreadedTCPSocketTest):
1930
1931 def _testSocketClass(self):
1932 # base test
1933 with socket.socket() as sock:
1934 self.assertFalse(sock._closed)
1935 self.assertTrue(sock._closed)
1936 # close inside with block
1937 with socket.socket() as sock:
1938 sock.close()
1939 self.assertTrue(sock._closed)
1940 # exception inside with block
1941 with socket.socket() as sock:
1942 self.assertRaises(socket.error, sock.sendall, b'foo')
1943 self.assertTrue(sock._closed)
1944
1945 def testCreateConnectionBase(self):
1946 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001947 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001948 data = conn.recv(1024)
1949 conn.sendall(data)
1950
1951 def _testCreateConnectionBase(self):
1952 address = self.serv.getsockname()
1953 with socket.create_connection(address) as sock:
1954 self.assertFalse(sock._closed)
1955 sock.sendall(b'foo')
1956 self.assertEqual(sock.recv(1024), b'foo')
1957 self.assertTrue(sock._closed)
1958
1959 def testCreateConnectionClose(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 _testCreateConnectionClose(self):
1966 address = self.serv.getsockname()
1967 with socket.create_connection(address) as sock:
1968 sock.close()
1969 self.assertTrue(sock._closed)
1970 self.assertRaises(socket.error, sock.sendall, b'foo')
1971
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001972
Antoine Pitroub1c54962010-10-14 15:05:38 +00001973@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1974 "SOCK_CLOEXEC not defined")
1975@unittest.skipUnless(fcntl, "module fcntl not available")
1976class CloexecConstantTest(unittest.TestCase):
1977 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001978 v = linux_version()
1979 if v < (2, 6, 28):
1980 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1981 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00001982 with socket.socket(socket.AF_INET,
1983 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
1984 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1985 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001986
1987
1988@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1989 "SOCK_NONBLOCK not defined")
1990class NonblockConstantTest(unittest.TestCase):
1991 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1992 if nonblock:
1993 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1994 self.assertEqual(s.gettimeout(), timeout)
1995 else:
1996 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1997 self.assertEqual(s.gettimeout(), None)
1998
1999 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002000 v = linux_version()
2001 if v < (2, 6, 28):
2002 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2003 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002004 # a lot of it seems silly and redundant, but I wanted to test that
2005 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002006 with socket.socket(socket.AF_INET,
2007 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2008 self.checkNonblock(s)
2009 s.setblocking(1)
2010 self.checkNonblock(s, False)
2011 s.setblocking(0)
2012 self.checkNonblock(s)
2013 s.settimeout(None)
2014 self.checkNonblock(s, False)
2015 s.settimeout(2.0)
2016 self.checkNonblock(s, timeout=2.0)
2017 s.setblocking(1)
2018 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002019 # defaulttimeout
2020 t = socket.getdefaulttimeout()
2021 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002022 with socket.socket() as s:
2023 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002024 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002025 with socket.socket() as s:
2026 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002027 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002028 with socket.socket() as s:
2029 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002030 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002031 with socket.socket() as s:
2032 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002033 socket.setdefaulttimeout(t)
2034
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002035
Guido van Rossumb995eb72002-07-31 16:08:40 +00002036def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002037 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002038 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002039
2040 tests.extend([
2041 NonBlockingTCPTests,
2042 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002043 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002044 UnbufferedFileObjectClassTestCase,
2045 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002046 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002047 UnicodeReadFileObjectClassTestCase,
2048 UnicodeWriteFileObjectClassTestCase,
2049 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002050 NetworkConnectionNoServer,
2051 NetworkConnectionAttributesTest,
2052 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002053 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002054 CloexecConstantTest,
2055 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002056 ])
Dave Cole331708b2004-08-09 04:51:41 +00002057 if hasattr(socket, "socketpair"):
2058 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002059 if sys.platform == 'linux2':
2060 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002061 if isTipcAvailable():
2062 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002063 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002064
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002065 thread_info = support.threading_setup()
2066 support.run_unittest(*tests)
2067 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002068
2069if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002070 test_main()