blob: 8a6a780663ff43b07234c79bd6808c55adb3213a [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 Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Antoine Pitroub1c54962010-10-14 15:05:38 +000022try:
23 import fcntl
24except ImportError:
25 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000026
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000027def linux_version():
28 try:
29 # platform.release() is something like '2.6.33.7-desktop-2mnb'
30 version_string = platform.release().split('-')[0]
31 return tuple(map(int, version_string.split('.')))
32 except ValueError:
33 return 0, 0, 0
34
Benjamin Petersonee8712c2008-05-20 21:35:26 +000035HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000036MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
Victor Stinner45df8202010-04-28 22:31:17 +000038try:
39 import _thread as thread
40 import threading
41except ImportError:
42 thread = None
43 threading = None
44
Guido van Rossum24e4af82002-06-12 19:18:08 +000045class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000046
Guido van Rossum24e4af82002-06-12 19:18:08 +000047 def setUp(self):
48 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000049 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000050 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000051
Guido van Rossum24e4af82002-06-12 19:18:08 +000052 def tearDown(self):
53 self.serv.close()
54 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000055
Guido van Rossum24e4af82002-06-12 19:18:08 +000056class SocketUDPTest(unittest.TestCase):
57
58 def setUp(self):
59 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000060 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000061
62 def tearDown(self):
63 self.serv.close()
64 self.serv = None
65
66class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000067 """Threadable Test class
68
69 The ThreadableTest class makes it easy to create a threaded
70 client/server pair from an existing unit test. To create a
71 new threaded class from an existing unit test, use multiple
72 inheritance:
73
74 class NewClass (OldClass, ThreadableTest):
75 pass
76
77 This class defines two new fixture functions with obvious
78 purposes for overriding:
79
80 clientSetUp ()
81 clientTearDown ()
82
83 Any new test functions within the class must then define
84 tests in pairs, where the test name is preceeded with a
85 '_' to indicate the client portion of the test. Ex:
86
87 def testFoo(self):
88 # Server portion
89
90 def _testFoo(self):
91 # Client portion
92
93 Any exceptions raised by the clients during their tests
94 are caught and transferred to the main thread to alert
95 the testing framework.
96
97 Note, the server setup function cannot call any blocking
98 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000099 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000100 the blocking call (such as in setting up a client/server
101 connection and performing the accept() in setUp().
102 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000103
104 def __init__(self):
105 # Swap the true setup function
106 self.__setUp = self.setUp
107 self.__tearDown = self.tearDown
108 self.setUp = self._setUp
109 self.tearDown = self._tearDown
110
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 def serverExplicitReady(self):
112 """This method allows the server to explicitly indicate that
113 it wants the client thread to proceed. This is useful if the
114 server is about to execute a blocking routine that is
115 dependent upon the client thread during its setup routine."""
116 self.server_ready.set()
117
Guido van Rossum24e4af82002-06-12 19:18:08 +0000118 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000119 self.server_ready = threading.Event()
120 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000122 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123
124 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000125 methodname = self.id()
126 i = methodname.rfind('.')
127 methodname = methodname[i+1:]
128 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000129 self.client_thread = thread.start_new_thread(
130 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000131
132 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000133 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000134 self.server_ready.set()
135 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 def _tearDown(self):
138 self.__tearDown()
139 self.done.wait()
140
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000141 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000142 exc = self.queue.get()
143 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000144
145 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.wait()
147 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000149 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000150 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000151 try:
152 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000153 except BaseException as e:
154 self.queue.put(e)
155 finally:
156 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000157
158 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000159 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160
161 def clientTearDown(self):
162 self.done.set()
163 thread.exit()
164
165class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
166
167 def __init__(self, methodName='runTest'):
168 SocketTCPTest.__init__(self, methodName=methodName)
169 ThreadableTest.__init__(self)
170
171 def clientSetUp(self):
172 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
173
174 def clientTearDown(self):
175 self.cli.close()
176 self.cli = None
177 ThreadableTest.clientTearDown(self)
178
179class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
180
181 def __init__(self, methodName='runTest'):
182 SocketUDPTest.__init__(self, methodName=methodName)
183 ThreadableTest.__init__(self)
184
185 def clientSetUp(self):
186 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
187
Brian Curtin3beb38f2010-11-04 03:41:43 +0000188 def clientTearDown(self):
189 self.cli.close()
190 self.cli = None
191 ThreadableTest.clientTearDown(self)
192
Guido van Rossum24e4af82002-06-12 19:18:08 +0000193class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000194 """Socket tests for client-server connection.
195
196 self.cli_conn is a client socket connected to the server. The
197 setUp() method guarantees that it is connected to the server.
198 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000199
200 def __init__(self, methodName='runTest'):
201 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
202
203 def setUp(self):
204 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000205 # Indicate explicitly we're ready for the client thread to
206 # proceed and then perform the blocking call to accept
207 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000208 conn, addr = self.serv.accept()
209 self.cli_conn = conn
210
211 def tearDown(self):
212 self.cli_conn.close()
213 self.cli_conn = None
214 ThreadedTCPSocketTest.tearDown(self)
215
216 def clientSetUp(self):
217 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000218 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000219 self.serv_conn = self.cli
220
221 def clientTearDown(self):
222 self.serv_conn.close()
223 self.serv_conn = None
224 ThreadedTCPSocketTest.clientTearDown(self)
225
Dave Cole331708b2004-08-09 04:51:41 +0000226class SocketPairTest(unittest.TestCase, ThreadableTest):
227
228 def __init__(self, methodName='runTest'):
229 unittest.TestCase.__init__(self, methodName=methodName)
230 ThreadableTest.__init__(self)
231
232 def setUp(self):
233 self.serv, self.cli = socket.socketpair()
234
235 def tearDown(self):
236 self.serv.close()
237 self.serv = None
238
239 def clientSetUp(self):
240 pass
241
242 def clientTearDown(self):
243 self.cli.close()
244 self.cli = None
245 ThreadableTest.clientTearDown(self)
246
Tim Peters494aaee2004-08-09 18:54:11 +0000247
Guido van Rossum24e4af82002-06-12 19:18:08 +0000248#######################################################################
249## Begin Tests
250
251class GeneralModuleTests(unittest.TestCase):
252
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000253 def test_repr(self):
254 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000255 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000256 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000257
Raymond Hettinger027bb632004-05-31 03:09:25 +0000258 def test_weakref(self):
259 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
260 p = proxy(s)
261 self.assertEqual(p.fileno(), s.fileno())
262 s.close()
263 s = None
264 try:
265 p.fileno()
266 except ReferenceError:
267 pass
268 else:
269 self.fail('Socket proxy still exists')
270
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000272 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 def raise_error(*args, **kwargs):
274 raise socket.error
275 def raise_herror(*args, **kwargs):
276 raise socket.herror
277 def raise_gaierror(*args, **kwargs):
278 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000279 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000281 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000282 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000283 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000284 "Error raising socket exception.")
285
Ezio Melotti63e42302011-05-07 19:47:48 +0300286 def testSendtoErrors(self):
287 # Testing that sendto doens't masks failures. See #10169.
288 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
289 self.addCleanup(s.close)
290 s.bind(('', 0))
291 sockname = s.getsockname()
292 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300293 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300294 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300295 self.assertEqual(str(cm.exception),
296 "'str' does not support the buffer interface")
297 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300298 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300299 self.assertEqual(str(cm.exception),
300 "'complex' does not support the buffer interface")
301 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300302 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300303 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300304 # 3 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', 0, 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, 0, 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', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300315 self.assertIn('not NoneType', str(cm.exception))
316 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300317 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300318 self.assertIn('an integer is required', str(cm.exception))
319 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300320 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300321 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300322 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300323 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300324 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300325 self.assertIn('(1 given)', str(cm.exception))
326 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300327 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300328 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300329
Guido van Rossum24e4af82002-06-12 19:18:08 +0000330 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000331 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332 socket.AF_INET
333 socket.SOCK_STREAM
334 socket.SOCK_DGRAM
335 socket.SOCK_RAW
336 socket.SOCK_RDM
337 socket.SOCK_SEQPACKET
338 socket.SOL_SOCKET
339 socket.SO_REUSEADDR
340
Guido van Rossum654c11e2002-06-13 20:24:17 +0000341 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000342 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000343 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000344 try:
345 ip = socket.gethostbyname(hostname)
346 except socket.error:
347 # Probably name lookup wasn't set up right; skip this test
348 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000349 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000350 try:
351 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
352 except socket.error:
353 # Probably a similar problem as above; skip this test
354 return
Brett Cannon01668a12005-03-11 00:04:17 +0000355 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000356 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000357 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000358 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000359
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000360 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
361 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
362 def test_sethostname(self):
363 oldhn = socket.gethostname()
364 try:
365 socket.sethostname('new')
366 except socket.error as e:
367 if e.errno == errno.EPERM:
368 self.skipTest("test should be run as root")
369 else:
370 raise
371 try:
372 # running test as root!
373 self.assertEqual(socket.gethostname(), 'new')
374 # Should work with bytes objects too
375 socket.sethostname(b'bar')
376 self.assertEqual(socket.gethostname(), 'bar')
377 finally:
378 socket.sethostname(oldhn)
379
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000380 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000381 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000382 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000383 try:
384 # On some versions, this loses a reference
385 orig = sys.getrefcount(__name__)
386 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000387 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000388 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000389 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000390
Guido van Rossum24e4af82002-06-12 19:18:08 +0000391 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000392 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000393 try:
394 # On some versions, this crashes the interpreter.
395 socket.getnameinfo(('x', 0, 0, 0), 0)
396 except socket.error:
397 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000398
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000399 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000400 # This just checks that htons etc. are their own inverse,
401 # when looking at the lower 16 or 32 bits.
402 sizes = {socket.htonl: 32, socket.ntohl: 32,
403 socket.htons: 16, socket.ntohs: 16}
404 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000405 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000406 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
407 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000408
Guido van Rossuma2627af2002-09-14 00:58:46 +0000409 swapped = func(mask)
410 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000411 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000412
Guido van Rossum018919a2007-01-15 00:07:32 +0000413 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000414 good_values = [ 1, 2, 3, 1, 2, 3 ]
415 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000416 for k in good_values:
417 socket.ntohl(k)
418 socket.ntohs(k)
419 socket.htonl(k)
420 socket.htons(k)
421 for k in bad_values:
422 self.assertRaises(OverflowError, socket.ntohl, k)
423 self.assertRaises(OverflowError, socket.ntohs, k)
424 self.assertRaises(OverflowError, socket.htonl, k)
425 self.assertRaises(OverflowError, socket.htons, k)
426
Barry Warsaw11b91a02004-06-28 00:50:43 +0000427 def testGetServBy(self):
428 eq = self.assertEqual
429 # Find one service that exists, then check all the related interfaces.
430 # I've ordered this by protocols that have both a tcp and udp
431 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000432 if (sys.platform.startswith('linux') or
433 sys.platform.startswith('freebsd') or
434 sys.platform.startswith('netbsd') or
435 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000436 # avoid the 'echo' service on this platform, as there is an
437 # assumption breaking non-standard port/protocol entry
438 services = ('daytime', 'qotd', 'domain')
439 else:
440 services = ('echo', 'daytime', 'domain')
441 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000442 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000443 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000444 break
445 except socket.error:
446 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000447 else:
448 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000449 # Try same call with optional protocol omitted
450 port2 = socket.getservbyname(service)
451 eq(port, port2)
452 # Try udp, but don't barf it it doesn't exist
453 try:
454 udpport = socket.getservbyname(service, 'udp')
455 except socket.error:
456 udpport = None
457 else:
458 eq(udpport, port)
459 # Now make sure the lookup by port returns the same service name
460 eq(socket.getservbyport(port2), service)
461 eq(socket.getservbyport(port, 'tcp'), service)
462 if udpport is not None:
463 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000464 # Make sure getservbyport does not accept out of range ports.
465 self.assertRaises(OverflowError, socket.getservbyport, -1)
466 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000467
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000468 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000469 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000470 # The default timeout should initially be None
471 self.assertEqual(socket.getdefaulttimeout(), None)
472 s = socket.socket()
473 self.assertEqual(s.gettimeout(), None)
474 s.close()
475
476 # Set the default timeout to 10, and see if it propagates
477 socket.setdefaulttimeout(10)
478 self.assertEqual(socket.getdefaulttimeout(), 10)
479 s = socket.socket()
480 self.assertEqual(s.gettimeout(), 10)
481 s.close()
482
483 # Reset the default timeout to None, and see if it propagates
484 socket.setdefaulttimeout(None)
485 self.assertEqual(socket.getdefaulttimeout(), None)
486 s = socket.socket()
487 self.assertEqual(s.gettimeout(), None)
488 s.close()
489
490 # Check that setting it to an invalid value raises ValueError
491 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
492
493 # Check that setting it to an invalid type raises TypeError
494 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
495
Benjamin Petersonf91df042009-02-13 02:50:59 +0000496 def testIPv4_inet_aton_fourbytes(self):
497 if not hasattr(socket, 'inet_aton'):
498 return # No inet_aton, nothing to check
499 # Test that issue1008086 and issue767150 are fixed.
500 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000501 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
502 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000503
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000504 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000505 if not hasattr(socket, 'inet_pton'):
506 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000507 from socket import inet_aton as f, inet_pton, AF_INET
508 g = lambda a: inet_pton(AF_INET, a)
509
Ezio Melottib3aedd42010-11-20 19:04:17 +0000510 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
511 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
512 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
513 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
514 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000515
Ezio Melottib3aedd42010-11-20 19:04:17 +0000516 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
517 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
518 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
519 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000520
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000521 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000522 if not hasattr(socket, 'inet_pton'):
523 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000524 try:
525 from socket import inet_pton, AF_INET6, has_ipv6
526 if not has_ipv6:
527 return
528 except ImportError:
529 return
530 f = lambda a: inet_pton(AF_INET6, a)
531
Ezio Melottib3aedd42010-11-20 19:04:17 +0000532 self.assertEqual(b'\x00' * 16, f('::'))
533 self.assertEqual(b'\x00' * 16, f('0::0'))
534 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
535 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000536 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 +0000537 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
538 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000539
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000540 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000541 if not hasattr(socket, 'inet_ntop'):
542 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000543 from socket import inet_ntoa as f, inet_ntop, AF_INET
544 g = lambda a: inet_ntop(AF_INET, a)
545
Ezio Melottib3aedd42010-11-20 19:04:17 +0000546 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
547 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
548 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
549 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000550
Ezio Melottib3aedd42010-11-20 19:04:17 +0000551 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
552 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
553 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000554
555 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000556 if not hasattr(socket, 'inet_ntop'):
557 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000558 try:
559 from socket import inet_ntop, AF_INET6, has_ipv6
560 if not has_ipv6:
561 return
562 except ImportError:
563 return
564 f = lambda a: inet_ntop(AF_INET6, a)
565
Ezio Melottib3aedd42010-11-20 19:04:17 +0000566 self.assertEqual('::', f(b'\x00' * 16))
567 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
568 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000569 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000570 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 +0000571 )
572
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000573 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000574
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000575 def _get_unused_port(self, bind_address='0.0.0.0'):
576 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000577
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000578 Args:
579 bind_address: Hostname or IP address to search for a port on.
580
581 Returns: A most likely to be unused port.
582 """
583 tempsock = socket.socket()
584 tempsock.bind((bind_address, 0))
585 host, port = tempsock.getsockname()
586 tempsock.close()
587 return port
588
589 def testSockName(self):
590 # Testing getsockname()
591 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000592 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000593 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000594 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000595 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000596 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
597 # it reasonable to get the host's addr in addition to 0.0.0.0.
598 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000599 try:
600 my_ip_addr = socket.gethostbyname(socket.gethostname())
601 except socket.error:
602 # Probably name lookup wasn't set up right; skip this test
603 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000604 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000605 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000606
607 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000608 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000609 # We know a socket should start without reuse==0
610 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000611 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000612 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000613 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614
615 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000616 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000618 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
620 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000621 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000623 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000624 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000625 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
626 sock.settimeout(1)
627 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000628 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000629
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000630 def testNewAttributes(self):
631 # testing .family, .type and .protocol
632 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
633 self.assertEqual(sock.family, socket.AF_INET)
634 self.assertEqual(sock.type, socket.SOCK_STREAM)
635 self.assertEqual(sock.proto, 0)
636 sock.close()
637
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000638 def test_getsockaddrarg(self):
639 host = '0.0.0.0'
640 port = self._get_unused_port(bind_address=host)
641 big_port = port + 65536
642 neg_port = port - 65536
643 sock = socket.socket()
644 try:
645 self.assertRaises(OverflowError, sock.bind, (host, big_port))
646 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
647 sock.bind((host, port))
648 finally:
649 sock.close()
650
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000651 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000652 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000653 self.assertTrue(hasattr(socket.socket, 'ioctl'))
654 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
655 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
656 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000657 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
658 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000659 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000660 self.assertRaises(ValueError, s.ioctl, -1, None)
661 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000662
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000663 def testGetaddrinfo(self):
664 try:
665 socket.getaddrinfo('localhost', 80)
666 except socket.gaierror as err:
667 if err.errno == socket.EAI_SERVICE:
668 # see http://bugs.python.org/issue1282647
669 self.skipTest("buggy libc version")
670 raise
671 # len of every sequence is supposed to be == 5
672 for info in socket.getaddrinfo(HOST, None):
673 self.assertEqual(len(info), 5)
674 # host can be a domain name, a string representation of an
675 # IPv4/v6 address or None
676 socket.getaddrinfo('localhost', 80)
677 socket.getaddrinfo('127.0.0.1', 80)
678 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200679 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000680 socket.getaddrinfo('::1', 80)
681 # port can be a string service name such as "http", a numeric
682 # port number or None
683 socket.getaddrinfo(HOST, "http")
684 socket.getaddrinfo(HOST, 80)
685 socket.getaddrinfo(HOST, None)
686 # test family and socktype filters
687 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
688 for family, _, _, _, _ in infos:
689 self.assertEqual(family, socket.AF_INET)
690 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
691 for _, socktype, _, _, _ in infos:
692 self.assertEqual(socktype, socket.SOCK_STREAM)
693 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000694 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000695 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
696 # a server willing to support both IPv4 and IPv6 will
697 # usually do this
698 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
699 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000700 # test keyword arguments
701 a = socket.getaddrinfo(HOST, None)
702 b = socket.getaddrinfo(host=HOST, port=None)
703 self.assertEqual(a, b)
704 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
705 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
706 self.assertEqual(a, b)
707 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
708 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
709 self.assertEqual(a, b)
710 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
711 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
712 self.assertEqual(a, b)
713 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
714 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
715 self.assertEqual(a, b)
716 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
717 socket.AI_PASSIVE)
718 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
719 type=socket.SOCK_STREAM, proto=0,
720 flags=socket.AI_PASSIVE)
721 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000722 # Issue #6697.
723 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000724
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000725 def test_getnameinfo(self):
726 # only IP addresses are allowed
727 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
728
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000729 @unittest.skipUnless(support.is_resource_enabled('network'),
730 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000731 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000732 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000733 # these should all be successful
734 socket.gethostbyname('испытание.python.org')
735 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000736 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
737 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
738 # have a reverse entry yet
739 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000740
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000741 def check_sendall_interrupted(self, with_timeout):
742 # socketpair() is not stricly required, but it makes things easier.
743 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
744 self.skipTest("signal.alarm and socket.socketpair required for this test")
745 # Our signal handlers clobber the C errno by calling a math function
746 # with an invalid domain value.
747 def ok_handler(*args):
748 self.assertRaises(ValueError, math.acosh, 0)
749 def raising_handler(*args):
750 self.assertRaises(ValueError, math.acosh, 0)
751 1 // 0
752 c, s = socket.socketpair()
753 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
754 try:
755 if with_timeout:
756 # Just above the one second minimum for signal.alarm
757 c.settimeout(1.5)
758 with self.assertRaises(ZeroDivisionError):
759 signal.alarm(1)
760 c.sendall(b"x" * (1024**2))
761 if with_timeout:
762 signal.signal(signal.SIGALRM, ok_handler)
763 signal.alarm(1)
764 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
765 finally:
766 signal.signal(signal.SIGALRM, old_alarm)
767 c.close()
768 s.close()
769
770 def test_sendall_interrupted(self):
771 self.check_sendall_interrupted(False)
772
773 def test_sendall_interrupted_with_timeout(self):
774 self.check_sendall_interrupted(True)
775
Antoine Pitroue033e062010-10-29 10:38:18 +0000776 def test_dealloc_warn(self):
777 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
778 r = repr(sock)
779 with self.assertWarns(ResourceWarning) as cm:
780 sock = None
781 support.gc_collect()
782 self.assertIn(r, str(cm.warning.args[0]))
783 # An open socket file object gets dereferenced after the socket
784 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
785 f = sock.makefile('rb')
786 r = repr(sock)
787 sock = None
788 support.gc_collect()
789 with self.assertWarns(ResourceWarning):
790 f = None
791 support.gc_collect()
792
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000793 def test_name_closed_socketio(self):
794 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
795 fp = sock.makefile("rb")
796 fp.close()
797 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
798
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100799 def test_pickle(self):
800 sock = socket.socket()
801 with sock:
802 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
803 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
804
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000805
Victor Stinner45df8202010-04-28 22:31:17 +0000806@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000807class BasicTCPTest(SocketConnectedTest):
808
809 def __init__(self, methodName='runTest'):
810 SocketConnectedTest.__init__(self, methodName=methodName)
811
812 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000813 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000815 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816
817 def _testRecv(self):
818 self.serv_conn.send(MSG)
819
820 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000821 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822 seg1 = self.cli_conn.recv(len(MSG) - 3)
823 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000824 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000825 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826
827 def _testOverFlowRecv(self):
828 self.serv_conn.send(MSG)
829
830 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000831 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000833 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834
835 def _testRecvFrom(self):
836 self.serv_conn.send(MSG)
837
838 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000839 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
841 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000842 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000843 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000844
845 def _testOverFlowRecvFrom(self):
846 self.serv_conn.send(MSG)
847
848 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000849 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000850 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000851 while 1:
852 read = self.cli_conn.recv(1024)
853 if not read:
854 break
Guido van Rossume531e292002-08-08 20:28:34 +0000855 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000856 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857
858 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000859 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860 self.serv_conn.sendall(big_chunk)
861
862 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000863 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000864 fd = self.cli_conn.fileno()
865 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000866 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000867 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000869 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870
871 def _testFromFd(self):
872 self.serv_conn.send(MSG)
873
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000874 def testDup(self):
875 # Testing dup()
876 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000877 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000878 msg = sock.recv(1024)
879 self.assertEqual(msg, MSG)
880
881 def _testDup(self):
882 self.serv_conn.send(MSG)
883
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000885 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000887 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000888 # wait for _testShutdown to finish: on OS X, when the server
889 # closes the connection the client also becomes disconnected,
890 # and the client's shutdown call will fail. (Issue #4397.)
891 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892
893 def _testShutdown(self):
894 self.serv_conn.send(MSG)
895 self.serv_conn.shutdown(2)
896
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000897 def testDetach(self):
898 # Testing detach()
899 fileno = self.cli_conn.fileno()
900 f = self.cli_conn.detach()
901 self.assertEqual(f, fileno)
902 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000903 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
904 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000905 # ...but we can create another socket using the (still open)
906 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000907 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000908 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000909 msg = sock.recv(1024)
910 self.assertEqual(msg, MSG)
911
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000912 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000913 self.serv_conn.send(MSG)
914
Victor Stinner45df8202010-04-28 22:31:17 +0000915@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916class BasicUDPTest(ThreadedUDPSocketTest):
917
918 def __init__(self, methodName='runTest'):
919 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
920
921 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000922 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000924 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000925
926 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000927 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000928
Guido van Rossum1c938012002-06-12 21:17:20 +0000929 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000930 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000932 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933
Guido van Rossum1c938012002-06-12 21:17:20 +0000934 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000935 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000936
Guido van Rossumd8faa362007-04-27 19:54:29 +0000937 def testRecvFromNegative(self):
938 # Negative lengths passed to recvfrom should give ValueError.
939 self.assertRaises(ValueError, self.serv.recvfrom, -1)
940
941 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000942 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000943
Victor Stinner45df8202010-04-28 22:31:17 +0000944@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000945class TCPCloserTest(ThreadedTCPSocketTest):
946
947 def testClose(self):
948 conn, addr = self.serv.accept()
949 conn.close()
950
951 sd = self.cli
952 read, write, err = select.select([sd], [], [], 1.0)
953 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000954 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000955
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000956 # Calling close() many times should be safe.
957 conn.close()
958 conn.close()
959
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000960 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000961 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000962 time.sleep(1.0)
963
Victor Stinner45df8202010-04-28 22:31:17 +0000964@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000965class BasicSocketPairTest(SocketPairTest):
966
967 def __init__(self, methodName='runTest'):
968 SocketPairTest.__init__(self, methodName=methodName)
969
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000970 def _check_defaults(self, sock):
971 self.assertIsInstance(sock, socket.socket)
972 if hasattr(socket, 'AF_UNIX'):
973 self.assertEqual(sock.family, socket.AF_UNIX)
974 else:
975 self.assertEqual(sock.family, socket.AF_INET)
976 self.assertEqual(sock.type, socket.SOCK_STREAM)
977 self.assertEqual(sock.proto, 0)
978
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000979 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000980 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000981
982 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000983 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000984
Dave Cole331708b2004-08-09 04:51:41 +0000985 def testRecv(self):
986 msg = self.serv.recv(1024)
987 self.assertEqual(msg, MSG)
988
989 def _testRecv(self):
990 self.cli.send(MSG)
991
992 def testSend(self):
993 self.serv.send(MSG)
994
995 def _testSend(self):
996 msg = self.cli.recv(1024)
997 self.assertEqual(msg, MSG)
998
Victor Stinner45df8202010-04-28 22:31:17 +0000999@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001000class NonBlockingTCPTests(ThreadedTCPSocketTest):
1001
1002 def __init__(self, methodName='runTest'):
1003 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1004
1005 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001006 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001007 self.serv.setblocking(0)
1008 start = time.time()
1009 try:
1010 self.serv.accept()
1011 except socket.error:
1012 pass
1013 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001014 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001015
1016 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001017 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001018
Antoine Pitroub1c54962010-10-14 15:05:38 +00001019 if hasattr(socket, "SOCK_NONBLOCK"):
1020 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001021 v = linux_version()
1022 if v < (2, 6, 28):
1023 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1024 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001025 # reinit server socket
1026 self.serv.close()
1027 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001028 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001029 self.port = support.bind_port(self.serv)
1030 self.serv.listen(1)
1031 # actual testing
1032 start = time.time()
1033 try:
1034 self.serv.accept()
1035 except socket.error:
1036 pass
1037 end = time.time()
1038 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1039
1040 def _testInitNonBlocking(self):
1041 pass
1042
Antoine Pitrou600232b2011-01-05 21:03:42 +00001043 def testInheritFlags(self):
1044 # Issue #7995: when calling accept() on a listening socket with a
1045 # timeout, the resulting socket should not be non-blocking.
1046 self.serv.settimeout(10)
1047 try:
1048 conn, addr = self.serv.accept()
1049 message = conn.recv(len(MSG))
1050 finally:
1051 conn.close()
1052 self.serv.settimeout(None)
1053
1054 def _testInheritFlags(self):
1055 time.sleep(0.1)
1056 self.cli.connect((HOST, self.port))
1057 time.sleep(0.5)
1058 self.cli.send(MSG)
1059
Guido van Rossum24e4af82002-06-12 19:18:08 +00001060 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001061 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001062 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001063 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001064 conn, addr = self.serv.accept()
1065 except socket.error:
1066 pass
1067 else:
1068 self.fail("Error trying to do non-blocking accept.")
1069 read, write, err = select.select([self.serv], [], [])
1070 if self.serv in read:
1071 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001072 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001073 else:
1074 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001075
Guido van Rossum24e4af82002-06-12 19:18:08 +00001076 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001077 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001078 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001079
1080 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001081 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001083 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084
1085 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001086 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001087 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001088
1089 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001090 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001091 conn, addr = self.serv.accept()
1092 conn.setblocking(0)
1093 try:
1094 msg = conn.recv(len(MSG))
1095 except socket.error:
1096 pass
1097 else:
1098 self.fail("Error trying to do non-blocking recv.")
1099 read, write, err = select.select([conn], [], [])
1100 if conn in read:
1101 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001102 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001103 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001104 else:
1105 self.fail("Error during select call to non-blocking socket.")
1106
1107 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001108 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001109 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001110 self.cli.send(MSG)
1111
Victor Stinner45df8202010-04-28 22:31:17 +00001112@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001113class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001114 """Unit tests for the object returned by socket.makefile()
1115
Antoine Pitrou834bd812010-10-13 16:17:14 +00001116 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001117 the client connection. You can read from this file to
1118 get output from the server.
1119
Antoine Pitrou834bd812010-10-13 16:17:14 +00001120 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001121 server connection. You can write to this file to send output
1122 to the client.
1123 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001124
Guido van Rossume9f66142002-08-07 15:46:19 +00001125 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001126 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001127 errors = 'strict'
1128 newline = None
1129
1130 read_mode = 'rb'
1131 read_msg = MSG
1132 write_mode = 'wb'
1133 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001134
Guido van Rossum24e4af82002-06-12 19:18:08 +00001135 def __init__(self, methodName='runTest'):
1136 SocketConnectedTest.__init__(self, methodName=methodName)
1137
1138 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001139 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1140 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001141 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001142 self.read_file = self.cli_conn.makefile(
1143 self.read_mode, self.bufsize,
1144 encoding = self.encoding,
1145 errors = self.errors,
1146 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001147
1148 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001149 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001150 self.read_file.close()
1151 self.assertTrue(self.read_file.closed)
1152 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001153 SocketConnectedTest.tearDown(self)
1154
1155 def clientSetUp(self):
1156 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001157 self.write_file = self.serv_conn.makefile(
1158 self.write_mode, self.bufsize,
1159 encoding = self.encoding,
1160 errors = self.errors,
1161 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001162
1163 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001164 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001165 self.write_file.close()
1166 self.assertTrue(self.write_file.closed)
1167 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001168 SocketConnectedTest.clientTearDown(self)
1169
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001170 def testReadAfterTimeout(self):
1171 # Issue #7322: A file object must disallow further reads
1172 # after a timeout has occurred.
1173 self.cli_conn.settimeout(1)
1174 self.read_file.read(3)
1175 # First read raises a timeout
1176 self.assertRaises(socket.timeout, self.read_file.read, 1)
1177 # Second read is disallowed
1178 with self.assertRaises(IOError) as ctx:
1179 self.read_file.read(1)
1180 self.assertIn("cannot read from timed out object", str(ctx.exception))
1181
1182 def _testReadAfterTimeout(self):
1183 self.write_file.write(self.write_msg[0:3])
1184 self.write_file.flush()
1185 self.serv_finished.wait()
1186
Guido van Rossum24e4af82002-06-12 19:18:08 +00001187 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001188 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001189 first_seg = self.read_file.read(len(self.read_msg)-3)
1190 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001191 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001192 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001193
1194 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001195 self.write_file.write(self.write_msg)
1196 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001197
Guido van Rossum8c943832002-08-08 01:00:28 +00001198 def testFullRead(self):
1199 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001200 msg = self.read_file.read()
1201 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001202
1203 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001204 self.write_file.write(self.write_msg)
1205 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001206
Guido van Rossum24e4af82002-06-12 19:18:08 +00001207 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001208 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001209 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001210 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001211 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001212 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001213 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001214 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001215 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001216
1217 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001218 self.write_file.write(self.write_msg)
1219 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001220
1221 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001222 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001223 line = self.read_file.readline()
1224 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001225
1226 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001227 self.write_file.write(self.write_msg)
1228 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001229
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001230 def testCloseAfterMakefile(self):
1231 # The file returned by makefile should keep the socket open.
1232 self.cli_conn.close()
1233 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001234 msg = self.read_file.read()
1235 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001236
1237 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001238 self.write_file.write(self.write_msg)
1239 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001240
1241 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001242 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001243 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001244 if isinstance(self.read_msg, str):
1245 msg = msg.decode()
1246 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001247
1248 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001249 self.write_file.write(self.write_msg)
1250 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001251
Tim Peters116d83c2004-03-28 02:20:45 +00001252 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001253 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001254
1255 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001256 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001257
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001258 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001259 self.assertEqual(self.read_file.mode, self.read_mode)
1260 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001261
1262 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001263 self.assertEqual(self.write_file.mode, self.write_mode)
1264 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001265
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001266 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001267 self.read_file.close()
1268 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001269 self.cli_conn.close()
1270 self.assertRaises(socket.error, self.cli_conn.getsockname)
1271
1272 def _testRealClose(self):
1273 pass
1274
1275
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001276class FileObjectInterruptedTestCase(unittest.TestCase):
1277 """Test that the file object correctly handles EINTR internally."""
1278
1279 class MockSocket(object):
1280 def __init__(self, recv_funcs=()):
1281 # A generator that returns callables that we'll call for each
1282 # call to recv().
1283 self._recv_step = iter(recv_funcs)
1284
1285 def recv_into(self, buffer):
1286 data = next(self._recv_step)()
1287 assert len(buffer) >= len(data)
1288 buffer[:len(data)] = data
1289 return len(data)
1290
1291 def _decref_socketios(self):
1292 pass
1293
1294 def _textiowrap_for_test(self, buffering=-1):
1295 raw = socket.SocketIO(self, "r")
1296 if buffering < 0:
1297 buffering = io.DEFAULT_BUFFER_SIZE
1298 if buffering == 0:
1299 return raw
1300 buffer = io.BufferedReader(raw, buffering)
1301 text = io.TextIOWrapper(buffer, None, None)
1302 text.mode = "rb"
1303 return text
1304
1305 @staticmethod
1306 def _raise_eintr():
1307 raise socket.error(errno.EINTR)
1308
1309 def _textiowrap_mock_socket(self, mock, buffering=-1):
1310 raw = socket.SocketIO(mock, "r")
1311 if buffering < 0:
1312 buffering = io.DEFAULT_BUFFER_SIZE
1313 if buffering == 0:
1314 return raw
1315 buffer = io.BufferedReader(raw, buffering)
1316 text = io.TextIOWrapper(buffer, None, None)
1317 text.mode = "rb"
1318 return text
1319
1320 def _test_readline(self, size=-1, buffering=-1):
1321 mock_sock = self.MockSocket(recv_funcs=[
1322 lambda : b"This is the first line\nAnd the sec",
1323 self._raise_eintr,
1324 lambda : b"ond line is here\n",
1325 lambda : b"",
1326 lambda : b"", # XXX(gps): io library does an extra EOF read
1327 ])
1328 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001329 self.assertEqual(fo.readline(size), "This is the first line\n")
1330 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001331
1332 def _test_read(self, size=-1, buffering=-1):
1333 mock_sock = self.MockSocket(recv_funcs=[
1334 lambda : b"This is the first line\nAnd the sec",
1335 self._raise_eintr,
1336 lambda : b"ond line is here\n",
1337 lambda : b"",
1338 lambda : b"", # XXX(gps): io library does an extra EOF read
1339 ])
1340 expecting = (b"This is the first line\n"
1341 b"And the second line is here\n")
1342 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1343 if buffering == 0:
1344 data = b''
1345 else:
1346 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001347 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001348 while len(data) != len(expecting):
1349 part = fo.read(size)
1350 if not part:
1351 break
1352 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001353 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001354
1355 def test_default(self):
1356 self._test_readline()
1357 self._test_readline(size=100)
1358 self._test_read()
1359 self._test_read(size=100)
1360
1361 def test_with_1k_buffer(self):
1362 self._test_readline(buffering=1024)
1363 self._test_readline(size=100, buffering=1024)
1364 self._test_read(buffering=1024)
1365 self._test_read(size=100, buffering=1024)
1366
1367 def _test_readline_no_buffer(self, size=-1):
1368 mock_sock = self.MockSocket(recv_funcs=[
1369 lambda : b"a",
1370 lambda : b"\n",
1371 lambda : b"B",
1372 self._raise_eintr,
1373 lambda : b"b",
1374 lambda : b"",
1375 ])
1376 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001377 self.assertEqual(fo.readline(size), b"a\n")
1378 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001379
1380 def test_no_buffer(self):
1381 self._test_readline_no_buffer()
1382 self._test_readline_no_buffer(size=4)
1383 self._test_read(buffering=0)
1384 self._test_read(size=100, buffering=0)
1385
1386
Guido van Rossume9f66142002-08-07 15:46:19 +00001387class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1388
1389 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001390
Guido van Rossume9f66142002-08-07 15:46:19 +00001391 In this case (and in this case only), it should be possible to
1392 create a file object, read a line from it, create another file
1393 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001394 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001395 when reading multiple requests from the same socket."""
1396
1397 bufsize = 0 # Use unbuffered mode
1398
1399 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001400 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001401 line = self.read_file.readline() # first line
1402 self.assertEqual(line, b"A. " + self.write_msg) # first line
1403 self.read_file = self.cli_conn.makefile('rb', 0)
1404 line = self.read_file.readline() # second line
1405 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001406
1407 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001408 self.write_file.write(b"A. " + self.write_msg)
1409 self.write_file.write(b"B. " + self.write_msg)
1410 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001411
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001412 def testMakefileClose(self):
1413 # The file returned by makefile should keep the socket open...
1414 self.cli_conn.close()
1415 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001416 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001417 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001418 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001419 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1420
1421 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001422 self.write_file.write(self.write_msg)
1423 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001424
1425 def testMakefileCloseSocketDestroy(self):
1426 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001427 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001428 refcount_after = sys.getrefcount(self.cli_conn)
1429 self.assertEqual(refcount_before - 1, refcount_after)
1430
1431 def _testMakefileCloseSocketDestroy(self):
1432 pass
1433
Antoine Pitrou98b46702010-09-18 22:59:00 +00001434 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001435 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001436 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1437
1438 def testSmallReadNonBlocking(self):
1439 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001440 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1441 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001442 self.evt1.set()
1443 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001444 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001445 if first_seg is None:
1446 # Data not arrived (can happen under Windows), wait a bit
1447 time.sleep(0.5)
1448 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001449 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001450 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001451 self.assertEqual(n, 3)
1452 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001453 self.assertEqual(msg, self.read_msg)
1454 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1455 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001456
1457 def _testSmallReadNonBlocking(self):
1458 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001459 self.write_file.write(self.write_msg)
1460 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001461 self.evt2.set()
1462 # Avoid cloding the socket before the server test has finished,
1463 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1464 self.serv_finished.wait(5.0)
1465
1466 def testWriteNonBlocking(self):
1467 self.cli_finished.wait(5.0)
1468 # The client thread can't skip directly - the SkipTest exception
1469 # would appear as a failure.
1470 if self.serv_skipped:
1471 self.skipTest(self.serv_skipped)
1472
1473 def _testWriteNonBlocking(self):
1474 self.serv_skipped = None
1475 self.serv_conn.setblocking(False)
1476 # Try to saturate the socket buffer pipe with repeated large writes.
1477 BIG = b"x" * (1024 ** 2)
1478 LIMIT = 10
1479 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001480 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001481 self.assertGreater(n, 0)
1482 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001483 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001484 if n is None:
1485 # Succeeded
1486 break
1487 self.assertGreater(n, 0)
1488 else:
1489 # Let us know that this test didn't manage to establish
1490 # the expected conditions. This is not a failure in itself but,
1491 # if it happens repeatedly, the test should be fixed.
1492 self.serv_skipped = "failed to saturate the socket buffer"
1493
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001494
Guido van Rossum8c943832002-08-08 01:00:28 +00001495class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1496
1497 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1498
1499
1500class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1501
1502 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001503
Thomas Woutersb2137042007-02-01 18:02:27 +00001504
Antoine Pitrou834bd812010-10-13 16:17:14 +00001505class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1506 """Tests for socket.makefile() in text mode (rather than binary)"""
1507
1508 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001509 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001510 write_mode = 'wb'
1511 write_msg = MSG
1512 newline = ''
1513
1514
1515class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1516 """Tests for socket.makefile() in text mode (rather than binary)"""
1517
1518 read_mode = 'rb'
1519 read_msg = MSG
1520 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001521 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001522 newline = ''
1523
1524
1525class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1526 """Tests for socket.makefile() in text mode (rather than binary)"""
1527
1528 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001529 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001530 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001531 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001532 newline = ''
1533
1534
Guido van Rossumd8faa362007-04-27 19:54:29 +00001535class NetworkConnectionTest(object):
1536 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001537
Guido van Rossumd8faa362007-04-27 19:54:29 +00001538 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001539 # We're inherited below by BasicTCPTest2, which also inherits
1540 # BasicTCPTest, which defines self.port referenced below.
1541 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001542 self.serv_conn = self.cli
1543
1544class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1545 """Tests that NetworkConnection does not break existing TCP functionality.
1546 """
1547
1548class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001549
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001550 class MockSocket(socket.socket):
1551 def connect(self, *args):
1552 raise socket.timeout('timed out')
1553
1554 @contextlib.contextmanager
1555 def mocked_socket_module(self):
1556 """Return a socket which times out on connect"""
1557 old_socket = socket.socket
1558 socket.socket = self.MockSocket
1559 try:
1560 yield
1561 finally:
1562 socket.socket = old_socket
1563
1564 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001565 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001566 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001567 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001568 with self.assertRaises(socket.error) as cm:
1569 cli.connect((HOST, port))
1570 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1571
1572 def test_create_connection(self):
1573 # Issue #9792: errors raised by create_connection() should have
1574 # a proper errno attribute.
1575 port = support.find_unused_port()
1576 with self.assertRaises(socket.error) as cm:
1577 socket.create_connection((HOST, port))
1578 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1579
1580 def test_create_connection_timeout(self):
1581 # Issue #9792: create_connection() should not recast timeout errors
1582 # as generic socket errors.
1583 with self.mocked_socket_module():
1584 with self.assertRaises(socket.timeout):
1585 socket.create_connection((HOST, 1234))
1586
Guido van Rossumd8faa362007-04-27 19:54:29 +00001587
Victor Stinner45df8202010-04-28 22:31:17 +00001588@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001589class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1590
1591 def __init__(self, methodName='runTest'):
1592 SocketTCPTest.__init__(self, methodName=methodName)
1593 ThreadableTest.__init__(self)
1594
1595 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001596 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001597
1598 def clientTearDown(self):
1599 self.cli.close()
1600 self.cli = None
1601 ThreadableTest.clientTearDown(self)
1602
1603 def _justAccept(self):
1604 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001605 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001606
1607 testFamily = _justAccept
1608 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001609 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001610 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001611 self.assertEqual(self.cli.family, 2)
1612
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001613 testSourceAddress = _justAccept
1614 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001615 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1616 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001617 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001618 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001619 # The port number being used is sufficient to show that the bind()
1620 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001621
Guido van Rossumd8faa362007-04-27 19:54:29 +00001622 testTimeoutDefault = _justAccept
1623 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001624 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001625 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001626 socket.setdefaulttimeout(42)
1627 try:
1628 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001629 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001630 finally:
1631 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001632 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001633
1634 testTimeoutNone = _justAccept
1635 def _testTimeoutNone(self):
1636 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001637 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001638 socket.setdefaulttimeout(30)
1639 try:
1640 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001641 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001642 finally:
1643 socket.setdefaulttimeout(None)
1644 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001645
1646 testTimeoutValueNamed = _justAccept
1647 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001648 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001649 self.assertEqual(self.cli.gettimeout(), 30)
1650
1651 testTimeoutValueNonamed = _justAccept
1652 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001653 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001654 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001655 self.assertEqual(self.cli.gettimeout(), 30)
1656
Victor Stinner45df8202010-04-28 22:31:17 +00001657@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001658class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1659
1660 def __init__(self, methodName='runTest'):
1661 SocketTCPTest.__init__(self, methodName=methodName)
1662 ThreadableTest.__init__(self)
1663
1664 def clientSetUp(self):
1665 pass
1666
1667 def clientTearDown(self):
1668 self.cli.close()
1669 self.cli = None
1670 ThreadableTest.clientTearDown(self)
1671
1672 def testInsideTimeout(self):
1673 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001674 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001675 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001676 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001677 testOutsideTimeout = testInsideTimeout
1678
1679 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001680 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001681 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001682 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001683
1684 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001685 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001686 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001687
1688
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001689class TCPTimeoutTest(SocketTCPTest):
1690
1691 def testTCPTimeout(self):
1692 def raise_timeout(*args, **kwargs):
1693 self.serv.settimeout(1.0)
1694 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001695 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001696 "Error generating a timeout exception (TCP)")
1697
1698 def testTimeoutZero(self):
1699 ok = False
1700 try:
1701 self.serv.settimeout(0.0)
1702 foo = self.serv.accept()
1703 except socket.timeout:
1704 self.fail("caught timeout instead of error (TCP)")
1705 except socket.error:
1706 ok = True
1707 except:
1708 self.fail("caught unexpected exception (TCP)")
1709 if not ok:
1710 self.fail("accept() returned success when we did not expect it")
1711
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001712 def testInterruptedTimeout(self):
1713 # XXX I don't know how to do this test on MSWindows or any other
1714 # plaform that doesn't support signal.alarm() or os.kill(), though
1715 # the bug should have existed on all platforms.
1716 if not hasattr(signal, "alarm"):
1717 return # can only test on *nix
1718 self.serv.settimeout(5.0) # must be longer than alarm
1719 class Alarm(Exception):
1720 pass
1721 def alarm_handler(signal, frame):
1722 raise Alarm
1723 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1724 try:
1725 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1726 try:
1727 foo = self.serv.accept()
1728 except socket.timeout:
1729 self.fail("caught timeout instead of Alarm")
1730 except Alarm:
1731 pass
1732 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001733 self.fail("caught other exception instead of Alarm:"
1734 " %s(%s):\n%s" %
1735 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001736 else:
1737 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001738 finally:
1739 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001740 except Alarm:
1741 self.fail("got Alarm in wrong place")
1742 finally:
1743 # no alarm can be pending. Safe to restore old handler.
1744 signal.signal(signal.SIGALRM, old_alarm)
1745
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001746class UDPTimeoutTest(SocketTCPTest):
1747
1748 def testUDPTimeout(self):
1749 def raise_timeout(*args, **kwargs):
1750 self.serv.settimeout(1.0)
1751 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001752 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001753 "Error generating a timeout exception (UDP)")
1754
1755 def testTimeoutZero(self):
1756 ok = False
1757 try:
1758 self.serv.settimeout(0.0)
1759 foo = self.serv.recv(1024)
1760 except socket.timeout:
1761 self.fail("caught timeout instead of error (UDP)")
1762 except socket.error:
1763 ok = True
1764 except:
1765 self.fail("caught unexpected exception (UDP)")
1766 if not ok:
1767 self.fail("recv() returned success when we did not expect it")
1768
1769class TestExceptions(unittest.TestCase):
1770
1771 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001772 self.assertTrue(issubclass(socket.error, Exception))
1773 self.assertTrue(issubclass(socket.herror, socket.error))
1774 self.assertTrue(issubclass(socket.gaierror, socket.error))
1775 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001776
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001777class TestLinuxAbstractNamespace(unittest.TestCase):
1778
1779 UNIX_PATH_MAX = 108
1780
1781 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001782 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001783 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1784 s1.bind(address)
1785 s1.listen(1)
1786 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1787 s2.connect(s1.getsockname())
1788 with s1.accept()[0] as s3:
1789 self.assertEqual(s1.getsockname(), address)
1790 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001791
1792 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001793 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001794 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1795 s.bind(address)
1796 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001797
1798 def testNameOverflow(self):
1799 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001800 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1801 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001802
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001803
Victor Stinner45df8202010-04-28 22:31:17 +00001804@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001805class BufferIOTest(SocketConnectedTest):
1806 """
1807 Test the buffer versions of socket.recv() and socket.send().
1808 """
1809 def __init__(self, methodName='runTest'):
1810 SocketConnectedTest.__init__(self, methodName=methodName)
1811
Antoine Pitrou25480782010-03-17 22:50:28 +00001812 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001813 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001814 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001815 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001816 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001817 self.assertEqual(msg, MSG)
1818
Antoine Pitrou25480782010-03-17 22:50:28 +00001819 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001820 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001821 self.serv_conn.send(buf)
1822
Antoine Pitrou25480782010-03-17 22:50:28 +00001823 def testRecvIntoBytearray(self):
1824 buf = bytearray(1024)
1825 nbytes = self.cli_conn.recv_into(buf)
1826 self.assertEqual(nbytes, len(MSG))
1827 msg = buf[:len(MSG)]
1828 self.assertEqual(msg, MSG)
1829
1830 _testRecvIntoBytearray = _testRecvIntoArray
1831
1832 def testRecvIntoMemoryview(self):
1833 buf = bytearray(1024)
1834 nbytes = self.cli_conn.recv_into(memoryview(buf))
1835 self.assertEqual(nbytes, len(MSG))
1836 msg = buf[:len(MSG)]
1837 self.assertEqual(msg, MSG)
1838
1839 _testRecvIntoMemoryview = _testRecvIntoArray
1840
1841 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001842 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001843 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001844 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001845 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001846 self.assertEqual(msg, MSG)
1847
Antoine Pitrou25480782010-03-17 22:50:28 +00001848 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001849 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001850 self.serv_conn.send(buf)
1851
Antoine Pitrou25480782010-03-17 22:50:28 +00001852 def testRecvFromIntoBytearray(self):
1853 buf = bytearray(1024)
1854 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1855 self.assertEqual(nbytes, len(MSG))
1856 msg = buf[:len(MSG)]
1857 self.assertEqual(msg, MSG)
1858
1859 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1860
1861 def testRecvFromIntoMemoryview(self):
1862 buf = bytearray(1024)
1863 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1864 self.assertEqual(nbytes, len(MSG))
1865 msg = buf[:len(MSG)]
1866 self.assertEqual(msg, MSG)
1867
1868 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1869
Christian Heimes043d6f62008-01-07 17:19:16 +00001870
1871TIPC_STYPE = 2000
1872TIPC_LOWER = 200
1873TIPC_UPPER = 210
1874
1875def isTipcAvailable():
1876 """Check if the TIPC module is loaded
1877
1878 The TIPC module is not loaded automatically on Ubuntu and probably
1879 other Linux distros.
1880 """
1881 if not hasattr(socket, "AF_TIPC"):
1882 return False
1883 if not os.path.isfile("/proc/modules"):
1884 return False
1885 with open("/proc/modules") as f:
1886 for line in f:
1887 if line.startswith("tipc "):
1888 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001889 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001890 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1891 return False
1892
1893class TIPCTest (unittest.TestCase):
1894 def testRDM(self):
1895 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1896 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1897
1898 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1899 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1900 TIPC_LOWER, TIPC_UPPER)
1901 srv.bind(srvaddr)
1902
1903 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1904 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1905 cli.sendto(MSG, sendaddr)
1906
1907 msg, recvaddr = srv.recvfrom(1024)
1908
1909 self.assertEqual(cli.getsockname(), recvaddr)
1910 self.assertEqual(msg, MSG)
1911
1912
1913class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1914 def __init__(self, methodName = 'runTest'):
1915 unittest.TestCase.__init__(self, methodName = methodName)
1916 ThreadableTest.__init__(self)
1917
1918 def setUp(self):
1919 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1920 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1921 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1922 TIPC_LOWER, TIPC_UPPER)
1923 self.srv.bind(srvaddr)
1924 self.srv.listen(5)
1925 self.serverExplicitReady()
1926 self.conn, self.connaddr = self.srv.accept()
1927
1928 def clientSetUp(self):
1929 # The is a hittable race between serverExplicitReady() and the
1930 # accept() call; sleep a little while to avoid it, otherwise
1931 # we could get an exception
1932 time.sleep(0.1)
1933 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1934 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1935 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1936 self.cli.connect(addr)
1937 self.cliaddr = self.cli.getsockname()
1938
1939 def testStream(self):
1940 msg = self.conn.recv(1024)
1941 self.assertEqual(msg, MSG)
1942 self.assertEqual(self.cliaddr, self.connaddr)
1943
1944 def _testStream(self):
1945 self.cli.send(MSG)
1946 self.cli.close()
1947
1948
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001949@unittest.skipUnless(thread, 'Threading required for this test.')
1950class ContextManagersTest(ThreadedTCPSocketTest):
1951
1952 def _testSocketClass(self):
1953 # base test
1954 with socket.socket() as sock:
1955 self.assertFalse(sock._closed)
1956 self.assertTrue(sock._closed)
1957 # close inside with block
1958 with socket.socket() as sock:
1959 sock.close()
1960 self.assertTrue(sock._closed)
1961 # exception inside with block
1962 with socket.socket() as sock:
1963 self.assertRaises(socket.error, sock.sendall, b'foo')
1964 self.assertTrue(sock._closed)
1965
1966 def testCreateConnectionBase(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 _testCreateConnectionBase(self):
1973 address = self.serv.getsockname()
1974 with socket.create_connection(address) as sock:
1975 self.assertFalse(sock._closed)
1976 sock.sendall(b'foo')
1977 self.assertEqual(sock.recv(1024), b'foo')
1978 self.assertTrue(sock._closed)
1979
1980 def testCreateConnectionClose(self):
1981 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001982 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001983 data = conn.recv(1024)
1984 conn.sendall(data)
1985
1986 def _testCreateConnectionClose(self):
1987 address = self.serv.getsockname()
1988 with socket.create_connection(address) as sock:
1989 sock.close()
1990 self.assertTrue(sock._closed)
1991 self.assertRaises(socket.error, sock.sendall, b'foo')
1992
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001993
Antoine Pitroub1c54962010-10-14 15:05:38 +00001994@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1995 "SOCK_CLOEXEC not defined")
1996@unittest.skipUnless(fcntl, "module fcntl not available")
1997class CloexecConstantTest(unittest.TestCase):
1998 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001999 v = linux_version()
2000 if v < (2, 6, 28):
2001 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2002 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002003 with socket.socket(socket.AF_INET,
2004 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2005 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2006 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002007
2008
2009@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2010 "SOCK_NONBLOCK not defined")
2011class NonblockConstantTest(unittest.TestCase):
2012 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2013 if nonblock:
2014 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2015 self.assertEqual(s.gettimeout(), timeout)
2016 else:
2017 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2018 self.assertEqual(s.gettimeout(), None)
2019
2020 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002021 v = linux_version()
2022 if v < (2, 6, 28):
2023 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2024 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002025 # a lot of it seems silly and redundant, but I wanted to test that
2026 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002027 with socket.socket(socket.AF_INET,
2028 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2029 self.checkNonblock(s)
2030 s.setblocking(1)
2031 self.checkNonblock(s, False)
2032 s.setblocking(0)
2033 self.checkNonblock(s)
2034 s.settimeout(None)
2035 self.checkNonblock(s, False)
2036 s.settimeout(2.0)
2037 self.checkNonblock(s, timeout=2.0)
2038 s.setblocking(1)
2039 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002040 # defaulttimeout
2041 t = socket.getdefaulttimeout()
2042 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002043 with socket.socket() as s:
2044 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002045 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002046 with socket.socket() as s:
2047 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002048 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002049 with socket.socket() as s:
2050 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002051 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002052 with socket.socket() as s:
2053 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002054 socket.setdefaulttimeout(t)
2055
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002056
Guido van Rossumb995eb72002-07-31 16:08:40 +00002057def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002058 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002059 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002060
2061 tests.extend([
2062 NonBlockingTCPTests,
2063 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002064 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002065 UnbufferedFileObjectClassTestCase,
2066 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002067 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002068 UnicodeReadFileObjectClassTestCase,
2069 UnicodeWriteFileObjectClassTestCase,
2070 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002071 NetworkConnectionNoServer,
2072 NetworkConnectionAttributesTest,
2073 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002074 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002075 CloexecConstantTest,
2076 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002077 ])
Dave Cole331708b2004-08-09 04:51:41 +00002078 if hasattr(socket, "socketpair"):
2079 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002080 if sys.platform == 'linux2':
2081 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002082 if isTipcAvailable():
2083 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002084 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002085
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002086 thread_info = support.threading_setup()
2087 support.run_unittest(*tests)
2088 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002089
2090if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002091 test_main()