blob: 3efe1bbc0ca6657bedb28e28bb4e8fbfb853a8ef [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
Ezio Melotti845f1522011-05-08 20:23:57 +0300273 msg = "Error raising socket exception (%s)."
274 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300276 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300278 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280
Ezio Melotti63e42302011-05-07 19:47:48 +0300281 def testSendtoErrors(self):
282 # Testing that sendto doens't masks failures. See #10169.
283 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
284 self.addCleanup(s.close)
285 s.bind(('', 0))
286 sockname = s.getsockname()
287 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300288 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300289 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300290 self.assertEqual(str(cm.exception),
291 "'str' does not support the buffer interface")
292 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300293 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300294 self.assertEqual(str(cm.exception),
295 "'complex' does not support the buffer interface")
296 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300297 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300298 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300299 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300300 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300301 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300302 self.assertEqual(str(cm.exception),
303 "'str' does not support the buffer interface")
304 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300305 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300306 self.assertEqual(str(cm.exception),
307 "'complex' does not support the buffer interface")
308 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300309 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300310 self.assertIn('not NoneType', str(cm.exception))
311 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300312 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300313 self.assertIn('an integer is required', str(cm.exception))
314 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300315 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300316 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300317 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300318 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300319 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300320 self.assertIn('(1 given)', str(cm.exception))
321 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300322 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300323 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300324
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000326 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000327 socket.AF_INET
328 socket.SOCK_STREAM
329 socket.SOCK_DGRAM
330 socket.SOCK_RAW
331 socket.SOCK_RDM
332 socket.SOCK_SEQPACKET
333 socket.SOL_SOCKET
334 socket.SO_REUSEADDR
335
Guido van Rossum654c11e2002-06-13 20:24:17 +0000336 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000337 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000338 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000339 try:
340 ip = socket.gethostbyname(hostname)
341 except socket.error:
342 # Probably name lookup wasn't set up right; skip this test
343 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000344 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000345 try:
346 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
347 except socket.error:
348 # Probably a similar problem as above; skip this test
349 return
Brett Cannon01668a12005-03-11 00:04:17 +0000350 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000351 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000352 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000353 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000354
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000355 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
356 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
357 def test_sethostname(self):
358 oldhn = socket.gethostname()
359 try:
360 socket.sethostname('new')
361 except socket.error as e:
362 if e.errno == errno.EPERM:
363 self.skipTest("test should be run as root")
364 else:
365 raise
366 try:
367 # running test as root!
368 self.assertEqual(socket.gethostname(), 'new')
369 # Should work with bytes objects too
370 socket.sethostname(b'bar')
371 self.assertEqual(socket.gethostname(), 'bar')
372 finally:
373 socket.sethostname(oldhn)
374
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000375 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000376 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000377 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378 try:
379 # On some versions, this loses a reference
380 orig = sys.getrefcount(__name__)
381 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000382 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000383 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000385
Guido van Rossum24e4af82002-06-12 19:18:08 +0000386 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000387 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000388 try:
389 # On some versions, this crashes the interpreter.
390 socket.getnameinfo(('x', 0, 0, 0), 0)
391 except socket.error:
392 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000393
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000394 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000395 # This just checks that htons etc. are their own inverse,
396 # when looking at the lower 16 or 32 bits.
397 sizes = {socket.htonl: 32, socket.ntohl: 32,
398 socket.htons: 16, socket.ntohs: 16}
399 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000400 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000401 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
402 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000403
Guido van Rossuma2627af2002-09-14 00:58:46 +0000404 swapped = func(mask)
405 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000406 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000407
Guido van Rossum018919a2007-01-15 00:07:32 +0000408 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000409 good_values = [ 1, 2, 3, 1, 2, 3 ]
410 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000411 for k in good_values:
412 socket.ntohl(k)
413 socket.ntohs(k)
414 socket.htonl(k)
415 socket.htons(k)
416 for k in bad_values:
417 self.assertRaises(OverflowError, socket.ntohl, k)
418 self.assertRaises(OverflowError, socket.ntohs, k)
419 self.assertRaises(OverflowError, socket.htonl, k)
420 self.assertRaises(OverflowError, socket.htons, k)
421
Barry Warsaw11b91a02004-06-28 00:50:43 +0000422 def testGetServBy(self):
423 eq = self.assertEqual
424 # Find one service that exists, then check all the related interfaces.
425 # I've ordered this by protocols that have both a tcp and udp
426 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000427 if (sys.platform.startswith('linux') or
428 sys.platform.startswith('freebsd') or
429 sys.platform.startswith('netbsd') or
430 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000431 # avoid the 'echo' service on this platform, as there is an
432 # assumption breaking non-standard port/protocol entry
433 services = ('daytime', 'qotd', 'domain')
434 else:
435 services = ('echo', 'daytime', 'domain')
436 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000437 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000438 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000439 break
440 except socket.error:
441 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000442 else:
443 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000444 # Try same call with optional protocol omitted
445 port2 = socket.getservbyname(service)
446 eq(port, port2)
447 # Try udp, but don't barf it it doesn't exist
448 try:
449 udpport = socket.getservbyname(service, 'udp')
450 except socket.error:
451 udpport = None
452 else:
453 eq(udpport, port)
454 # Now make sure the lookup by port returns the same service name
455 eq(socket.getservbyport(port2), service)
456 eq(socket.getservbyport(port, 'tcp'), service)
457 if udpport is not None:
458 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000459 # Make sure getservbyport does not accept out of range ports.
460 self.assertRaises(OverflowError, socket.getservbyport, -1)
461 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000462
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000463 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000464 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000465 # The default timeout should initially be None
466 self.assertEqual(socket.getdefaulttimeout(), None)
467 s = socket.socket()
468 self.assertEqual(s.gettimeout(), None)
469 s.close()
470
471 # Set the default timeout to 10, and see if it propagates
472 socket.setdefaulttimeout(10)
473 self.assertEqual(socket.getdefaulttimeout(), 10)
474 s = socket.socket()
475 self.assertEqual(s.gettimeout(), 10)
476 s.close()
477
478 # Reset the default timeout to None, and see if it propagates
479 socket.setdefaulttimeout(None)
480 self.assertEqual(socket.getdefaulttimeout(), None)
481 s = socket.socket()
482 self.assertEqual(s.gettimeout(), None)
483 s.close()
484
485 # Check that setting it to an invalid value raises ValueError
486 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
487
488 # Check that setting it to an invalid type raises TypeError
489 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
490
Benjamin Petersonf91df042009-02-13 02:50:59 +0000491 def testIPv4_inet_aton_fourbytes(self):
492 if not hasattr(socket, 'inet_aton'):
493 return # No inet_aton, nothing to check
494 # Test that issue1008086 and issue767150 are fixed.
495 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000496 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
497 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000498
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000499 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000500 if not hasattr(socket, 'inet_pton'):
501 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000502 from socket import inet_aton as f, inet_pton, AF_INET
503 g = lambda a: inet_pton(AF_INET, a)
504
Ezio Melottib3aedd42010-11-20 19:04:17 +0000505 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
506 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
507 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
508 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
509 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000510
Ezio Melottib3aedd42010-11-20 19:04:17 +0000511 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
512 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
513 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
514 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000515
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000516 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000517 if not hasattr(socket, 'inet_pton'):
518 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000519 try:
520 from socket import inet_pton, AF_INET6, has_ipv6
521 if not has_ipv6:
522 return
523 except ImportError:
524 return
525 f = lambda a: inet_pton(AF_INET6, a)
526
Ezio Melottib3aedd42010-11-20 19:04:17 +0000527 self.assertEqual(b'\x00' * 16, f('::'))
528 self.assertEqual(b'\x00' * 16, f('0::0'))
529 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
530 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000531 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 +0000532 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
533 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000534
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000535 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000536 if not hasattr(socket, 'inet_ntop'):
537 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000538 from socket import inet_ntoa as f, inet_ntop, AF_INET
539 g = lambda a: inet_ntop(AF_INET, a)
540
Ezio Melottib3aedd42010-11-20 19:04:17 +0000541 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
542 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
543 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
544 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000545
Ezio Melottib3aedd42010-11-20 19:04:17 +0000546 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
547 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
548 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000549
550 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000551 if not hasattr(socket, 'inet_ntop'):
552 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000553 try:
554 from socket import inet_ntop, AF_INET6, has_ipv6
555 if not has_ipv6:
556 return
557 except ImportError:
558 return
559 f = lambda a: inet_ntop(AF_INET6, a)
560
Ezio Melottib3aedd42010-11-20 19:04:17 +0000561 self.assertEqual('::', f(b'\x00' * 16))
562 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
563 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000564 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000565 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 +0000566 )
567
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000568 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000569
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000570 def _get_unused_port(self, bind_address='0.0.0.0'):
571 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000572
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000573 Args:
574 bind_address: Hostname or IP address to search for a port on.
575
576 Returns: A most likely to be unused port.
577 """
578 tempsock = socket.socket()
579 tempsock.bind((bind_address, 0))
580 host, port = tempsock.getsockname()
581 tempsock.close()
582 return port
583
584 def testSockName(self):
585 # Testing getsockname()
586 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000588 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000589 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000591 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
592 # it reasonable to get the host's addr in addition to 0.0.0.0.
593 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000594 try:
595 my_ip_addr = socket.gethostbyname(socket.gethostname())
596 except socket.error:
597 # Probably name lookup wasn't set up right; skip this test
598 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000599 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000600 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000601
602 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000603 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 # We know a socket should start without reuse==0
605 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000606 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000607 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000608 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000609
610 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000611 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000612 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000613 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
615 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000616 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000618 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000619 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000620 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
621 sock.settimeout(1)
622 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000623 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000624
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000625 def testNewAttributes(self):
626 # testing .family, .type and .protocol
627 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
628 self.assertEqual(sock.family, socket.AF_INET)
629 self.assertEqual(sock.type, socket.SOCK_STREAM)
630 self.assertEqual(sock.proto, 0)
631 sock.close()
632
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000633 def test_getsockaddrarg(self):
634 host = '0.0.0.0'
635 port = self._get_unused_port(bind_address=host)
636 big_port = port + 65536
637 neg_port = port - 65536
638 sock = socket.socket()
639 try:
640 self.assertRaises(OverflowError, sock.bind, (host, big_port))
641 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
642 sock.bind((host, port))
643 finally:
644 sock.close()
645
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000646 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000647 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000648 self.assertTrue(hasattr(socket.socket, 'ioctl'))
649 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
650 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
651 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000652 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
653 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000654 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000655 self.assertRaises(ValueError, s.ioctl, -1, None)
656 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000657
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000658 def testGetaddrinfo(self):
659 try:
660 socket.getaddrinfo('localhost', 80)
661 except socket.gaierror as err:
662 if err.errno == socket.EAI_SERVICE:
663 # see http://bugs.python.org/issue1282647
664 self.skipTest("buggy libc version")
665 raise
666 # len of every sequence is supposed to be == 5
667 for info in socket.getaddrinfo(HOST, None):
668 self.assertEqual(len(info), 5)
669 # host can be a domain name, a string representation of an
670 # IPv4/v6 address or None
671 socket.getaddrinfo('localhost', 80)
672 socket.getaddrinfo('127.0.0.1', 80)
673 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200674 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000675 socket.getaddrinfo('::1', 80)
676 # port can be a string service name such as "http", a numeric
677 # port number or None
678 socket.getaddrinfo(HOST, "http")
679 socket.getaddrinfo(HOST, 80)
680 socket.getaddrinfo(HOST, None)
681 # test family and socktype filters
682 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
683 for family, _, _, _, _ in infos:
684 self.assertEqual(family, socket.AF_INET)
685 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
686 for _, socktype, _, _, _ in infos:
687 self.assertEqual(socktype, socket.SOCK_STREAM)
688 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000689 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000690 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
691 # a server willing to support both IPv4 and IPv6 will
692 # usually do this
693 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
694 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000695 # test keyword arguments
696 a = socket.getaddrinfo(HOST, None)
697 b = socket.getaddrinfo(host=HOST, port=None)
698 self.assertEqual(a, b)
699 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
700 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
701 self.assertEqual(a, b)
702 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
703 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
704 self.assertEqual(a, b)
705 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
706 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
707 self.assertEqual(a, b)
708 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
709 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
710 self.assertEqual(a, b)
711 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
712 socket.AI_PASSIVE)
713 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
714 type=socket.SOCK_STREAM, proto=0,
715 flags=socket.AI_PASSIVE)
716 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000717 # Issue #6697.
718 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000719
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000720 def test_getnameinfo(self):
721 # only IP addresses are allowed
722 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
723
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000724 @unittest.skipUnless(support.is_resource_enabled('network'),
725 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000726 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000727 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000728 # these should all be successful
729 socket.gethostbyname('испытание.python.org')
730 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000731 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
732 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
733 # have a reverse entry yet
734 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000735
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000736 def check_sendall_interrupted(self, with_timeout):
737 # socketpair() is not stricly required, but it makes things easier.
738 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
739 self.skipTest("signal.alarm and socket.socketpair required for this test")
740 # Our signal handlers clobber the C errno by calling a math function
741 # with an invalid domain value.
742 def ok_handler(*args):
743 self.assertRaises(ValueError, math.acosh, 0)
744 def raising_handler(*args):
745 self.assertRaises(ValueError, math.acosh, 0)
746 1 // 0
747 c, s = socket.socketpair()
748 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
749 try:
750 if with_timeout:
751 # Just above the one second minimum for signal.alarm
752 c.settimeout(1.5)
753 with self.assertRaises(ZeroDivisionError):
754 signal.alarm(1)
755 c.sendall(b"x" * (1024**2))
756 if with_timeout:
757 signal.signal(signal.SIGALRM, ok_handler)
758 signal.alarm(1)
759 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
760 finally:
761 signal.signal(signal.SIGALRM, old_alarm)
762 c.close()
763 s.close()
764
765 def test_sendall_interrupted(self):
766 self.check_sendall_interrupted(False)
767
768 def test_sendall_interrupted_with_timeout(self):
769 self.check_sendall_interrupted(True)
770
Antoine Pitroue033e062010-10-29 10:38:18 +0000771 def test_dealloc_warn(self):
772 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
773 r = repr(sock)
774 with self.assertWarns(ResourceWarning) as cm:
775 sock = None
776 support.gc_collect()
777 self.assertIn(r, str(cm.warning.args[0]))
778 # An open socket file object gets dereferenced after the socket
779 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
780 f = sock.makefile('rb')
781 r = repr(sock)
782 sock = None
783 support.gc_collect()
784 with self.assertWarns(ResourceWarning):
785 f = None
786 support.gc_collect()
787
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000788 def test_name_closed_socketio(self):
789 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
790 fp = sock.makefile("rb")
791 fp.close()
792 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
793
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100794 def test_pickle(self):
795 sock = socket.socket()
796 with sock:
797 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
798 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
799
Antoine Pitrou3cade992011-05-10 19:19:13 +0200800 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200801 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
802 srv.bind((HOST, 0))
803 # backlog = 0
804 srv.listen(0)
805 srv.close()
806
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000807
Victor Stinner45df8202010-04-28 22:31:17 +0000808@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809class BasicTCPTest(SocketConnectedTest):
810
811 def __init__(self, methodName='runTest'):
812 SocketConnectedTest.__init__(self, methodName=methodName)
813
814 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000815 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000817 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818
819 def _testRecv(self):
820 self.serv_conn.send(MSG)
821
822 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000823 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824 seg1 = self.cli_conn.recv(len(MSG) - 3)
825 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000826 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000827 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828
829 def _testOverFlowRecv(self):
830 self.serv_conn.send(MSG)
831
832 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000833 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000835 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836
837 def _testRecvFrom(self):
838 self.serv_conn.send(MSG)
839
840 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000841 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000842 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
843 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000844 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000845 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846
847 def _testOverFlowRecvFrom(self):
848 self.serv_conn.send(MSG)
849
850 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000851 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000852 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853 while 1:
854 read = self.cli_conn.recv(1024)
855 if not read:
856 break
Guido van Rossume531e292002-08-08 20:28:34 +0000857 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000858 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859
860 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000861 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862 self.serv_conn.sendall(big_chunk)
863
864 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000865 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 fd = self.cli_conn.fileno()
867 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000868 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000869 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000871 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872
873 def _testFromFd(self):
874 self.serv_conn.send(MSG)
875
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000876 def testDup(self):
877 # Testing dup()
878 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000879 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000880 msg = sock.recv(1024)
881 self.assertEqual(msg, MSG)
882
883 def _testDup(self):
884 self.serv_conn.send(MSG)
885
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000887 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000889 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000890 # wait for _testShutdown to finish: on OS X, when the server
891 # closes the connection the client also becomes disconnected,
892 # and the client's shutdown call will fail. (Issue #4397.)
893 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000894
895 def _testShutdown(self):
896 self.serv_conn.send(MSG)
897 self.serv_conn.shutdown(2)
898
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000899 def testDetach(self):
900 # Testing detach()
901 fileno = self.cli_conn.fileno()
902 f = self.cli_conn.detach()
903 self.assertEqual(f, fileno)
904 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000905 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
906 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000907 # ...but we can create another socket using the (still open)
908 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000909 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000910 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000911 msg = sock.recv(1024)
912 self.assertEqual(msg, MSG)
913
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000914 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000915 self.serv_conn.send(MSG)
916
Victor Stinner45df8202010-04-28 22:31:17 +0000917@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000918class BasicUDPTest(ThreadedUDPSocketTest):
919
920 def __init__(self, methodName='runTest'):
921 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
922
923 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000924 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000925 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000926 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000927
928 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000929 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930
Guido van Rossum1c938012002-06-12 21:17:20 +0000931 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000932 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000934 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000935
Guido van Rossum1c938012002-06-12 21:17:20 +0000936 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000937 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000938
Guido van Rossumd8faa362007-04-27 19:54:29 +0000939 def testRecvFromNegative(self):
940 # Negative lengths passed to recvfrom should give ValueError.
941 self.assertRaises(ValueError, self.serv.recvfrom, -1)
942
943 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000944 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000945
Victor Stinner45df8202010-04-28 22:31:17 +0000946@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000947class TCPCloserTest(ThreadedTCPSocketTest):
948
949 def testClose(self):
950 conn, addr = self.serv.accept()
951 conn.close()
952
953 sd = self.cli
954 read, write, err = select.select([sd], [], [], 1.0)
955 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000956 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000957
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000958 # Calling close() many times should be safe.
959 conn.close()
960 conn.close()
961
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000962 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000963 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000964 time.sleep(1.0)
965
Victor Stinner45df8202010-04-28 22:31:17 +0000966@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000967class BasicSocketPairTest(SocketPairTest):
968
969 def __init__(self, methodName='runTest'):
970 SocketPairTest.__init__(self, methodName=methodName)
971
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000972 def _check_defaults(self, sock):
973 self.assertIsInstance(sock, socket.socket)
974 if hasattr(socket, 'AF_UNIX'):
975 self.assertEqual(sock.family, socket.AF_UNIX)
976 else:
977 self.assertEqual(sock.family, socket.AF_INET)
978 self.assertEqual(sock.type, socket.SOCK_STREAM)
979 self.assertEqual(sock.proto, 0)
980
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000981 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000982 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000983
984 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000985 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000986
Dave Cole331708b2004-08-09 04:51:41 +0000987 def testRecv(self):
988 msg = self.serv.recv(1024)
989 self.assertEqual(msg, MSG)
990
991 def _testRecv(self):
992 self.cli.send(MSG)
993
994 def testSend(self):
995 self.serv.send(MSG)
996
997 def _testSend(self):
998 msg = self.cli.recv(1024)
999 self.assertEqual(msg, MSG)
1000
Victor Stinner45df8202010-04-28 22:31:17 +00001001@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001002class NonBlockingTCPTests(ThreadedTCPSocketTest):
1003
1004 def __init__(self, methodName='runTest'):
1005 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1006
1007 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001008 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001009 self.serv.setblocking(0)
1010 start = time.time()
1011 try:
1012 self.serv.accept()
1013 except socket.error:
1014 pass
1015 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001016 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001017
1018 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001019 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001020
Antoine Pitroub1c54962010-10-14 15:05:38 +00001021 if hasattr(socket, "SOCK_NONBLOCK"):
1022 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001023 v = linux_version()
1024 if v < (2, 6, 28):
1025 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1026 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001027 # reinit server socket
1028 self.serv.close()
1029 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001030 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001031 self.port = support.bind_port(self.serv)
1032 self.serv.listen(1)
1033 # actual testing
1034 start = time.time()
1035 try:
1036 self.serv.accept()
1037 except socket.error:
1038 pass
1039 end = time.time()
1040 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1041
1042 def _testInitNonBlocking(self):
1043 pass
1044
Antoine Pitrou600232b2011-01-05 21:03:42 +00001045 def testInheritFlags(self):
1046 # Issue #7995: when calling accept() on a listening socket with a
1047 # timeout, the resulting socket should not be non-blocking.
1048 self.serv.settimeout(10)
1049 try:
1050 conn, addr = self.serv.accept()
1051 message = conn.recv(len(MSG))
1052 finally:
1053 conn.close()
1054 self.serv.settimeout(None)
1055
1056 def _testInheritFlags(self):
1057 time.sleep(0.1)
1058 self.cli.connect((HOST, self.port))
1059 time.sleep(0.5)
1060 self.cli.send(MSG)
1061
Guido van Rossum24e4af82002-06-12 19:18:08 +00001062 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001063 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001064 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001065 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066 conn, addr = self.serv.accept()
1067 except socket.error:
1068 pass
1069 else:
1070 self.fail("Error trying to do non-blocking accept.")
1071 read, write, err = select.select([self.serv], [], [])
1072 if self.serv in read:
1073 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001074 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001075 else:
1076 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001077
Guido van Rossum24e4af82002-06-12 19:18:08 +00001078 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001079 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001080 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001081
1082 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001083 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001085 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001086
1087 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001088 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001089 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001090
1091 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001092 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001093 conn, addr = self.serv.accept()
1094 conn.setblocking(0)
1095 try:
1096 msg = conn.recv(len(MSG))
1097 except socket.error:
1098 pass
1099 else:
1100 self.fail("Error trying to do non-blocking recv.")
1101 read, write, err = select.select([conn], [], [])
1102 if conn in read:
1103 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001104 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001105 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001106 else:
1107 self.fail("Error during select call to non-blocking socket.")
1108
1109 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001110 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001111 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001112 self.cli.send(MSG)
1113
Victor Stinner45df8202010-04-28 22:31:17 +00001114@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001115class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001116 """Unit tests for the object returned by socket.makefile()
1117
Antoine Pitrou834bd812010-10-13 16:17:14 +00001118 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001119 the client connection. You can read from this file to
1120 get output from the server.
1121
Antoine Pitrou834bd812010-10-13 16:17:14 +00001122 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001123 server connection. You can write to this file to send output
1124 to the client.
1125 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126
Guido van Rossume9f66142002-08-07 15:46:19 +00001127 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001128 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001129 errors = 'strict'
1130 newline = None
1131
1132 read_mode = 'rb'
1133 read_msg = MSG
1134 write_mode = 'wb'
1135 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001136
Guido van Rossum24e4af82002-06-12 19:18:08 +00001137 def __init__(self, methodName='runTest'):
1138 SocketConnectedTest.__init__(self, methodName=methodName)
1139
1140 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001141 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1142 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001144 self.read_file = self.cli_conn.makefile(
1145 self.read_mode, self.bufsize,
1146 encoding = self.encoding,
1147 errors = self.errors,
1148 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001149
1150 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001151 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001152 self.read_file.close()
1153 self.assertTrue(self.read_file.closed)
1154 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155 SocketConnectedTest.tearDown(self)
1156
1157 def clientSetUp(self):
1158 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001159 self.write_file = self.serv_conn.makefile(
1160 self.write_mode, self.bufsize,
1161 encoding = self.encoding,
1162 errors = self.errors,
1163 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001164
1165 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001166 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001167 self.write_file.close()
1168 self.assertTrue(self.write_file.closed)
1169 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001170 SocketConnectedTest.clientTearDown(self)
1171
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001172 def testReadAfterTimeout(self):
1173 # Issue #7322: A file object must disallow further reads
1174 # after a timeout has occurred.
1175 self.cli_conn.settimeout(1)
1176 self.read_file.read(3)
1177 # First read raises a timeout
1178 self.assertRaises(socket.timeout, self.read_file.read, 1)
1179 # Second read is disallowed
1180 with self.assertRaises(IOError) as ctx:
1181 self.read_file.read(1)
1182 self.assertIn("cannot read from timed out object", str(ctx.exception))
1183
1184 def _testReadAfterTimeout(self):
1185 self.write_file.write(self.write_msg[0:3])
1186 self.write_file.flush()
1187 self.serv_finished.wait()
1188
Guido van Rossum24e4af82002-06-12 19:18:08 +00001189 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001190 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001191 first_seg = self.read_file.read(len(self.read_msg)-3)
1192 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001193 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001194 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001195
1196 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001197 self.write_file.write(self.write_msg)
1198 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001199
Guido van Rossum8c943832002-08-08 01:00:28 +00001200 def testFullRead(self):
1201 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001202 msg = self.read_file.read()
1203 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001204
1205 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001206 self.write_file.write(self.write_msg)
1207 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001208
Guido van Rossum24e4af82002-06-12 19:18:08 +00001209 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001210 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001211 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001212 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001213 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001214 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001215 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001216 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001217 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001218
1219 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001220 self.write_file.write(self.write_msg)
1221 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001222
1223 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001224 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001225 line = self.read_file.readline()
1226 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001227
1228 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001229 self.write_file.write(self.write_msg)
1230 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001231
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001232 def testCloseAfterMakefile(self):
1233 # The file returned by makefile should keep the socket open.
1234 self.cli_conn.close()
1235 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001236 msg = self.read_file.read()
1237 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001238
1239 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001240 self.write_file.write(self.write_msg)
1241 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001242
1243 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001244 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001245 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001246 if isinstance(self.read_msg, str):
1247 msg = msg.decode()
1248 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001249
1250 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001251 self.write_file.write(self.write_msg)
1252 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001253
Tim Peters116d83c2004-03-28 02:20:45 +00001254 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001255 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001256
1257 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001258 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001259
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001260 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001261 self.assertEqual(self.read_file.mode, self.read_mode)
1262 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001263
1264 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001265 self.assertEqual(self.write_file.mode, self.write_mode)
1266 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001267
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001268 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001269 self.read_file.close()
1270 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001271 self.cli_conn.close()
1272 self.assertRaises(socket.error, self.cli_conn.getsockname)
1273
1274 def _testRealClose(self):
1275 pass
1276
1277
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001278class FileObjectInterruptedTestCase(unittest.TestCase):
1279 """Test that the file object correctly handles EINTR internally."""
1280
1281 class MockSocket(object):
1282 def __init__(self, recv_funcs=()):
1283 # A generator that returns callables that we'll call for each
1284 # call to recv().
1285 self._recv_step = iter(recv_funcs)
1286
1287 def recv_into(self, buffer):
1288 data = next(self._recv_step)()
1289 assert len(buffer) >= len(data)
1290 buffer[:len(data)] = data
1291 return len(data)
1292
1293 def _decref_socketios(self):
1294 pass
1295
1296 def _textiowrap_for_test(self, buffering=-1):
1297 raw = socket.SocketIO(self, "r")
1298 if buffering < 0:
1299 buffering = io.DEFAULT_BUFFER_SIZE
1300 if buffering == 0:
1301 return raw
1302 buffer = io.BufferedReader(raw, buffering)
1303 text = io.TextIOWrapper(buffer, None, None)
1304 text.mode = "rb"
1305 return text
1306
1307 @staticmethod
1308 def _raise_eintr():
1309 raise socket.error(errno.EINTR)
1310
1311 def _textiowrap_mock_socket(self, mock, buffering=-1):
1312 raw = socket.SocketIO(mock, "r")
1313 if buffering < 0:
1314 buffering = io.DEFAULT_BUFFER_SIZE
1315 if buffering == 0:
1316 return raw
1317 buffer = io.BufferedReader(raw, buffering)
1318 text = io.TextIOWrapper(buffer, None, None)
1319 text.mode = "rb"
1320 return text
1321
1322 def _test_readline(self, size=-1, buffering=-1):
1323 mock_sock = self.MockSocket(recv_funcs=[
1324 lambda : b"This is the first line\nAnd the sec",
1325 self._raise_eintr,
1326 lambda : b"ond line is here\n",
1327 lambda : b"",
1328 lambda : b"", # XXX(gps): io library does an extra EOF read
1329 ])
1330 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001331 self.assertEqual(fo.readline(size), "This is the first line\n")
1332 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001333
1334 def _test_read(self, size=-1, buffering=-1):
1335 mock_sock = self.MockSocket(recv_funcs=[
1336 lambda : b"This is the first line\nAnd the sec",
1337 self._raise_eintr,
1338 lambda : b"ond line is here\n",
1339 lambda : b"",
1340 lambda : b"", # XXX(gps): io library does an extra EOF read
1341 ])
1342 expecting = (b"This is the first line\n"
1343 b"And the second line is here\n")
1344 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1345 if buffering == 0:
1346 data = b''
1347 else:
1348 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001349 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001350 while len(data) != len(expecting):
1351 part = fo.read(size)
1352 if not part:
1353 break
1354 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001355 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001356
1357 def test_default(self):
1358 self._test_readline()
1359 self._test_readline(size=100)
1360 self._test_read()
1361 self._test_read(size=100)
1362
1363 def test_with_1k_buffer(self):
1364 self._test_readline(buffering=1024)
1365 self._test_readline(size=100, buffering=1024)
1366 self._test_read(buffering=1024)
1367 self._test_read(size=100, buffering=1024)
1368
1369 def _test_readline_no_buffer(self, size=-1):
1370 mock_sock = self.MockSocket(recv_funcs=[
1371 lambda : b"a",
1372 lambda : b"\n",
1373 lambda : b"B",
1374 self._raise_eintr,
1375 lambda : b"b",
1376 lambda : b"",
1377 ])
1378 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001379 self.assertEqual(fo.readline(size), b"a\n")
1380 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001381
1382 def test_no_buffer(self):
1383 self._test_readline_no_buffer()
1384 self._test_readline_no_buffer(size=4)
1385 self._test_read(buffering=0)
1386 self._test_read(size=100, buffering=0)
1387
1388
Guido van Rossume9f66142002-08-07 15:46:19 +00001389class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1390
1391 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001392
Guido van Rossume9f66142002-08-07 15:46:19 +00001393 In this case (and in this case only), it should be possible to
1394 create a file object, read a line from it, create another file
1395 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001396 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001397 when reading multiple requests from the same socket."""
1398
1399 bufsize = 0 # Use unbuffered mode
1400
1401 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001402 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001403 line = self.read_file.readline() # first line
1404 self.assertEqual(line, b"A. " + self.write_msg) # first line
1405 self.read_file = self.cli_conn.makefile('rb', 0)
1406 line = self.read_file.readline() # second line
1407 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001408
1409 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001410 self.write_file.write(b"A. " + self.write_msg)
1411 self.write_file.write(b"B. " + self.write_msg)
1412 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001413
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001414 def testMakefileClose(self):
1415 # The file returned by makefile should keep the socket open...
1416 self.cli_conn.close()
1417 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001418 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001419 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001420 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001421 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1422
1423 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001424 self.write_file.write(self.write_msg)
1425 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001426
1427 def testMakefileCloseSocketDestroy(self):
1428 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001429 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001430 refcount_after = sys.getrefcount(self.cli_conn)
1431 self.assertEqual(refcount_before - 1, refcount_after)
1432
1433 def _testMakefileCloseSocketDestroy(self):
1434 pass
1435
Antoine Pitrou98b46702010-09-18 22:59:00 +00001436 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001437 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001438 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1439
1440 def testSmallReadNonBlocking(self):
1441 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001442 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1443 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001444 self.evt1.set()
1445 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001446 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001447 if first_seg is None:
1448 # Data not arrived (can happen under Windows), wait a bit
1449 time.sleep(0.5)
1450 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001451 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001452 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001453 self.assertEqual(n, 3)
1454 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001455 self.assertEqual(msg, self.read_msg)
1456 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1457 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001458
1459 def _testSmallReadNonBlocking(self):
1460 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001461 self.write_file.write(self.write_msg)
1462 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001463 self.evt2.set()
1464 # Avoid cloding the socket before the server test has finished,
1465 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1466 self.serv_finished.wait(5.0)
1467
1468 def testWriteNonBlocking(self):
1469 self.cli_finished.wait(5.0)
1470 # The client thread can't skip directly - the SkipTest exception
1471 # would appear as a failure.
1472 if self.serv_skipped:
1473 self.skipTest(self.serv_skipped)
1474
1475 def _testWriteNonBlocking(self):
1476 self.serv_skipped = None
1477 self.serv_conn.setblocking(False)
1478 # Try to saturate the socket buffer pipe with repeated large writes.
1479 BIG = b"x" * (1024 ** 2)
1480 LIMIT = 10
1481 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001482 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001483 self.assertGreater(n, 0)
1484 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001485 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001486 if n is None:
1487 # Succeeded
1488 break
1489 self.assertGreater(n, 0)
1490 else:
1491 # Let us know that this test didn't manage to establish
1492 # the expected conditions. This is not a failure in itself but,
1493 # if it happens repeatedly, the test should be fixed.
1494 self.serv_skipped = "failed to saturate the socket buffer"
1495
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001496
Guido van Rossum8c943832002-08-08 01:00:28 +00001497class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1498
1499 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1500
1501
1502class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1503
1504 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001505
Thomas Woutersb2137042007-02-01 18:02:27 +00001506
Antoine Pitrou834bd812010-10-13 16:17:14 +00001507class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1508 """Tests for socket.makefile() in text mode (rather than binary)"""
1509
1510 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001511 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001512 write_mode = 'wb'
1513 write_msg = MSG
1514 newline = ''
1515
1516
1517class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1518 """Tests for socket.makefile() in text mode (rather than binary)"""
1519
1520 read_mode = 'rb'
1521 read_msg = MSG
1522 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001523 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001524 newline = ''
1525
1526
1527class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1528 """Tests for socket.makefile() in text mode (rather than binary)"""
1529
1530 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001531 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001532 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001533 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001534 newline = ''
1535
1536
Guido van Rossumd8faa362007-04-27 19:54:29 +00001537class NetworkConnectionTest(object):
1538 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001539
Guido van Rossumd8faa362007-04-27 19:54:29 +00001540 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001541 # We're inherited below by BasicTCPTest2, which also inherits
1542 # BasicTCPTest, which defines self.port referenced below.
1543 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001544 self.serv_conn = self.cli
1545
1546class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1547 """Tests that NetworkConnection does not break existing TCP functionality.
1548 """
1549
1550class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001551
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001552 class MockSocket(socket.socket):
1553 def connect(self, *args):
1554 raise socket.timeout('timed out')
1555
1556 @contextlib.contextmanager
1557 def mocked_socket_module(self):
1558 """Return a socket which times out on connect"""
1559 old_socket = socket.socket
1560 socket.socket = self.MockSocket
1561 try:
1562 yield
1563 finally:
1564 socket.socket = old_socket
1565
1566 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001567 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001568 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001569 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001570 with self.assertRaises(socket.error) as cm:
1571 cli.connect((HOST, port))
1572 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1573
1574 def test_create_connection(self):
1575 # Issue #9792: errors raised by create_connection() should have
1576 # a proper errno attribute.
1577 port = support.find_unused_port()
1578 with self.assertRaises(socket.error) as cm:
1579 socket.create_connection((HOST, port))
1580 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1581
1582 def test_create_connection_timeout(self):
1583 # Issue #9792: create_connection() should not recast timeout errors
1584 # as generic socket errors.
1585 with self.mocked_socket_module():
1586 with self.assertRaises(socket.timeout):
1587 socket.create_connection((HOST, 1234))
1588
Guido van Rossumd8faa362007-04-27 19:54:29 +00001589
Victor Stinner45df8202010-04-28 22:31:17 +00001590@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001591class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1592
1593 def __init__(self, methodName='runTest'):
1594 SocketTCPTest.__init__(self, methodName=methodName)
1595 ThreadableTest.__init__(self)
1596
1597 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001598 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001599
1600 def clientTearDown(self):
1601 self.cli.close()
1602 self.cli = None
1603 ThreadableTest.clientTearDown(self)
1604
1605 def _justAccept(self):
1606 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001607 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001608
1609 testFamily = _justAccept
1610 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001611 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001612 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001613 self.assertEqual(self.cli.family, 2)
1614
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001615 testSourceAddress = _justAccept
1616 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001617 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1618 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001619 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001620 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001621 # The port number being used is sufficient to show that the bind()
1622 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001623
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624 testTimeoutDefault = _justAccept
1625 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001626 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001627 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001628 socket.setdefaulttimeout(42)
1629 try:
1630 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001631 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001632 finally:
1633 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001634 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001635
1636 testTimeoutNone = _justAccept
1637 def _testTimeoutNone(self):
1638 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001639 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001640 socket.setdefaulttimeout(30)
1641 try:
1642 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001643 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001644 finally:
1645 socket.setdefaulttimeout(None)
1646 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001647
1648 testTimeoutValueNamed = _justAccept
1649 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001650 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001651 self.assertEqual(self.cli.gettimeout(), 30)
1652
1653 testTimeoutValueNonamed = _justAccept
1654 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001655 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001656 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001657 self.assertEqual(self.cli.gettimeout(), 30)
1658
Victor Stinner45df8202010-04-28 22:31:17 +00001659@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001660class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1661
1662 def __init__(self, methodName='runTest'):
1663 SocketTCPTest.__init__(self, methodName=methodName)
1664 ThreadableTest.__init__(self)
1665
1666 def clientSetUp(self):
1667 pass
1668
1669 def clientTearDown(self):
1670 self.cli.close()
1671 self.cli = None
1672 ThreadableTest.clientTearDown(self)
1673
1674 def testInsideTimeout(self):
1675 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001676 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001677 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001678 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001679 testOutsideTimeout = testInsideTimeout
1680
1681 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001682 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001683 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001684 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001685
1686 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001687 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001688 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001689
1690
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001691class TCPTimeoutTest(SocketTCPTest):
1692
1693 def testTCPTimeout(self):
1694 def raise_timeout(*args, **kwargs):
1695 self.serv.settimeout(1.0)
1696 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001697 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001698 "Error generating a timeout exception (TCP)")
1699
1700 def testTimeoutZero(self):
1701 ok = False
1702 try:
1703 self.serv.settimeout(0.0)
1704 foo = self.serv.accept()
1705 except socket.timeout:
1706 self.fail("caught timeout instead of error (TCP)")
1707 except socket.error:
1708 ok = True
1709 except:
1710 self.fail("caught unexpected exception (TCP)")
1711 if not ok:
1712 self.fail("accept() returned success when we did not expect it")
1713
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001714 def testInterruptedTimeout(self):
1715 # XXX I don't know how to do this test on MSWindows or any other
1716 # plaform that doesn't support signal.alarm() or os.kill(), though
1717 # the bug should have existed on all platforms.
1718 if not hasattr(signal, "alarm"):
1719 return # can only test on *nix
1720 self.serv.settimeout(5.0) # must be longer than alarm
1721 class Alarm(Exception):
1722 pass
1723 def alarm_handler(signal, frame):
1724 raise Alarm
1725 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1726 try:
1727 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1728 try:
1729 foo = self.serv.accept()
1730 except socket.timeout:
1731 self.fail("caught timeout instead of Alarm")
1732 except Alarm:
1733 pass
1734 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001735 self.fail("caught other exception instead of Alarm:"
1736 " %s(%s):\n%s" %
1737 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001738 else:
1739 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001740 finally:
1741 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001742 except Alarm:
1743 self.fail("got Alarm in wrong place")
1744 finally:
1745 # no alarm can be pending. Safe to restore old handler.
1746 signal.signal(signal.SIGALRM, old_alarm)
1747
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001748class UDPTimeoutTest(SocketTCPTest):
1749
1750 def testUDPTimeout(self):
1751 def raise_timeout(*args, **kwargs):
1752 self.serv.settimeout(1.0)
1753 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001754 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001755 "Error generating a timeout exception (UDP)")
1756
1757 def testTimeoutZero(self):
1758 ok = False
1759 try:
1760 self.serv.settimeout(0.0)
1761 foo = self.serv.recv(1024)
1762 except socket.timeout:
1763 self.fail("caught timeout instead of error (UDP)")
1764 except socket.error:
1765 ok = True
1766 except:
1767 self.fail("caught unexpected exception (UDP)")
1768 if not ok:
1769 self.fail("recv() returned success when we did not expect it")
1770
1771class TestExceptions(unittest.TestCase):
1772
1773 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001774 self.assertTrue(issubclass(socket.error, Exception))
1775 self.assertTrue(issubclass(socket.herror, socket.error))
1776 self.assertTrue(issubclass(socket.gaierror, socket.error))
1777 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001778
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001779class TestLinuxAbstractNamespace(unittest.TestCase):
1780
1781 UNIX_PATH_MAX = 108
1782
1783 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001784 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001785 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1786 s1.bind(address)
1787 s1.listen(1)
1788 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1789 s2.connect(s1.getsockname())
1790 with s1.accept()[0] as s3:
1791 self.assertEqual(s1.getsockname(), address)
1792 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001793
1794 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001795 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001796 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1797 s.bind(address)
1798 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001799
1800 def testNameOverflow(self):
1801 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001802 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1803 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001804
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001805
Victor Stinner45df8202010-04-28 22:31:17 +00001806@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001807class BufferIOTest(SocketConnectedTest):
1808 """
1809 Test the buffer versions of socket.recv() and socket.send().
1810 """
1811 def __init__(self, methodName='runTest'):
1812 SocketConnectedTest.__init__(self, methodName=methodName)
1813
Antoine Pitrou25480782010-03-17 22:50:28 +00001814 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001815 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001816 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001817 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001818 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001819 self.assertEqual(msg, MSG)
1820
Antoine Pitrou25480782010-03-17 22:50:28 +00001821 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001822 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001823 self.serv_conn.send(buf)
1824
Antoine Pitrou25480782010-03-17 22:50:28 +00001825 def testRecvIntoBytearray(self):
1826 buf = bytearray(1024)
1827 nbytes = self.cli_conn.recv_into(buf)
1828 self.assertEqual(nbytes, len(MSG))
1829 msg = buf[:len(MSG)]
1830 self.assertEqual(msg, MSG)
1831
1832 _testRecvIntoBytearray = _testRecvIntoArray
1833
1834 def testRecvIntoMemoryview(self):
1835 buf = bytearray(1024)
1836 nbytes = self.cli_conn.recv_into(memoryview(buf))
1837 self.assertEqual(nbytes, len(MSG))
1838 msg = buf[:len(MSG)]
1839 self.assertEqual(msg, MSG)
1840
1841 _testRecvIntoMemoryview = _testRecvIntoArray
1842
1843 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001844 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001845 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001846 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001847 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001848 self.assertEqual(msg, MSG)
1849
Antoine Pitrou25480782010-03-17 22:50:28 +00001850 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001851 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001852 self.serv_conn.send(buf)
1853
Antoine Pitrou25480782010-03-17 22:50:28 +00001854 def testRecvFromIntoBytearray(self):
1855 buf = bytearray(1024)
1856 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1857 self.assertEqual(nbytes, len(MSG))
1858 msg = buf[:len(MSG)]
1859 self.assertEqual(msg, MSG)
1860
1861 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1862
1863 def testRecvFromIntoMemoryview(self):
1864 buf = bytearray(1024)
1865 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1866 self.assertEqual(nbytes, len(MSG))
1867 msg = buf[:len(MSG)]
1868 self.assertEqual(msg, MSG)
1869
1870 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1871
Christian Heimes043d6f62008-01-07 17:19:16 +00001872
1873TIPC_STYPE = 2000
1874TIPC_LOWER = 200
1875TIPC_UPPER = 210
1876
1877def isTipcAvailable():
1878 """Check if the TIPC module is loaded
1879
1880 The TIPC module is not loaded automatically on Ubuntu and probably
1881 other Linux distros.
1882 """
1883 if not hasattr(socket, "AF_TIPC"):
1884 return False
1885 if not os.path.isfile("/proc/modules"):
1886 return False
1887 with open("/proc/modules") as f:
1888 for line in f:
1889 if line.startswith("tipc "):
1890 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001891 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001892 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1893 return False
1894
1895class TIPCTest (unittest.TestCase):
1896 def testRDM(self):
1897 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1898 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1899
1900 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1901 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1902 TIPC_LOWER, TIPC_UPPER)
1903 srv.bind(srvaddr)
1904
1905 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1906 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1907 cli.sendto(MSG, sendaddr)
1908
1909 msg, recvaddr = srv.recvfrom(1024)
1910
1911 self.assertEqual(cli.getsockname(), recvaddr)
1912 self.assertEqual(msg, MSG)
1913
1914
1915class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1916 def __init__(self, methodName = 'runTest'):
1917 unittest.TestCase.__init__(self, methodName = methodName)
1918 ThreadableTest.__init__(self)
1919
1920 def setUp(self):
1921 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1922 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1923 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1924 TIPC_LOWER, TIPC_UPPER)
1925 self.srv.bind(srvaddr)
1926 self.srv.listen(5)
1927 self.serverExplicitReady()
1928 self.conn, self.connaddr = self.srv.accept()
1929
1930 def clientSetUp(self):
1931 # The is a hittable race between serverExplicitReady() and the
1932 # accept() call; sleep a little while to avoid it, otherwise
1933 # we could get an exception
1934 time.sleep(0.1)
1935 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1936 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1937 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1938 self.cli.connect(addr)
1939 self.cliaddr = self.cli.getsockname()
1940
1941 def testStream(self):
1942 msg = self.conn.recv(1024)
1943 self.assertEqual(msg, MSG)
1944 self.assertEqual(self.cliaddr, self.connaddr)
1945
1946 def _testStream(self):
1947 self.cli.send(MSG)
1948 self.cli.close()
1949
1950
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001951@unittest.skipUnless(thread, 'Threading required for this test.')
1952class ContextManagersTest(ThreadedTCPSocketTest):
1953
1954 def _testSocketClass(self):
1955 # base test
1956 with socket.socket() as sock:
1957 self.assertFalse(sock._closed)
1958 self.assertTrue(sock._closed)
1959 # close inside with block
1960 with socket.socket() as sock:
1961 sock.close()
1962 self.assertTrue(sock._closed)
1963 # exception inside with block
1964 with socket.socket() as sock:
1965 self.assertRaises(socket.error, sock.sendall, b'foo')
1966 self.assertTrue(sock._closed)
1967
1968 def testCreateConnectionBase(self):
1969 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001970 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001971 data = conn.recv(1024)
1972 conn.sendall(data)
1973
1974 def _testCreateConnectionBase(self):
1975 address = self.serv.getsockname()
1976 with socket.create_connection(address) as sock:
1977 self.assertFalse(sock._closed)
1978 sock.sendall(b'foo')
1979 self.assertEqual(sock.recv(1024), b'foo')
1980 self.assertTrue(sock._closed)
1981
1982 def testCreateConnectionClose(self):
1983 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001984 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001985 data = conn.recv(1024)
1986 conn.sendall(data)
1987
1988 def _testCreateConnectionClose(self):
1989 address = self.serv.getsockname()
1990 with socket.create_connection(address) as sock:
1991 sock.close()
1992 self.assertTrue(sock._closed)
1993 self.assertRaises(socket.error, sock.sendall, b'foo')
1994
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001995
Antoine Pitroub1c54962010-10-14 15:05:38 +00001996@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1997 "SOCK_CLOEXEC not defined")
1998@unittest.skipUnless(fcntl, "module fcntl not available")
1999class CloexecConstantTest(unittest.TestCase):
2000 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002001 v = linux_version()
2002 if v < (2, 6, 28):
2003 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2004 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002005 with socket.socket(socket.AF_INET,
2006 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2007 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2008 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002009
2010
2011@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2012 "SOCK_NONBLOCK not defined")
2013class NonblockConstantTest(unittest.TestCase):
2014 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2015 if nonblock:
2016 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2017 self.assertEqual(s.gettimeout(), timeout)
2018 else:
2019 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2020 self.assertEqual(s.gettimeout(), None)
2021
2022 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002023 v = linux_version()
2024 if v < (2, 6, 28):
2025 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2026 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002027 # a lot of it seems silly and redundant, but I wanted to test that
2028 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002029 with socket.socket(socket.AF_INET,
2030 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2031 self.checkNonblock(s)
2032 s.setblocking(1)
2033 self.checkNonblock(s, False)
2034 s.setblocking(0)
2035 self.checkNonblock(s)
2036 s.settimeout(None)
2037 self.checkNonblock(s, False)
2038 s.settimeout(2.0)
2039 self.checkNonblock(s, timeout=2.0)
2040 s.setblocking(1)
2041 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002042 # defaulttimeout
2043 t = socket.getdefaulttimeout()
2044 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002045 with socket.socket() as s:
2046 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002047 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002048 with socket.socket() as s:
2049 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002050 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002051 with socket.socket() as s:
2052 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002053 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002054 with socket.socket() as s:
2055 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002056 socket.setdefaulttimeout(t)
2057
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002058
Guido van Rossumb995eb72002-07-31 16:08:40 +00002059def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002060 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002061 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002062
2063 tests.extend([
2064 NonBlockingTCPTests,
2065 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002066 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002067 UnbufferedFileObjectClassTestCase,
2068 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002069 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002070 UnicodeReadFileObjectClassTestCase,
2071 UnicodeWriteFileObjectClassTestCase,
2072 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002073 NetworkConnectionNoServer,
2074 NetworkConnectionAttributesTest,
2075 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002076 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002077 CloexecConstantTest,
2078 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002079 ])
Dave Cole331708b2004-08-09 04:51:41 +00002080 if hasattr(socket, "socketpair"):
2081 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002082 if sys.platform == 'linux2':
2083 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002084 if isTipcAvailable():
2085 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002086 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002087
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002088 thread_info = support.threading_setup()
2089 support.run_unittest(*tests)
2090 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002091
2092if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002093 test_main()