blob: a948541825ab7e150bab7bc6f070702d6de7a163 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitroub1c54962010-10-14 15:05:38 +000021try:
22 import fcntl
23except ImportError:
24 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000026def try_address(host, port=0, family=socket.AF_INET):
27 """Try to bind a socket on the given host:port and return True
28 if that has been possible."""
29 try:
30 sock = socket.socket(family, socket.SOCK_STREAM)
31 sock.bind((host, port))
32 except (socket.error, socket.gaierror):
33 return False
34 else:
35 sock.close()
36 return True
37
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000038def linux_version():
39 try:
40 # platform.release() is something like '2.6.33.7-desktop-2mnb'
41 version_string = platform.release().split('-')[0]
42 return tuple(map(int, version_string.split('.')))
43 except ValueError:
44 return 0, 0, 0
45
Benjamin Petersonee8712c2008-05-20 21:35:26 +000046HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000047MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000048SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Victor Stinner45df8202010-04-28 22:31:17 +000050try:
51 import _thread as thread
52 import threading
53except ImportError:
54 thread = None
55 threading = None
56
Guido van Rossum24e4af82002-06-12 19:18:08 +000057class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000058
Guido van Rossum24e4af82002-06-12 19:18:08 +000059 def setUp(self):
60 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000061 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000062 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000063
Guido van Rossum24e4af82002-06-12 19:18:08 +000064 def tearDown(self):
65 self.serv.close()
66 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000067
Guido van Rossum24e4af82002-06-12 19:18:08 +000068class SocketUDPTest(unittest.TestCase):
69
70 def setUp(self):
71 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000072 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000073
74 def tearDown(self):
75 self.serv.close()
76 self.serv = None
77
78class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000079 """Threadable Test class
80
81 The ThreadableTest class makes it easy to create a threaded
82 client/server pair from an existing unit test. To create a
83 new threaded class from an existing unit test, use multiple
84 inheritance:
85
86 class NewClass (OldClass, ThreadableTest):
87 pass
88
89 This class defines two new fixture functions with obvious
90 purposes for overriding:
91
92 clientSetUp ()
93 clientTearDown ()
94
95 Any new test functions within the class must then define
96 tests in pairs, where the test name is preceeded with a
97 '_' to indicate the client portion of the test. Ex:
98
99 def testFoo(self):
100 # Server portion
101
102 def _testFoo(self):
103 # Client portion
104
105 Any exceptions raised by the clients during their tests
106 are caught and transferred to the main thread to alert
107 the testing framework.
108
109 Note, the server setup function cannot call any blocking
110 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 the blocking call (such as in setting up a client/server
113 connection and performing the accept() in setUp().
114 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def __init__(self):
117 # Swap the true setup function
118 self.__setUp = self.setUp
119 self.__tearDown = self.tearDown
120 self.setUp = self._setUp
121 self.tearDown = self._tearDown
122
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 def serverExplicitReady(self):
124 """This method allows the server to explicitly indicate that
125 it wants the client thread to proceed. This is useful if the
126 server is about to execute a blocking routine that is
127 dependent upon the client thread during its setup routine."""
128 self.server_ready.set()
129
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000131 self.server_ready = threading.Event()
132 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000134 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000137 methodname = self.id()
138 i = methodname.rfind('.')
139 methodname = methodname[i+1:]
140 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000141 self.client_thread = thread.start_new_thread(
142 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000145 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.set()
147 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148
149 def _tearDown(self):
150 self.__tearDown()
151 self.done.wait()
152
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000153 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000154 exc = self.queue.get()
155 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000158 self.server_ready.wait()
159 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000161 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000162 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000163 try:
164 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000165 except BaseException as e:
166 self.queue.put(e)
167 finally:
168 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000169
170 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000171 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172
173 def clientTearDown(self):
174 self.done.set()
175 thread.exit()
176
177class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
178
179 def __init__(self, methodName='runTest'):
180 SocketTCPTest.__init__(self, methodName=methodName)
181 ThreadableTest.__init__(self)
182
183 def clientSetUp(self):
184 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
185
186 def clientTearDown(self):
187 self.cli.close()
188 self.cli = None
189 ThreadableTest.clientTearDown(self)
190
191class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
192
193 def __init__(self, methodName='runTest'):
194 SocketUDPTest.__init__(self, methodName=methodName)
195 ThreadableTest.__init__(self)
196
197 def clientSetUp(self):
198 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
199
Brian Curtin3beb38f2010-11-04 03:41:43 +0000200 def clientTearDown(self):
201 self.cli.close()
202 self.cli = None
203 ThreadableTest.clientTearDown(self)
204
Guido van Rossum24e4af82002-06-12 19:18:08 +0000205class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000206 """Socket tests for client-server connection.
207
208 self.cli_conn is a client socket connected to the server. The
209 setUp() method guarantees that it is connected to the server.
210 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211
212 def __init__(self, methodName='runTest'):
213 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
214
215 def setUp(self):
216 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000217 # Indicate explicitly we're ready for the client thread to
218 # proceed and then perform the blocking call to accept
219 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000220 conn, addr = self.serv.accept()
221 self.cli_conn = conn
222
223 def tearDown(self):
224 self.cli_conn.close()
225 self.cli_conn = None
226 ThreadedTCPSocketTest.tearDown(self)
227
228 def clientSetUp(self):
229 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000230 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 self.serv_conn = self.cli
232
233 def clientTearDown(self):
234 self.serv_conn.close()
235 self.serv_conn = None
236 ThreadedTCPSocketTest.clientTearDown(self)
237
Dave Cole331708b2004-08-09 04:51:41 +0000238class SocketPairTest(unittest.TestCase, ThreadableTest):
239
240 def __init__(self, methodName='runTest'):
241 unittest.TestCase.__init__(self, methodName=methodName)
242 ThreadableTest.__init__(self)
243
244 def setUp(self):
245 self.serv, self.cli = socket.socketpair()
246
247 def tearDown(self):
248 self.serv.close()
249 self.serv = None
250
251 def clientSetUp(self):
252 pass
253
254 def clientTearDown(self):
255 self.cli.close()
256 self.cli = None
257 ThreadableTest.clientTearDown(self)
258
Tim Peters494aaee2004-08-09 18:54:11 +0000259
Guido van Rossum24e4af82002-06-12 19:18:08 +0000260#######################################################################
261## Begin Tests
262
263class GeneralModuleTests(unittest.TestCase):
264
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000265 def test_repr(self):
266 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000267 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000269
Raymond Hettinger027bb632004-05-31 03:09:25 +0000270 def test_weakref(self):
271 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
272 p = proxy(s)
273 self.assertEqual(p.fileno(), s.fileno())
274 s.close()
275 s = None
276 try:
277 p.fileno()
278 except ReferenceError:
279 pass
280 else:
281 self.fail('Socket proxy still exists')
282
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000284 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000285 def raise_error(*args, **kwargs):
286 raise socket.error
287 def raise_herror(*args, **kwargs):
288 raise socket.herror
289 def raise_gaierror(*args, **kwargs):
290 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000291 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000293 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000295 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296 "Error raising socket exception.")
297
Ezio Melotti63e42302011-05-07 19:47:48 +0300298 def testSendtoErrors(self):
299 # Testing that sendto doens't masks failures. See #10169.
300 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
301 self.addCleanup(s.close)
302 s.bind(('', 0))
303 sockname = s.getsockname()
304 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300305 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300306 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300307 self.assertEqual(str(cm.exception),
308 "'str' does not support the buffer interface")
309 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300310 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300311 self.assertEqual(str(cm.exception),
312 "'complex' does not support the buffer interface")
313 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300314 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300315 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300316 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300317 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300318 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300319 self.assertEqual(str(cm.exception),
320 "'str' does not support the buffer interface")
321 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300322 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300323 self.assertEqual(str(cm.exception),
324 "'complex' does not support the buffer interface")
325 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300326 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300327 self.assertIn('not NoneType', str(cm.exception))
328 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300329 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300330 self.assertIn('an integer is required', str(cm.exception))
331 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300332 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300333 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300334 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300335 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300336 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300337 self.assertIn('(1 given)', str(cm.exception))
338 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300339 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300340 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300341
Guido van Rossum24e4af82002-06-12 19:18:08 +0000342 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000343 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000344 socket.AF_INET
345 socket.SOCK_STREAM
346 socket.SOCK_DGRAM
347 socket.SOCK_RAW
348 socket.SOCK_RDM
349 socket.SOCK_SEQPACKET
350 socket.SOL_SOCKET
351 socket.SO_REUSEADDR
352
Guido van Rossum654c11e2002-06-13 20:24:17 +0000353 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000354 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000355 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000356 try:
357 ip = socket.gethostbyname(hostname)
358 except socket.error:
359 # Probably name lookup wasn't set up right; skip this test
360 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000361 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000362 try:
363 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
364 except socket.error:
365 # Probably a similar problem as above; skip this test
366 return
Brett Cannon01668a12005-03-11 00:04:17 +0000367 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000368 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000369 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000370 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000371
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000372 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000373 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000374 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375 try:
376 # On some versions, this loses a reference
377 orig = sys.getrefcount(__name__)
378 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000379 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000380 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000381 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000382
Guido van Rossum24e4af82002-06-12 19:18:08 +0000383 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000384 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000385 try:
386 # On some versions, this crashes the interpreter.
387 socket.getnameinfo(('x', 0, 0, 0), 0)
388 except socket.error:
389 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000390
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000391 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000392 # This just checks that htons etc. are their own inverse,
393 # when looking at the lower 16 or 32 bits.
394 sizes = {socket.htonl: 32, socket.ntohl: 32,
395 socket.htons: 16, socket.ntohs: 16}
396 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000397 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000398 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
399 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000400
Guido van Rossuma2627af2002-09-14 00:58:46 +0000401 swapped = func(mask)
402 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000403 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000404
Guido van Rossum018919a2007-01-15 00:07:32 +0000405 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000406 good_values = [ 1, 2, 3, 1, 2, 3 ]
407 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000408 for k in good_values:
409 socket.ntohl(k)
410 socket.ntohs(k)
411 socket.htonl(k)
412 socket.htons(k)
413 for k in bad_values:
414 self.assertRaises(OverflowError, socket.ntohl, k)
415 self.assertRaises(OverflowError, socket.ntohs, k)
416 self.assertRaises(OverflowError, socket.htonl, k)
417 self.assertRaises(OverflowError, socket.htons, k)
418
Barry Warsaw11b91a02004-06-28 00:50:43 +0000419 def testGetServBy(self):
420 eq = self.assertEqual
421 # Find one service that exists, then check all the related interfaces.
422 # I've ordered this by protocols that have both a tcp and udp
423 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000424 if (sys.platform.startswith('linux') or
425 sys.platform.startswith('freebsd') or
426 sys.platform.startswith('netbsd') or
427 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000428 # avoid the 'echo' service on this platform, as there is an
429 # assumption breaking non-standard port/protocol entry
430 services = ('daytime', 'qotd', 'domain')
431 else:
432 services = ('echo', 'daytime', 'domain')
433 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000434 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000435 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000436 break
437 except socket.error:
438 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000439 else:
440 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000441 # Try same call with optional protocol omitted
442 port2 = socket.getservbyname(service)
443 eq(port, port2)
444 # Try udp, but don't barf it it doesn't exist
445 try:
446 udpport = socket.getservbyname(service, 'udp')
447 except socket.error:
448 udpport = None
449 else:
450 eq(udpport, port)
451 # Now make sure the lookup by port returns the same service name
452 eq(socket.getservbyport(port2), service)
453 eq(socket.getservbyport(port, 'tcp'), service)
454 if udpport is not None:
455 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000456 # Make sure getservbyport does not accept out of range ports.
457 self.assertRaises(OverflowError, socket.getservbyport, -1)
458 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000459
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000460 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000461 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000462 # The default timeout should initially be None
463 self.assertEqual(socket.getdefaulttimeout(), None)
464 s = socket.socket()
465 self.assertEqual(s.gettimeout(), None)
466 s.close()
467
468 # Set the default timeout to 10, and see if it propagates
469 socket.setdefaulttimeout(10)
470 self.assertEqual(socket.getdefaulttimeout(), 10)
471 s = socket.socket()
472 self.assertEqual(s.gettimeout(), 10)
473 s.close()
474
475 # Reset the default timeout to None, and see if it propagates
476 socket.setdefaulttimeout(None)
477 self.assertEqual(socket.getdefaulttimeout(), None)
478 s = socket.socket()
479 self.assertEqual(s.gettimeout(), None)
480 s.close()
481
482 # Check that setting it to an invalid value raises ValueError
483 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
484
485 # Check that setting it to an invalid type raises TypeError
486 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
487
Benjamin Petersonf91df042009-02-13 02:50:59 +0000488 def testIPv4_inet_aton_fourbytes(self):
489 if not hasattr(socket, 'inet_aton'):
490 return # No inet_aton, nothing to check
491 # Test that issue1008086 and issue767150 are fixed.
492 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000493 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
494 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000495
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000496 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000497 if not hasattr(socket, 'inet_pton'):
498 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000499 from socket import inet_aton as f, inet_pton, AF_INET
500 g = lambda a: inet_pton(AF_INET, a)
501
Ezio Melottib3aedd42010-11-20 19:04:17 +0000502 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
503 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
504 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
505 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
506 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000507
Ezio Melottib3aedd42010-11-20 19:04:17 +0000508 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
509 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
510 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
511 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000512
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000513 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000514 if not hasattr(socket, 'inet_pton'):
515 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000516 try:
517 from socket import inet_pton, AF_INET6, has_ipv6
518 if not has_ipv6:
519 return
520 except ImportError:
521 return
522 f = lambda a: inet_pton(AF_INET6, a)
523
Ezio Melottib3aedd42010-11-20 19:04:17 +0000524 self.assertEqual(b'\x00' * 16, f('::'))
525 self.assertEqual(b'\x00' * 16, f('0::0'))
526 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
527 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000528 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000529 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
530 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000531
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000532 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000533 if not hasattr(socket, 'inet_ntop'):
534 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000535 from socket import inet_ntoa as f, inet_ntop, AF_INET
536 g = lambda a: inet_ntop(AF_INET, a)
537
Ezio Melottib3aedd42010-11-20 19:04:17 +0000538 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
539 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
540 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
541 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000542
Ezio Melottib3aedd42010-11-20 19:04:17 +0000543 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
544 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
545 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000546
547 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000548 if not hasattr(socket, 'inet_ntop'):
549 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000550 try:
551 from socket import inet_ntop, AF_INET6, has_ipv6
552 if not has_ipv6:
553 return
554 except ImportError:
555 return
556 f = lambda a: inet_ntop(AF_INET6, a)
557
Ezio Melottib3aedd42010-11-20 19:04:17 +0000558 self.assertEqual('::', f(b'\x00' * 16))
559 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
560 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000561 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000562 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000563 )
564
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000565 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000566
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000567 def _get_unused_port(self, bind_address='0.0.0.0'):
568 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000569
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000570 Args:
571 bind_address: Hostname or IP address to search for a port on.
572
573 Returns: A most likely to be unused port.
574 """
575 tempsock = socket.socket()
576 tempsock.bind((bind_address, 0))
577 host, port = tempsock.getsockname()
578 tempsock.close()
579 return port
580
581 def testSockName(self):
582 # Testing getsockname()
583 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000585 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000586 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000588 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
589 # it reasonable to get the host's addr in addition to 0.0.0.0.
590 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000591 try:
592 my_ip_addr = socket.gethostbyname(socket.gethostname())
593 except socket.error:
594 # Probably name lookup wasn't set up right; skip this test
595 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000596 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000597 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000598
599 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000600 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000601 # We know a socket should start without reuse==0
602 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000603 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000605 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000606
607 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000608 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000609 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000610 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
612 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000613 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000615 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000616 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000617 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
618 sock.settimeout(1)
619 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000620 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000621
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000622 def testNewAttributes(self):
623 # testing .family, .type and .protocol
624 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
625 self.assertEqual(sock.family, socket.AF_INET)
626 self.assertEqual(sock.type, socket.SOCK_STREAM)
627 self.assertEqual(sock.proto, 0)
628 sock.close()
629
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000630 def test_getsockaddrarg(self):
631 host = '0.0.0.0'
632 port = self._get_unused_port(bind_address=host)
633 big_port = port + 65536
634 neg_port = port - 65536
635 sock = socket.socket()
636 try:
637 self.assertRaises(OverflowError, sock.bind, (host, big_port))
638 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
639 sock.bind((host, port))
640 finally:
641 sock.close()
642
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000643 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000644 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000645 self.assertTrue(hasattr(socket.socket, 'ioctl'))
646 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
647 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
648 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000649 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
650 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000651 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000652 self.assertRaises(ValueError, s.ioctl, -1, None)
653 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000654
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000655 def testGetaddrinfo(self):
656 try:
657 socket.getaddrinfo('localhost', 80)
658 except socket.gaierror as err:
659 if err.errno == socket.EAI_SERVICE:
660 # see http://bugs.python.org/issue1282647
661 self.skipTest("buggy libc version")
662 raise
663 # len of every sequence is supposed to be == 5
664 for info in socket.getaddrinfo(HOST, None):
665 self.assertEqual(len(info), 5)
666 # host can be a domain name, a string representation of an
667 # IPv4/v6 address or None
668 socket.getaddrinfo('localhost', 80)
669 socket.getaddrinfo('127.0.0.1', 80)
670 socket.getaddrinfo(None, 80)
671 if SUPPORTS_IPV6:
672 socket.getaddrinfo('::1', 80)
673 # port can be a string service name such as "http", a numeric
674 # port number or None
675 socket.getaddrinfo(HOST, "http")
676 socket.getaddrinfo(HOST, 80)
677 socket.getaddrinfo(HOST, None)
678 # test family and socktype filters
679 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
680 for family, _, _, _, _ in infos:
681 self.assertEqual(family, socket.AF_INET)
682 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
683 for _, socktype, _, _, _ in infos:
684 self.assertEqual(socktype, socket.SOCK_STREAM)
685 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000686 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000687 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
688 # a server willing to support both IPv4 and IPv6 will
689 # usually do this
690 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
691 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000692 # test keyword arguments
693 a = socket.getaddrinfo(HOST, None)
694 b = socket.getaddrinfo(host=HOST, port=None)
695 self.assertEqual(a, b)
696 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
697 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
698 self.assertEqual(a, b)
699 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
700 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
701 self.assertEqual(a, b)
702 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
703 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
704 self.assertEqual(a, b)
705 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
706 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
707 self.assertEqual(a, b)
708 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
709 socket.AI_PASSIVE)
710 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
711 type=socket.SOCK_STREAM, proto=0,
712 flags=socket.AI_PASSIVE)
713 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000714 # Issue #6697.
715 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000716
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000717 def test_getnameinfo(self):
718 # only IP addresses are allowed
719 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
720
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000721 @unittest.skipUnless(support.is_resource_enabled('network'),
722 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000723 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000724 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000725 # these should all be successful
726 socket.gethostbyname('испытание.python.org')
727 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000728 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
729 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
730 # have a reverse entry yet
731 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000732
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000733 def check_sendall_interrupted(self, with_timeout):
734 # socketpair() is not stricly required, but it makes things easier.
735 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
736 self.skipTest("signal.alarm and socket.socketpair required for this test")
737 # Our signal handlers clobber the C errno by calling a math function
738 # with an invalid domain value.
739 def ok_handler(*args):
740 self.assertRaises(ValueError, math.acosh, 0)
741 def raising_handler(*args):
742 self.assertRaises(ValueError, math.acosh, 0)
743 1 // 0
744 c, s = socket.socketpair()
745 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
746 try:
747 if with_timeout:
748 # Just above the one second minimum for signal.alarm
749 c.settimeout(1.5)
750 with self.assertRaises(ZeroDivisionError):
751 signal.alarm(1)
752 c.sendall(b"x" * (1024**2))
753 if with_timeout:
754 signal.signal(signal.SIGALRM, ok_handler)
755 signal.alarm(1)
756 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
757 finally:
758 signal.signal(signal.SIGALRM, old_alarm)
759 c.close()
760 s.close()
761
762 def test_sendall_interrupted(self):
763 self.check_sendall_interrupted(False)
764
765 def test_sendall_interrupted_with_timeout(self):
766 self.check_sendall_interrupted(True)
767
Antoine Pitroue033e062010-10-29 10:38:18 +0000768 def test_dealloc_warn(self):
769 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
770 r = repr(sock)
771 with self.assertWarns(ResourceWarning) as cm:
772 sock = None
773 support.gc_collect()
774 self.assertIn(r, str(cm.warning.args[0]))
775 # An open socket file object gets dereferenced after the socket
776 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
777 f = sock.makefile('rb')
778 r = repr(sock)
779 sock = None
780 support.gc_collect()
781 with self.assertWarns(ResourceWarning):
782 f = None
783 support.gc_collect()
784
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000785 def test_name_closed_socketio(self):
786 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
787 fp = sock.makefile("rb")
788 fp.close()
789 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
790
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000791
Victor Stinner45df8202010-04-28 22:31:17 +0000792@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793class BasicTCPTest(SocketConnectedTest):
794
795 def __init__(self, methodName='runTest'):
796 SocketConnectedTest.__init__(self, methodName=methodName)
797
798 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000799 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000801 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802
803 def _testRecv(self):
804 self.serv_conn.send(MSG)
805
806 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000807 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000808 seg1 = self.cli_conn.recv(len(MSG) - 3)
809 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000810 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000811 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812
813 def _testOverFlowRecv(self):
814 self.serv_conn.send(MSG)
815
816 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000817 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000819 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820
821 def _testRecvFrom(self):
822 self.serv_conn.send(MSG)
823
824 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000825 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
827 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000828 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000829 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830
831 def _testOverFlowRecvFrom(self):
832 self.serv_conn.send(MSG)
833
834 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000835 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000836 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000837 while 1:
838 read = self.cli_conn.recv(1024)
839 if not read:
840 break
Guido van Rossume531e292002-08-08 20:28:34 +0000841 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000842 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000843
844 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000845 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 self.serv_conn.sendall(big_chunk)
847
848 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000849 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850 fd = self.cli_conn.fileno()
851 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000852 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000853 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000855 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856
857 def _testFromFd(self):
858 self.serv_conn.send(MSG)
859
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000860 def testDup(self):
861 # Testing dup()
862 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000863 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000864 msg = sock.recv(1024)
865 self.assertEqual(msg, MSG)
866
867 def _testDup(self):
868 self.serv_conn.send(MSG)
869
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000871 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000873 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000874 # wait for _testShutdown to finish: on OS X, when the server
875 # closes the connection the client also becomes disconnected,
876 # and the client's shutdown call will fail. (Issue #4397.)
877 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878
879 def _testShutdown(self):
880 self.serv_conn.send(MSG)
881 self.serv_conn.shutdown(2)
882
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000883 def testDetach(self):
884 # Testing detach()
885 fileno = self.cli_conn.fileno()
886 f = self.cli_conn.detach()
887 self.assertEqual(f, fileno)
888 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000889 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
890 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000891 # ...but we can create another socket using the (still open)
892 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000893 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000894 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000895 msg = sock.recv(1024)
896 self.assertEqual(msg, MSG)
897
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000898 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000899 self.serv_conn.send(MSG)
900
Victor Stinner45df8202010-04-28 22:31:17 +0000901@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000902class BasicUDPTest(ThreadedUDPSocketTest):
903
904 def __init__(self, methodName='runTest'):
905 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
906
907 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000908 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000909 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000910 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000911
912 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000913 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000914
Guido van Rossum1c938012002-06-12 21:17:20 +0000915 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000916 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000917 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000918 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919
Guido van Rossum1c938012002-06-12 21:17:20 +0000920 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000921 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922
Guido van Rossumd8faa362007-04-27 19:54:29 +0000923 def testRecvFromNegative(self):
924 # Negative lengths passed to recvfrom should give ValueError.
925 self.assertRaises(ValueError, self.serv.recvfrom, -1)
926
927 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000928 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000929
Victor Stinner45df8202010-04-28 22:31:17 +0000930@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000931class TCPCloserTest(ThreadedTCPSocketTest):
932
933 def testClose(self):
934 conn, addr = self.serv.accept()
935 conn.close()
936
937 sd = self.cli
938 read, write, err = select.select([sd], [], [], 1.0)
939 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000940 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000941
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000942 # Calling close() many times should be safe.
943 conn.close()
944 conn.close()
945
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000946 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000947 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000948 time.sleep(1.0)
949
Victor Stinner45df8202010-04-28 22:31:17 +0000950@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000951class BasicSocketPairTest(SocketPairTest):
952
953 def __init__(self, methodName='runTest'):
954 SocketPairTest.__init__(self, methodName=methodName)
955
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000956 def _check_defaults(self, sock):
957 self.assertIsInstance(sock, socket.socket)
958 if hasattr(socket, 'AF_UNIX'):
959 self.assertEqual(sock.family, socket.AF_UNIX)
960 else:
961 self.assertEqual(sock.family, socket.AF_INET)
962 self.assertEqual(sock.type, socket.SOCK_STREAM)
963 self.assertEqual(sock.proto, 0)
964
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000965 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000966 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000967
968 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000969 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000970
Dave Cole331708b2004-08-09 04:51:41 +0000971 def testRecv(self):
972 msg = self.serv.recv(1024)
973 self.assertEqual(msg, MSG)
974
975 def _testRecv(self):
976 self.cli.send(MSG)
977
978 def testSend(self):
979 self.serv.send(MSG)
980
981 def _testSend(self):
982 msg = self.cli.recv(1024)
983 self.assertEqual(msg, MSG)
984
Victor Stinner45df8202010-04-28 22:31:17 +0000985@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986class NonBlockingTCPTests(ThreadedTCPSocketTest):
987
988 def __init__(self, methodName='runTest'):
989 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
990
991 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000992 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000993 self.serv.setblocking(0)
994 start = time.time()
995 try:
996 self.serv.accept()
997 except socket.error:
998 pass
999 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001000 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001001
1002 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001003 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001004
Antoine Pitroub1c54962010-10-14 15:05:38 +00001005 if hasattr(socket, "SOCK_NONBLOCK"):
1006 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001007 v = linux_version()
1008 if v < (2, 6, 28):
1009 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1010 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001011 # reinit server socket
1012 self.serv.close()
1013 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001014 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001015 self.port = support.bind_port(self.serv)
1016 self.serv.listen(1)
1017 # actual testing
1018 start = time.time()
1019 try:
1020 self.serv.accept()
1021 except socket.error:
1022 pass
1023 end = time.time()
1024 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1025
1026 def _testInitNonBlocking(self):
1027 pass
1028
Antoine Pitrou600232b2011-01-05 21:03:42 +00001029 def testInheritFlags(self):
1030 # Issue #7995: when calling accept() on a listening socket with a
1031 # timeout, the resulting socket should not be non-blocking.
1032 self.serv.settimeout(10)
1033 try:
1034 conn, addr = self.serv.accept()
1035 message = conn.recv(len(MSG))
1036 finally:
1037 conn.close()
1038 self.serv.settimeout(None)
1039
1040 def _testInheritFlags(self):
1041 time.sleep(0.1)
1042 self.cli.connect((HOST, self.port))
1043 time.sleep(0.5)
1044 self.cli.send(MSG)
1045
Guido van Rossum24e4af82002-06-12 19:18:08 +00001046 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001047 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001048 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001049 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050 conn, addr = self.serv.accept()
1051 except socket.error:
1052 pass
1053 else:
1054 self.fail("Error trying to do non-blocking accept.")
1055 read, write, err = select.select([self.serv], [], [])
1056 if self.serv in read:
1057 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001058 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059 else:
1060 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001061
Guido van Rossum24e4af82002-06-12 19:18:08 +00001062 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001063 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001064 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001065
1066 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001067 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001068 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001069 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070
1071 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001072 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001073 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001074
1075 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001076 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001077 conn, addr = self.serv.accept()
1078 conn.setblocking(0)
1079 try:
1080 msg = conn.recv(len(MSG))
1081 except socket.error:
1082 pass
1083 else:
1084 self.fail("Error trying to do non-blocking recv.")
1085 read, write, err = select.select([conn], [], [])
1086 if conn in read:
1087 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001088 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001089 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001090 else:
1091 self.fail("Error during select call to non-blocking socket.")
1092
1093 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001094 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001095 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001096 self.cli.send(MSG)
1097
Victor Stinner45df8202010-04-28 22:31:17 +00001098@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001099class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001100 """Unit tests for the object returned by socket.makefile()
1101
Antoine Pitrou834bd812010-10-13 16:17:14 +00001102 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001103 the client connection. You can read from this file to
1104 get output from the server.
1105
Antoine Pitrou834bd812010-10-13 16:17:14 +00001106 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001107 server connection. You can write to this file to send output
1108 to the client.
1109 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001110
Guido van Rossume9f66142002-08-07 15:46:19 +00001111 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001112 encoding = 'utf8'
1113 errors = 'strict'
1114 newline = None
1115
1116 read_mode = 'rb'
1117 read_msg = MSG
1118 write_mode = 'wb'
1119 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001120
Guido van Rossum24e4af82002-06-12 19:18:08 +00001121 def __init__(self, methodName='runTest'):
1122 SocketConnectedTest.__init__(self, methodName=methodName)
1123
1124 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001125 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1126 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001127 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001128 self.read_file = self.cli_conn.makefile(
1129 self.read_mode, self.bufsize,
1130 encoding = self.encoding,
1131 errors = self.errors,
1132 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001133
1134 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001135 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001136 self.read_file.close()
1137 self.assertTrue(self.read_file.closed)
1138 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001139 SocketConnectedTest.tearDown(self)
1140
1141 def clientSetUp(self):
1142 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001143 self.write_file = self.serv_conn.makefile(
1144 self.write_mode, self.bufsize,
1145 encoding = self.encoding,
1146 errors = self.errors,
1147 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001148
1149 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001150 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001151 self.write_file.close()
1152 self.assertTrue(self.write_file.closed)
1153 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001154 SocketConnectedTest.clientTearDown(self)
1155
Antoine Pitrou5d5381e2011-02-25 23:14:08 +00001156 def testReadAfterTimeout(self):
1157 # Issue #7322: A file object must disallow further reads
1158 # after a timeout has occurred.
1159 self.cli_conn.settimeout(1)
1160 self.read_file.read(3)
1161 # First read raises a timeout
1162 self.assertRaises(socket.timeout, self.read_file.read, 1)
1163 # Second read is disallowed
1164 with self.assertRaises(IOError) as ctx:
1165 self.read_file.read(1)
1166 self.assertIn("cannot read from timed out object", str(ctx.exception))
1167
1168 def _testReadAfterTimeout(self):
1169 self.write_file.write(self.write_msg[0:3])
1170 self.write_file.flush()
1171 self.serv_finished.wait()
1172
Guido van Rossum24e4af82002-06-12 19:18:08 +00001173 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001174 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001175 first_seg = self.read_file.read(len(self.read_msg)-3)
1176 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001177 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001178 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001179
1180 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001181 self.write_file.write(self.write_msg)
1182 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001183
Guido van Rossum8c943832002-08-08 01:00:28 +00001184 def testFullRead(self):
1185 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001186 msg = self.read_file.read()
1187 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001188
1189 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001190 self.write_file.write(self.write_msg)
1191 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001192
Guido van Rossum24e4af82002-06-12 19:18:08 +00001193 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001194 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001195 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001196 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001197 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001198 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001199 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001200 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001201 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001202
1203 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001204 self.write_file.write(self.write_msg)
1205 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001206
1207 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001208 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001209 line = self.read_file.readline()
1210 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001211
1212 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001213 self.write_file.write(self.write_msg)
1214 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001215
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001216 def testCloseAfterMakefile(self):
1217 # The file returned by makefile should keep the socket open.
1218 self.cli_conn.close()
1219 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001220 msg = self.read_file.read()
1221 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001222
1223 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001224 self.write_file.write(self.write_msg)
1225 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001226
1227 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001228 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001229 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001230 if isinstance(self.read_msg, str):
1231 msg = msg.decode()
1232 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001233
1234 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001235 self.write_file.write(self.write_msg)
1236 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001237
Tim Peters116d83c2004-03-28 02:20:45 +00001238 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001239 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001240
1241 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001242 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001243
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001244 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001245 self.assertEqual(self.read_file.mode, self.read_mode)
1246 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001247
1248 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001249 self.assertEqual(self.write_file.mode, self.write_mode)
1250 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001251
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001252 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001253 self.read_file.close()
1254 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001255 self.cli_conn.close()
1256 self.assertRaises(socket.error, self.cli_conn.getsockname)
1257
1258 def _testRealClose(self):
1259 pass
1260
1261
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001262class FileObjectInterruptedTestCase(unittest.TestCase):
1263 """Test that the file object correctly handles EINTR internally."""
1264
1265 class MockSocket(object):
1266 def __init__(self, recv_funcs=()):
1267 # A generator that returns callables that we'll call for each
1268 # call to recv().
1269 self._recv_step = iter(recv_funcs)
1270
1271 def recv_into(self, buffer):
1272 data = next(self._recv_step)()
1273 assert len(buffer) >= len(data)
1274 buffer[:len(data)] = data
1275 return len(data)
1276
1277 def _decref_socketios(self):
1278 pass
1279
1280 def _textiowrap_for_test(self, buffering=-1):
1281 raw = socket.SocketIO(self, "r")
1282 if buffering < 0:
1283 buffering = io.DEFAULT_BUFFER_SIZE
1284 if buffering == 0:
1285 return raw
1286 buffer = io.BufferedReader(raw, buffering)
1287 text = io.TextIOWrapper(buffer, None, None)
1288 text.mode = "rb"
1289 return text
1290
1291 @staticmethod
1292 def _raise_eintr():
1293 raise socket.error(errno.EINTR)
1294
1295 def _textiowrap_mock_socket(self, mock, buffering=-1):
1296 raw = socket.SocketIO(mock, "r")
1297 if buffering < 0:
1298 buffering = io.DEFAULT_BUFFER_SIZE
1299 if buffering == 0:
1300 return raw
1301 buffer = io.BufferedReader(raw, buffering)
1302 text = io.TextIOWrapper(buffer, None, None)
1303 text.mode = "rb"
1304 return text
1305
1306 def _test_readline(self, size=-1, buffering=-1):
1307 mock_sock = self.MockSocket(recv_funcs=[
1308 lambda : b"This is the first line\nAnd the sec",
1309 self._raise_eintr,
1310 lambda : b"ond line is here\n",
1311 lambda : b"",
1312 lambda : b"", # XXX(gps): io library does an extra EOF read
1313 ])
1314 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001315 self.assertEqual(fo.readline(size), "This is the first line\n")
1316 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001317
1318 def _test_read(self, size=-1, buffering=-1):
1319 mock_sock = self.MockSocket(recv_funcs=[
1320 lambda : b"This is the first line\nAnd the sec",
1321 self._raise_eintr,
1322 lambda : b"ond line is here\n",
1323 lambda : b"",
1324 lambda : b"", # XXX(gps): io library does an extra EOF read
1325 ])
1326 expecting = (b"This is the first line\n"
1327 b"And the second line is here\n")
1328 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1329 if buffering == 0:
1330 data = b''
1331 else:
1332 data = ''
1333 expecting = expecting.decode('utf8')
1334 while len(data) != len(expecting):
1335 part = fo.read(size)
1336 if not part:
1337 break
1338 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001339 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001340
1341 def test_default(self):
1342 self._test_readline()
1343 self._test_readline(size=100)
1344 self._test_read()
1345 self._test_read(size=100)
1346
1347 def test_with_1k_buffer(self):
1348 self._test_readline(buffering=1024)
1349 self._test_readline(size=100, buffering=1024)
1350 self._test_read(buffering=1024)
1351 self._test_read(size=100, buffering=1024)
1352
1353 def _test_readline_no_buffer(self, size=-1):
1354 mock_sock = self.MockSocket(recv_funcs=[
1355 lambda : b"a",
1356 lambda : b"\n",
1357 lambda : b"B",
1358 self._raise_eintr,
1359 lambda : b"b",
1360 lambda : b"",
1361 ])
1362 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001363 self.assertEqual(fo.readline(size), b"a\n")
1364 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001365
1366 def test_no_buffer(self):
1367 self._test_readline_no_buffer()
1368 self._test_readline_no_buffer(size=4)
1369 self._test_read(buffering=0)
1370 self._test_read(size=100, buffering=0)
1371
1372
Guido van Rossume9f66142002-08-07 15:46:19 +00001373class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1374
1375 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001376
Guido van Rossume9f66142002-08-07 15:46:19 +00001377 In this case (and in this case only), it should be possible to
1378 create a file object, read a line from it, create another file
1379 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001380 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001381 when reading multiple requests from the same socket."""
1382
1383 bufsize = 0 # Use unbuffered mode
1384
1385 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001386 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001387 line = self.read_file.readline() # first line
1388 self.assertEqual(line, b"A. " + self.write_msg) # first line
1389 self.read_file = self.cli_conn.makefile('rb', 0)
1390 line = self.read_file.readline() # second line
1391 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001392
1393 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001394 self.write_file.write(b"A. " + self.write_msg)
1395 self.write_file.write(b"B. " + self.write_msg)
1396 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001397
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001398 def testMakefileClose(self):
1399 # The file returned by makefile should keep the socket open...
1400 self.cli_conn.close()
1401 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001402 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001403 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001404 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001405 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1406
1407 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001408 self.write_file.write(self.write_msg)
1409 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001410
1411 def testMakefileCloseSocketDestroy(self):
1412 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001413 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001414 refcount_after = sys.getrefcount(self.cli_conn)
1415 self.assertEqual(refcount_before - 1, refcount_after)
1416
1417 def _testMakefileCloseSocketDestroy(self):
1418 pass
1419
Antoine Pitrou98b46702010-09-18 22:59:00 +00001420 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001421 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001422 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1423
1424 def testSmallReadNonBlocking(self):
1425 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001426 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1427 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001428 self.evt1.set()
1429 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001430 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001431 if first_seg is None:
1432 # Data not arrived (can happen under Windows), wait a bit
1433 time.sleep(0.5)
1434 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001435 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001436 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001437 self.assertEqual(n, 3)
1438 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001439 self.assertEqual(msg, self.read_msg)
1440 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1441 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001442
1443 def _testSmallReadNonBlocking(self):
1444 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001445 self.write_file.write(self.write_msg)
1446 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001447 self.evt2.set()
1448 # Avoid cloding the socket before the server test has finished,
1449 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1450 self.serv_finished.wait(5.0)
1451
1452 def testWriteNonBlocking(self):
1453 self.cli_finished.wait(5.0)
1454 # The client thread can't skip directly - the SkipTest exception
1455 # would appear as a failure.
1456 if self.serv_skipped:
1457 self.skipTest(self.serv_skipped)
1458
1459 def _testWriteNonBlocking(self):
1460 self.serv_skipped = None
1461 self.serv_conn.setblocking(False)
1462 # Try to saturate the socket buffer pipe with repeated large writes.
1463 BIG = b"x" * (1024 ** 2)
1464 LIMIT = 10
1465 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001466 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001467 self.assertGreater(n, 0)
1468 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001469 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001470 if n is None:
1471 # Succeeded
1472 break
1473 self.assertGreater(n, 0)
1474 else:
1475 # Let us know that this test didn't manage to establish
1476 # the expected conditions. This is not a failure in itself but,
1477 # if it happens repeatedly, the test should be fixed.
1478 self.serv_skipped = "failed to saturate the socket buffer"
1479
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001480
Guido van Rossum8c943832002-08-08 01:00:28 +00001481class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1482
1483 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1484
1485
1486class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1487
1488 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001489
Thomas Woutersb2137042007-02-01 18:02:27 +00001490
Antoine Pitrou834bd812010-10-13 16:17:14 +00001491class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1492 """Tests for socket.makefile() in text mode (rather than binary)"""
1493
1494 read_mode = 'r'
1495 read_msg = MSG.decode('utf8')
1496 write_mode = 'wb'
1497 write_msg = MSG
1498 newline = ''
1499
1500
1501class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1502 """Tests for socket.makefile() in text mode (rather than binary)"""
1503
1504 read_mode = 'rb'
1505 read_msg = MSG
1506 write_mode = 'w'
1507 write_msg = MSG.decode('utf8')
1508 newline = ''
1509
1510
1511class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1512 """Tests for socket.makefile() in text mode (rather than binary)"""
1513
1514 read_mode = 'r'
1515 read_msg = MSG.decode('utf8')
1516 write_mode = 'w'
1517 write_msg = MSG.decode('utf8')
1518 newline = ''
1519
1520
Guido van Rossumd8faa362007-04-27 19:54:29 +00001521class NetworkConnectionTest(object):
1522 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001523
Guido van Rossumd8faa362007-04-27 19:54:29 +00001524 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001525 # We're inherited below by BasicTCPTest2, which also inherits
1526 # BasicTCPTest, which defines self.port referenced below.
1527 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001528 self.serv_conn = self.cli
1529
1530class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1531 """Tests that NetworkConnection does not break existing TCP functionality.
1532 """
1533
1534class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001535
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001536 class MockSocket(socket.socket):
1537 def connect(self, *args):
1538 raise socket.timeout('timed out')
1539
1540 @contextlib.contextmanager
1541 def mocked_socket_module(self):
1542 """Return a socket which times out on connect"""
1543 old_socket = socket.socket
1544 socket.socket = self.MockSocket
1545 try:
1546 yield
1547 finally:
1548 socket.socket = old_socket
1549
1550 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001551 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001552 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001553 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001554 with self.assertRaises(socket.error) as cm:
1555 cli.connect((HOST, port))
1556 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1557
1558 def test_create_connection(self):
1559 # Issue #9792: errors raised by create_connection() should have
1560 # a proper errno attribute.
1561 port = support.find_unused_port()
1562 with self.assertRaises(socket.error) as cm:
1563 socket.create_connection((HOST, port))
1564 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1565
1566 def test_create_connection_timeout(self):
1567 # Issue #9792: create_connection() should not recast timeout errors
1568 # as generic socket errors.
1569 with self.mocked_socket_module():
1570 with self.assertRaises(socket.timeout):
1571 socket.create_connection((HOST, 1234))
1572
Guido van Rossumd8faa362007-04-27 19:54:29 +00001573
Victor Stinner45df8202010-04-28 22:31:17 +00001574@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1576
1577 def __init__(self, methodName='runTest'):
1578 SocketTCPTest.__init__(self, methodName=methodName)
1579 ThreadableTest.__init__(self)
1580
1581 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001582 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001583
1584 def clientTearDown(self):
1585 self.cli.close()
1586 self.cli = None
1587 ThreadableTest.clientTearDown(self)
1588
1589 def _justAccept(self):
1590 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001591 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001592
1593 testFamily = _justAccept
1594 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001595 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001596 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001597 self.assertEqual(self.cli.family, 2)
1598
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001599 testSourceAddress = _justAccept
1600 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001601 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1602 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001603 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001604 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001605 # The port number being used is sufficient to show that the bind()
1606 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001607
Guido van Rossumd8faa362007-04-27 19:54:29 +00001608 testTimeoutDefault = _justAccept
1609 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001610 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001611 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001612 socket.setdefaulttimeout(42)
1613 try:
1614 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001615 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001616 finally:
1617 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001618 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001619
1620 testTimeoutNone = _justAccept
1621 def _testTimeoutNone(self):
1622 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001623 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001624 socket.setdefaulttimeout(30)
1625 try:
1626 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001627 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001628 finally:
1629 socket.setdefaulttimeout(None)
1630 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001631
1632 testTimeoutValueNamed = _justAccept
1633 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001634 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001635 self.assertEqual(self.cli.gettimeout(), 30)
1636
1637 testTimeoutValueNonamed = _justAccept
1638 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001639 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001640 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641 self.assertEqual(self.cli.gettimeout(), 30)
1642
Victor Stinner45df8202010-04-28 22:31:17 +00001643@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001644class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1645
1646 def __init__(self, methodName='runTest'):
1647 SocketTCPTest.__init__(self, methodName=methodName)
1648 ThreadableTest.__init__(self)
1649
1650 def clientSetUp(self):
1651 pass
1652
1653 def clientTearDown(self):
1654 self.cli.close()
1655 self.cli = None
1656 ThreadableTest.clientTearDown(self)
1657
1658 def testInsideTimeout(self):
1659 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001660 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001661 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001662 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001663 testOutsideTimeout = testInsideTimeout
1664
1665 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001666 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001667 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001668 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001669
1670 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001671 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001672 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001673
1674
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001675class TCPTimeoutTest(SocketTCPTest):
1676
1677 def testTCPTimeout(self):
1678 def raise_timeout(*args, **kwargs):
1679 self.serv.settimeout(1.0)
1680 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001681 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001682 "Error generating a timeout exception (TCP)")
1683
1684 def testTimeoutZero(self):
1685 ok = False
1686 try:
1687 self.serv.settimeout(0.0)
1688 foo = self.serv.accept()
1689 except socket.timeout:
1690 self.fail("caught timeout instead of error (TCP)")
1691 except socket.error:
1692 ok = True
1693 except:
1694 self.fail("caught unexpected exception (TCP)")
1695 if not ok:
1696 self.fail("accept() returned success when we did not expect it")
1697
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001698 def testInterruptedTimeout(self):
1699 # XXX I don't know how to do this test on MSWindows or any other
1700 # plaform that doesn't support signal.alarm() or os.kill(), though
1701 # the bug should have existed on all platforms.
1702 if not hasattr(signal, "alarm"):
1703 return # can only test on *nix
1704 self.serv.settimeout(5.0) # must be longer than alarm
1705 class Alarm(Exception):
1706 pass
1707 def alarm_handler(signal, frame):
1708 raise Alarm
1709 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1710 try:
1711 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1712 try:
1713 foo = self.serv.accept()
1714 except socket.timeout:
1715 self.fail("caught timeout instead of Alarm")
1716 except Alarm:
1717 pass
1718 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001719 self.fail("caught other exception instead of Alarm:"
1720 " %s(%s):\n%s" %
1721 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001722 else:
1723 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001724 finally:
1725 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001726 except Alarm:
1727 self.fail("got Alarm in wrong place")
1728 finally:
1729 # no alarm can be pending. Safe to restore old handler.
1730 signal.signal(signal.SIGALRM, old_alarm)
1731
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001732class UDPTimeoutTest(SocketTCPTest):
1733
1734 def testUDPTimeout(self):
1735 def raise_timeout(*args, **kwargs):
1736 self.serv.settimeout(1.0)
1737 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001738 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001739 "Error generating a timeout exception (UDP)")
1740
1741 def testTimeoutZero(self):
1742 ok = False
1743 try:
1744 self.serv.settimeout(0.0)
1745 foo = self.serv.recv(1024)
1746 except socket.timeout:
1747 self.fail("caught timeout instead of error (UDP)")
1748 except socket.error:
1749 ok = True
1750 except:
1751 self.fail("caught unexpected exception (UDP)")
1752 if not ok:
1753 self.fail("recv() returned success when we did not expect it")
1754
1755class TestExceptions(unittest.TestCase):
1756
1757 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001758 self.assertTrue(issubclass(socket.error, Exception))
1759 self.assertTrue(issubclass(socket.herror, socket.error))
1760 self.assertTrue(issubclass(socket.gaierror, socket.error))
1761 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001762
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001763class TestLinuxAbstractNamespace(unittest.TestCase):
1764
1765 UNIX_PATH_MAX = 108
1766
1767 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001768 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001769 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1770 s1.bind(address)
1771 s1.listen(1)
1772 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1773 s2.connect(s1.getsockname())
1774 with s1.accept()[0] as s3:
1775 self.assertEqual(s1.getsockname(), address)
1776 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001777
1778 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001779 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001780 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1781 s.bind(address)
1782 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001783
1784 def testNameOverflow(self):
1785 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001786 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1787 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001788
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001789
Victor Stinner45df8202010-04-28 22:31:17 +00001790@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001791class BufferIOTest(SocketConnectedTest):
1792 """
1793 Test the buffer versions of socket.recv() and socket.send().
1794 """
1795 def __init__(self, methodName='runTest'):
1796 SocketConnectedTest.__init__(self, methodName=methodName)
1797
Antoine Pitrou25480782010-03-17 22:50:28 +00001798 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001799 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001800 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001801 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001802 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001803 self.assertEqual(msg, MSG)
1804
Antoine Pitrou25480782010-03-17 22:50:28 +00001805 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001806 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001807 self.serv_conn.send(buf)
1808
Antoine Pitrou25480782010-03-17 22:50:28 +00001809 def testRecvIntoBytearray(self):
1810 buf = bytearray(1024)
1811 nbytes = self.cli_conn.recv_into(buf)
1812 self.assertEqual(nbytes, len(MSG))
1813 msg = buf[:len(MSG)]
1814 self.assertEqual(msg, MSG)
1815
1816 _testRecvIntoBytearray = _testRecvIntoArray
1817
1818 def testRecvIntoMemoryview(self):
1819 buf = bytearray(1024)
1820 nbytes = self.cli_conn.recv_into(memoryview(buf))
1821 self.assertEqual(nbytes, len(MSG))
1822 msg = buf[:len(MSG)]
1823 self.assertEqual(msg, MSG)
1824
1825 _testRecvIntoMemoryview = _testRecvIntoArray
1826
1827 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001828 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001829 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001830 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001831 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001832 self.assertEqual(msg, MSG)
1833
Antoine Pitrou25480782010-03-17 22:50:28 +00001834 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001835 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001836 self.serv_conn.send(buf)
1837
Antoine Pitrou25480782010-03-17 22:50:28 +00001838 def testRecvFromIntoBytearray(self):
1839 buf = bytearray(1024)
1840 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1841 self.assertEqual(nbytes, len(MSG))
1842 msg = buf[:len(MSG)]
1843 self.assertEqual(msg, MSG)
1844
1845 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1846
1847 def testRecvFromIntoMemoryview(self):
1848 buf = bytearray(1024)
1849 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1850 self.assertEqual(nbytes, len(MSG))
1851 msg = buf[:len(MSG)]
1852 self.assertEqual(msg, MSG)
1853
1854 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1855
Christian Heimes043d6f62008-01-07 17:19:16 +00001856
1857TIPC_STYPE = 2000
1858TIPC_LOWER = 200
1859TIPC_UPPER = 210
1860
1861def isTipcAvailable():
1862 """Check if the TIPC module is loaded
1863
1864 The TIPC module is not loaded automatically on Ubuntu and probably
1865 other Linux distros.
1866 """
1867 if not hasattr(socket, "AF_TIPC"):
1868 return False
1869 if not os.path.isfile("/proc/modules"):
1870 return False
1871 with open("/proc/modules") as f:
1872 for line in f:
1873 if line.startswith("tipc "):
1874 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001875 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001876 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1877 return False
1878
1879class TIPCTest (unittest.TestCase):
1880 def testRDM(self):
1881 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1882 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1883
1884 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1885 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1886 TIPC_LOWER, TIPC_UPPER)
1887 srv.bind(srvaddr)
1888
1889 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1890 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1891 cli.sendto(MSG, sendaddr)
1892
1893 msg, recvaddr = srv.recvfrom(1024)
1894
1895 self.assertEqual(cli.getsockname(), recvaddr)
1896 self.assertEqual(msg, MSG)
1897
1898
1899class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1900 def __init__(self, methodName = 'runTest'):
1901 unittest.TestCase.__init__(self, methodName = methodName)
1902 ThreadableTest.__init__(self)
1903
1904 def setUp(self):
1905 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1906 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1907 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1908 TIPC_LOWER, TIPC_UPPER)
1909 self.srv.bind(srvaddr)
1910 self.srv.listen(5)
1911 self.serverExplicitReady()
1912 self.conn, self.connaddr = self.srv.accept()
1913
1914 def clientSetUp(self):
1915 # The is a hittable race between serverExplicitReady() and the
1916 # accept() call; sleep a little while to avoid it, otherwise
1917 # we could get an exception
1918 time.sleep(0.1)
1919 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1920 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1921 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1922 self.cli.connect(addr)
1923 self.cliaddr = self.cli.getsockname()
1924
1925 def testStream(self):
1926 msg = self.conn.recv(1024)
1927 self.assertEqual(msg, MSG)
1928 self.assertEqual(self.cliaddr, self.connaddr)
1929
1930 def _testStream(self):
1931 self.cli.send(MSG)
1932 self.cli.close()
1933
1934
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001935@unittest.skipUnless(thread, 'Threading required for this test.')
1936class ContextManagersTest(ThreadedTCPSocketTest):
1937
1938 def _testSocketClass(self):
1939 # base test
1940 with socket.socket() as sock:
1941 self.assertFalse(sock._closed)
1942 self.assertTrue(sock._closed)
1943 # close inside with block
1944 with socket.socket() as sock:
1945 sock.close()
1946 self.assertTrue(sock._closed)
1947 # exception inside with block
1948 with socket.socket() as sock:
1949 self.assertRaises(socket.error, sock.sendall, b'foo')
1950 self.assertTrue(sock._closed)
1951
1952 def testCreateConnectionBase(self):
1953 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001954 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001955 data = conn.recv(1024)
1956 conn.sendall(data)
1957
1958 def _testCreateConnectionBase(self):
1959 address = self.serv.getsockname()
1960 with socket.create_connection(address) as sock:
1961 self.assertFalse(sock._closed)
1962 sock.sendall(b'foo')
1963 self.assertEqual(sock.recv(1024), b'foo')
1964 self.assertTrue(sock._closed)
1965
1966 def testCreateConnectionClose(self):
1967 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001968 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001969 data = conn.recv(1024)
1970 conn.sendall(data)
1971
1972 def _testCreateConnectionClose(self):
1973 address = self.serv.getsockname()
1974 with socket.create_connection(address) as sock:
1975 sock.close()
1976 self.assertTrue(sock._closed)
1977 self.assertRaises(socket.error, sock.sendall, b'foo')
1978
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001979
Antoine Pitroub1c54962010-10-14 15:05:38 +00001980@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1981 "SOCK_CLOEXEC not defined")
1982@unittest.skipUnless(fcntl, "module fcntl not available")
1983class CloexecConstantTest(unittest.TestCase):
1984 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001985 v = linux_version()
1986 if v < (2, 6, 28):
1987 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1988 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00001989 with socket.socket(socket.AF_INET,
1990 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
1991 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1992 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001993
1994
1995@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1996 "SOCK_NONBLOCK not defined")
1997class NonblockConstantTest(unittest.TestCase):
1998 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1999 if nonblock:
2000 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2001 self.assertEqual(s.gettimeout(), timeout)
2002 else:
2003 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2004 self.assertEqual(s.gettimeout(), None)
2005
2006 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002007 v = linux_version()
2008 if v < (2, 6, 28):
2009 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2010 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002011 # a lot of it seems silly and redundant, but I wanted to test that
2012 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002013 with socket.socket(socket.AF_INET,
2014 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2015 self.checkNonblock(s)
2016 s.setblocking(1)
2017 self.checkNonblock(s, False)
2018 s.setblocking(0)
2019 self.checkNonblock(s)
2020 s.settimeout(None)
2021 self.checkNonblock(s, False)
2022 s.settimeout(2.0)
2023 self.checkNonblock(s, timeout=2.0)
2024 s.setblocking(1)
2025 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002026 # defaulttimeout
2027 t = socket.getdefaulttimeout()
2028 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002029 with socket.socket() as s:
2030 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002031 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002032 with socket.socket() as s:
2033 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002034 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002035 with socket.socket() as s:
2036 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002037 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002038 with socket.socket() as s:
2039 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002040 socket.setdefaulttimeout(t)
2041
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002042
Guido van Rossumb995eb72002-07-31 16:08:40 +00002043def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002044 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002045 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002046
2047 tests.extend([
2048 NonBlockingTCPTests,
2049 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002050 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002051 UnbufferedFileObjectClassTestCase,
2052 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002053 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002054 UnicodeReadFileObjectClassTestCase,
2055 UnicodeWriteFileObjectClassTestCase,
2056 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002057 NetworkConnectionNoServer,
2058 NetworkConnectionAttributesTest,
2059 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002060 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002061 CloexecConstantTest,
2062 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002063 ])
Dave Cole331708b2004-08-09 04:51:41 +00002064 if hasattr(socket, "socketpair"):
2065 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002066 if sys.platform == 'linux2':
2067 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002068 if isTipcAvailable():
2069 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002070 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002071
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002072 thread_info = support.threading_setup()
2073 support.run_unittest(*tests)
2074 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002075
2076if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002077 test_main()