blob: 2602b22e6d767c8cf063f7c6d86c51e6e2ecebfa [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 testSockName(self):
571 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200572 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000574 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000575 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000576 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000577 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
578 # it reasonable to get the host's addr in addition to 0.0.0.0.
579 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000580 try:
581 my_ip_addr = socket.gethostbyname(socket.gethostname())
582 except socket.error:
583 # Probably name lookup wasn't set up right; skip this test
584 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000585 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000586 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587
588 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000589 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590 # We know a socket should start without reuse==0
591 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000592 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000593 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000594 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000595
596 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000597 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000598 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000599 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000600 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
601 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000602 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000603
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000604 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000605 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000606 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
607 sock.settimeout(1)
608 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000609 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000610
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000611 def testNewAttributes(self):
612 # testing .family, .type and .protocol
613 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
614 self.assertEqual(sock.family, socket.AF_INET)
615 self.assertEqual(sock.type, socket.SOCK_STREAM)
616 self.assertEqual(sock.proto, 0)
617 sock.close()
618
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000619 def test_getsockaddrarg(self):
620 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200621 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000622 big_port = port + 65536
623 neg_port = port - 65536
624 sock = socket.socket()
625 try:
626 self.assertRaises(OverflowError, sock.bind, (host, big_port))
627 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
628 sock.bind((host, port))
629 finally:
630 sock.close()
631
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000632 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000633 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000634 self.assertTrue(hasattr(socket.socket, 'ioctl'))
635 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
636 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
637 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000638 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
639 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000640 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000641 self.assertRaises(ValueError, s.ioctl, -1, None)
642 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000643
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000644 def testGetaddrinfo(self):
645 try:
646 socket.getaddrinfo('localhost', 80)
647 except socket.gaierror as err:
648 if err.errno == socket.EAI_SERVICE:
649 # see http://bugs.python.org/issue1282647
650 self.skipTest("buggy libc version")
651 raise
652 # len of every sequence is supposed to be == 5
653 for info in socket.getaddrinfo(HOST, None):
654 self.assertEqual(len(info), 5)
655 # host can be a domain name, a string representation of an
656 # IPv4/v6 address or None
657 socket.getaddrinfo('localhost', 80)
658 socket.getaddrinfo('127.0.0.1', 80)
659 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200660 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000661 socket.getaddrinfo('::1', 80)
662 # port can be a string service name such as "http", a numeric
663 # port number or None
664 socket.getaddrinfo(HOST, "http")
665 socket.getaddrinfo(HOST, 80)
666 socket.getaddrinfo(HOST, None)
667 # test family and socktype filters
668 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
669 for family, _, _, _, _ in infos:
670 self.assertEqual(family, socket.AF_INET)
671 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
672 for _, socktype, _, _, _ in infos:
673 self.assertEqual(socktype, socket.SOCK_STREAM)
674 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000675 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000676 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
677 # a server willing to support both IPv4 and IPv6 will
678 # usually do this
679 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
680 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000681 # test keyword arguments
682 a = socket.getaddrinfo(HOST, None)
683 b = socket.getaddrinfo(host=HOST, port=None)
684 self.assertEqual(a, b)
685 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
686 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
687 self.assertEqual(a, b)
688 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
689 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
690 self.assertEqual(a, b)
691 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
692 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
693 self.assertEqual(a, b)
694 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
695 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
696 self.assertEqual(a, b)
697 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
698 socket.AI_PASSIVE)
699 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
700 type=socket.SOCK_STREAM, proto=0,
701 flags=socket.AI_PASSIVE)
702 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000703 # Issue #6697.
704 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000705
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000706 def test_getnameinfo(self):
707 # only IP addresses are allowed
708 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
709
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000710 @unittest.skipUnless(support.is_resource_enabled('network'),
711 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000712 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000713 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000714 # these should all be successful
715 socket.gethostbyname('испытание.python.org')
716 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000717 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
718 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
719 # have a reverse entry yet
720 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000721
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000722 def check_sendall_interrupted(self, with_timeout):
723 # socketpair() is not stricly required, but it makes things easier.
724 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
725 self.skipTest("signal.alarm and socket.socketpair required for this test")
726 # Our signal handlers clobber the C errno by calling a math function
727 # with an invalid domain value.
728 def ok_handler(*args):
729 self.assertRaises(ValueError, math.acosh, 0)
730 def raising_handler(*args):
731 self.assertRaises(ValueError, math.acosh, 0)
732 1 // 0
733 c, s = socket.socketpair()
734 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
735 try:
736 if with_timeout:
737 # Just above the one second minimum for signal.alarm
738 c.settimeout(1.5)
739 with self.assertRaises(ZeroDivisionError):
740 signal.alarm(1)
741 c.sendall(b"x" * (1024**2))
742 if with_timeout:
743 signal.signal(signal.SIGALRM, ok_handler)
744 signal.alarm(1)
745 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
746 finally:
747 signal.signal(signal.SIGALRM, old_alarm)
748 c.close()
749 s.close()
750
751 def test_sendall_interrupted(self):
752 self.check_sendall_interrupted(False)
753
754 def test_sendall_interrupted_with_timeout(self):
755 self.check_sendall_interrupted(True)
756
Antoine Pitroue033e062010-10-29 10:38:18 +0000757 def test_dealloc_warn(self):
758 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
759 r = repr(sock)
760 with self.assertWarns(ResourceWarning) as cm:
761 sock = None
762 support.gc_collect()
763 self.assertIn(r, str(cm.warning.args[0]))
764 # An open socket file object gets dereferenced after the socket
765 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
766 f = sock.makefile('rb')
767 r = repr(sock)
768 sock = None
769 support.gc_collect()
770 with self.assertWarns(ResourceWarning):
771 f = None
772 support.gc_collect()
773
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000774 def test_name_closed_socketio(self):
775 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
776 fp = sock.makefile("rb")
777 fp.close()
778 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
779
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100780 def test_pickle(self):
781 sock = socket.socket()
782 with sock:
783 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
784 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
785
Antoine Pitrou3cade992011-05-10 19:19:13 +0200786 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200787 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
788 srv.bind((HOST, 0))
789 # backlog = 0
790 srv.listen(0)
791 srv.close()
792
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000793
Victor Stinner45df8202010-04-28 22:31:17 +0000794@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000795class BasicTCPTest(SocketConnectedTest):
796
797 def __init__(self, methodName='runTest'):
798 SocketConnectedTest.__init__(self, methodName=methodName)
799
800 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000801 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000803 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000804
805 def _testRecv(self):
806 self.serv_conn.send(MSG)
807
808 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000809 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000810 seg1 = self.cli_conn.recv(len(MSG) - 3)
811 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000812 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000813 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814
815 def _testOverFlowRecv(self):
816 self.serv_conn.send(MSG)
817
818 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000819 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000821 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822
823 def _testRecvFrom(self):
824 self.serv_conn.send(MSG)
825
826 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000827 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
829 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000830 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000831 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832
833 def _testOverFlowRecvFrom(self):
834 self.serv_conn.send(MSG)
835
836 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000837 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000838 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000839 while 1:
840 read = self.cli_conn.recv(1024)
841 if not read:
842 break
Guido van Rossume531e292002-08-08 20:28:34 +0000843 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000844 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000845
846 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000847 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848 self.serv_conn.sendall(big_chunk)
849
850 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000851 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852 fd = self.cli_conn.fileno()
853 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000854 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000855 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000857 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858
859 def _testFromFd(self):
860 self.serv_conn.send(MSG)
861
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000862 def testDup(self):
863 # Testing dup()
864 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000865 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000866 msg = sock.recv(1024)
867 self.assertEqual(msg, MSG)
868
869 def _testDup(self):
870 self.serv_conn.send(MSG)
871
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000873 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000875 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000876 # wait for _testShutdown to finish: on OS X, when the server
877 # closes the connection the client also becomes disconnected,
878 # and the client's shutdown call will fail. (Issue #4397.)
879 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000880
881 def _testShutdown(self):
882 self.serv_conn.send(MSG)
883 self.serv_conn.shutdown(2)
884
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000885 def testDetach(self):
886 # Testing detach()
887 fileno = self.cli_conn.fileno()
888 f = self.cli_conn.detach()
889 self.assertEqual(f, fileno)
890 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000891 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
892 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000893 # ...but we can create another socket using the (still open)
894 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000895 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000896 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000897 msg = sock.recv(1024)
898 self.assertEqual(msg, MSG)
899
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000900 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000901 self.serv_conn.send(MSG)
902
Victor Stinner45df8202010-04-28 22:31:17 +0000903@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000904class BasicUDPTest(ThreadedUDPSocketTest):
905
906 def __init__(self, methodName='runTest'):
907 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
908
909 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000910 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000911 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000912 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000913
914 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000915 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916
Guido van Rossum1c938012002-06-12 21:17:20 +0000917 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000918 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000920 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000921
Guido van Rossum1c938012002-06-12 21:17:20 +0000922 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000923 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000924
Guido van Rossumd8faa362007-04-27 19:54:29 +0000925 def testRecvFromNegative(self):
926 # Negative lengths passed to recvfrom should give ValueError.
927 self.assertRaises(ValueError, self.serv.recvfrom, -1)
928
929 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000930 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000931
Victor Stinner45df8202010-04-28 22:31:17 +0000932@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000933class TCPCloserTest(ThreadedTCPSocketTest):
934
935 def testClose(self):
936 conn, addr = self.serv.accept()
937 conn.close()
938
939 sd = self.cli
940 read, write, err = select.select([sd], [], [], 1.0)
941 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000942 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000943
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000944 # Calling close() many times should be safe.
945 conn.close()
946 conn.close()
947
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000948 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000949 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000950 time.sleep(1.0)
951
Victor Stinner45df8202010-04-28 22:31:17 +0000952@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000953class BasicSocketPairTest(SocketPairTest):
954
955 def __init__(self, methodName='runTest'):
956 SocketPairTest.__init__(self, methodName=methodName)
957
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000958 def _check_defaults(self, sock):
959 self.assertIsInstance(sock, socket.socket)
960 if hasattr(socket, 'AF_UNIX'):
961 self.assertEqual(sock.family, socket.AF_UNIX)
962 else:
963 self.assertEqual(sock.family, socket.AF_INET)
964 self.assertEqual(sock.type, socket.SOCK_STREAM)
965 self.assertEqual(sock.proto, 0)
966
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000967 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000968 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000969
970 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000971 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000972
Dave Cole331708b2004-08-09 04:51:41 +0000973 def testRecv(self):
974 msg = self.serv.recv(1024)
975 self.assertEqual(msg, MSG)
976
977 def _testRecv(self):
978 self.cli.send(MSG)
979
980 def testSend(self):
981 self.serv.send(MSG)
982
983 def _testSend(self):
984 msg = self.cli.recv(1024)
985 self.assertEqual(msg, MSG)
986
Victor Stinner45df8202010-04-28 22:31:17 +0000987@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000988class NonBlockingTCPTests(ThreadedTCPSocketTest):
989
990 def __init__(self, methodName='runTest'):
991 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
992
993 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000994 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000995 self.serv.setblocking(0)
996 start = time.time()
997 try:
998 self.serv.accept()
999 except socket.error:
1000 pass
1001 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001002 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001003
1004 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001005 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001006
Antoine Pitroub1c54962010-10-14 15:05:38 +00001007 if hasattr(socket, "SOCK_NONBLOCK"):
1008 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001009 v = linux_version()
1010 if v < (2, 6, 28):
1011 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1012 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001013 # reinit server socket
1014 self.serv.close()
1015 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001016 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001017 self.port = support.bind_port(self.serv)
1018 self.serv.listen(1)
1019 # actual testing
1020 start = time.time()
1021 try:
1022 self.serv.accept()
1023 except socket.error:
1024 pass
1025 end = time.time()
1026 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1027
1028 def _testInitNonBlocking(self):
1029 pass
1030
Antoine Pitrou600232b2011-01-05 21:03:42 +00001031 def testInheritFlags(self):
1032 # Issue #7995: when calling accept() on a listening socket with a
1033 # timeout, the resulting socket should not be non-blocking.
1034 self.serv.settimeout(10)
1035 try:
1036 conn, addr = self.serv.accept()
1037 message = conn.recv(len(MSG))
1038 finally:
1039 conn.close()
1040 self.serv.settimeout(None)
1041
1042 def _testInheritFlags(self):
1043 time.sleep(0.1)
1044 self.cli.connect((HOST, self.port))
1045 time.sleep(0.5)
1046 self.cli.send(MSG)
1047
Guido van Rossum24e4af82002-06-12 19:18:08 +00001048 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001049 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001051 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001052 conn, addr = self.serv.accept()
1053 except socket.error:
1054 pass
1055 else:
1056 self.fail("Error trying to do non-blocking accept.")
1057 read, write, err = select.select([self.serv], [], [])
1058 if self.serv in read:
1059 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001060 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061 else:
1062 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001063
Guido van Rossum24e4af82002-06-12 19:18:08 +00001064 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001065 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001066 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067
1068 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001069 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001071 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001072
1073 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001074 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001075 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001076
1077 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001078 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001079 conn, addr = self.serv.accept()
1080 conn.setblocking(0)
1081 try:
1082 msg = conn.recv(len(MSG))
1083 except socket.error:
1084 pass
1085 else:
1086 self.fail("Error trying to do non-blocking recv.")
1087 read, write, err = select.select([conn], [], [])
1088 if conn in read:
1089 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001090 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001091 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001092 else:
1093 self.fail("Error during select call to non-blocking socket.")
1094
1095 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001096 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001097 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 self.cli.send(MSG)
1099
Victor Stinner45df8202010-04-28 22:31:17 +00001100@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001101class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001102 """Unit tests for the object returned by socket.makefile()
1103
Antoine Pitrou834bd812010-10-13 16:17:14 +00001104 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001105 the client connection. You can read from this file to
1106 get output from the server.
1107
Antoine Pitrou834bd812010-10-13 16:17:14 +00001108 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001109 server connection. You can write to this file to send output
1110 to the client.
1111 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001112
Guido van Rossume9f66142002-08-07 15:46:19 +00001113 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001114 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001115 errors = 'strict'
1116 newline = None
1117
1118 read_mode = 'rb'
1119 read_msg = MSG
1120 write_mode = 'wb'
1121 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001122
Guido van Rossum24e4af82002-06-12 19:18:08 +00001123 def __init__(self, methodName='runTest'):
1124 SocketConnectedTest.__init__(self, methodName=methodName)
1125
1126 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001127 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1128 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001129 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001130 self.read_file = self.cli_conn.makefile(
1131 self.read_mode, self.bufsize,
1132 encoding = self.encoding,
1133 errors = self.errors,
1134 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001135
1136 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001137 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001138 self.read_file.close()
1139 self.assertTrue(self.read_file.closed)
1140 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001141 SocketConnectedTest.tearDown(self)
1142
1143 def clientSetUp(self):
1144 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001145 self.write_file = self.serv_conn.makefile(
1146 self.write_mode, self.bufsize,
1147 encoding = self.encoding,
1148 errors = self.errors,
1149 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001150
1151 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001152 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001153 self.write_file.close()
1154 self.assertTrue(self.write_file.closed)
1155 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001156 SocketConnectedTest.clientTearDown(self)
1157
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001158 def testReadAfterTimeout(self):
1159 # Issue #7322: A file object must disallow further reads
1160 # after a timeout has occurred.
1161 self.cli_conn.settimeout(1)
1162 self.read_file.read(3)
1163 # First read raises a timeout
1164 self.assertRaises(socket.timeout, self.read_file.read, 1)
1165 # Second read is disallowed
1166 with self.assertRaises(IOError) as ctx:
1167 self.read_file.read(1)
1168 self.assertIn("cannot read from timed out object", str(ctx.exception))
1169
1170 def _testReadAfterTimeout(self):
1171 self.write_file.write(self.write_msg[0:3])
1172 self.write_file.flush()
1173 self.serv_finished.wait()
1174
Guido van Rossum24e4af82002-06-12 19:18:08 +00001175 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001176 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001177 first_seg = self.read_file.read(len(self.read_msg)-3)
1178 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001179 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001180 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001181
1182 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001183 self.write_file.write(self.write_msg)
1184 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001185
Guido van Rossum8c943832002-08-08 01:00:28 +00001186 def testFullRead(self):
1187 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001188 msg = self.read_file.read()
1189 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001190
1191 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001192 self.write_file.write(self.write_msg)
1193 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001194
Guido van Rossum24e4af82002-06-12 19:18:08 +00001195 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001196 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001197 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001198 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001199 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001200 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001201 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001202 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001203 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001204
1205 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001206 self.write_file.write(self.write_msg)
1207 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001208
1209 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001210 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001211 line = self.read_file.readline()
1212 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001213
1214 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001215 self.write_file.write(self.write_msg)
1216 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001217
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001218 def testCloseAfterMakefile(self):
1219 # The file returned by makefile should keep the socket open.
1220 self.cli_conn.close()
1221 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001222 msg = self.read_file.read()
1223 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001224
1225 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001226 self.write_file.write(self.write_msg)
1227 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001228
1229 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001230 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001231 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001232 if isinstance(self.read_msg, str):
1233 msg = msg.decode()
1234 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001235
1236 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001237 self.write_file.write(self.write_msg)
1238 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001239
Tim Peters116d83c2004-03-28 02:20:45 +00001240 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001241 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001242
1243 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001244 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001245
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001246 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001247 self.assertEqual(self.read_file.mode, self.read_mode)
1248 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001249
1250 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001251 self.assertEqual(self.write_file.mode, self.write_mode)
1252 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001253
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001254 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001255 self.read_file.close()
1256 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001257 self.cli_conn.close()
1258 self.assertRaises(socket.error, self.cli_conn.getsockname)
1259
1260 def _testRealClose(self):
1261 pass
1262
1263
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001264class FileObjectInterruptedTestCase(unittest.TestCase):
1265 """Test that the file object correctly handles EINTR internally."""
1266
1267 class MockSocket(object):
1268 def __init__(self, recv_funcs=()):
1269 # A generator that returns callables that we'll call for each
1270 # call to recv().
1271 self._recv_step = iter(recv_funcs)
1272
1273 def recv_into(self, buffer):
1274 data = next(self._recv_step)()
1275 assert len(buffer) >= len(data)
1276 buffer[:len(data)] = data
1277 return len(data)
1278
1279 def _decref_socketios(self):
1280 pass
1281
1282 def _textiowrap_for_test(self, buffering=-1):
1283 raw = socket.SocketIO(self, "r")
1284 if buffering < 0:
1285 buffering = io.DEFAULT_BUFFER_SIZE
1286 if buffering == 0:
1287 return raw
1288 buffer = io.BufferedReader(raw, buffering)
1289 text = io.TextIOWrapper(buffer, None, None)
1290 text.mode = "rb"
1291 return text
1292
1293 @staticmethod
1294 def _raise_eintr():
1295 raise socket.error(errno.EINTR)
1296
1297 def _textiowrap_mock_socket(self, mock, buffering=-1):
1298 raw = socket.SocketIO(mock, "r")
1299 if buffering < 0:
1300 buffering = io.DEFAULT_BUFFER_SIZE
1301 if buffering == 0:
1302 return raw
1303 buffer = io.BufferedReader(raw, buffering)
1304 text = io.TextIOWrapper(buffer, None, None)
1305 text.mode = "rb"
1306 return text
1307
1308 def _test_readline(self, size=-1, buffering=-1):
1309 mock_sock = self.MockSocket(recv_funcs=[
1310 lambda : b"This is the first line\nAnd the sec",
1311 self._raise_eintr,
1312 lambda : b"ond line is here\n",
1313 lambda : b"",
1314 lambda : b"", # XXX(gps): io library does an extra EOF read
1315 ])
1316 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001317 self.assertEqual(fo.readline(size), "This is the first line\n")
1318 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001319
1320 def _test_read(self, size=-1, buffering=-1):
1321 mock_sock = self.MockSocket(recv_funcs=[
1322 lambda : b"This is the first line\nAnd the sec",
1323 self._raise_eintr,
1324 lambda : b"ond line is here\n",
1325 lambda : b"",
1326 lambda : b"", # XXX(gps): io library does an extra EOF read
1327 ])
1328 expecting = (b"This is the first line\n"
1329 b"And the second line is here\n")
1330 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1331 if buffering == 0:
1332 data = b''
1333 else:
1334 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001335 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001336 while len(data) != len(expecting):
1337 part = fo.read(size)
1338 if not part:
1339 break
1340 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001341 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001342
1343 def test_default(self):
1344 self._test_readline()
1345 self._test_readline(size=100)
1346 self._test_read()
1347 self._test_read(size=100)
1348
1349 def test_with_1k_buffer(self):
1350 self._test_readline(buffering=1024)
1351 self._test_readline(size=100, buffering=1024)
1352 self._test_read(buffering=1024)
1353 self._test_read(size=100, buffering=1024)
1354
1355 def _test_readline_no_buffer(self, size=-1):
1356 mock_sock = self.MockSocket(recv_funcs=[
1357 lambda : b"a",
1358 lambda : b"\n",
1359 lambda : b"B",
1360 self._raise_eintr,
1361 lambda : b"b",
1362 lambda : b"",
1363 ])
1364 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001365 self.assertEqual(fo.readline(size), b"a\n")
1366 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001367
1368 def test_no_buffer(self):
1369 self._test_readline_no_buffer()
1370 self._test_readline_no_buffer(size=4)
1371 self._test_read(buffering=0)
1372 self._test_read(size=100, buffering=0)
1373
1374
Guido van Rossume9f66142002-08-07 15:46:19 +00001375class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1376
1377 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001378
Guido van Rossume9f66142002-08-07 15:46:19 +00001379 In this case (and in this case only), it should be possible to
1380 create a file object, read a line from it, create another file
1381 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001382 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001383 when reading multiple requests from the same socket."""
1384
1385 bufsize = 0 # Use unbuffered mode
1386
1387 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001388 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001389 line = self.read_file.readline() # first line
1390 self.assertEqual(line, b"A. " + self.write_msg) # first line
1391 self.read_file = self.cli_conn.makefile('rb', 0)
1392 line = self.read_file.readline() # second line
1393 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001394
1395 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001396 self.write_file.write(b"A. " + self.write_msg)
1397 self.write_file.write(b"B. " + self.write_msg)
1398 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001399
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001400 def testMakefileClose(self):
1401 # The file returned by makefile should keep the socket open...
1402 self.cli_conn.close()
1403 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001404 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001405 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001406 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001407 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1408
1409 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001410 self.write_file.write(self.write_msg)
1411 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001412
1413 def testMakefileCloseSocketDestroy(self):
1414 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001415 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001416 refcount_after = sys.getrefcount(self.cli_conn)
1417 self.assertEqual(refcount_before - 1, refcount_after)
1418
1419 def _testMakefileCloseSocketDestroy(self):
1420 pass
1421
Antoine Pitrou98b46702010-09-18 22:59:00 +00001422 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001423 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001424 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1425
1426 def testSmallReadNonBlocking(self):
1427 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001428 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1429 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001430 self.evt1.set()
1431 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001432 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001433 if first_seg is None:
1434 # Data not arrived (can happen under Windows), wait a bit
1435 time.sleep(0.5)
1436 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001437 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001438 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001439 self.assertEqual(n, 3)
1440 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001441 self.assertEqual(msg, self.read_msg)
1442 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1443 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001444
1445 def _testSmallReadNonBlocking(self):
1446 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001447 self.write_file.write(self.write_msg)
1448 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001449 self.evt2.set()
1450 # Avoid cloding the socket before the server test has finished,
1451 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1452 self.serv_finished.wait(5.0)
1453
1454 def testWriteNonBlocking(self):
1455 self.cli_finished.wait(5.0)
1456 # The client thread can't skip directly - the SkipTest exception
1457 # would appear as a failure.
1458 if self.serv_skipped:
1459 self.skipTest(self.serv_skipped)
1460
1461 def _testWriteNonBlocking(self):
1462 self.serv_skipped = None
1463 self.serv_conn.setblocking(False)
1464 # Try to saturate the socket buffer pipe with repeated large writes.
1465 BIG = b"x" * (1024 ** 2)
1466 LIMIT = 10
1467 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001468 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001469 self.assertGreater(n, 0)
1470 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001471 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001472 if n is None:
1473 # Succeeded
1474 break
1475 self.assertGreater(n, 0)
1476 else:
1477 # Let us know that this test didn't manage to establish
1478 # the expected conditions. This is not a failure in itself but,
1479 # if it happens repeatedly, the test should be fixed.
1480 self.serv_skipped = "failed to saturate the socket buffer"
1481
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001482
Guido van Rossum8c943832002-08-08 01:00:28 +00001483class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1484
1485 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1486
1487
1488class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1489
1490 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001491
Thomas Woutersb2137042007-02-01 18:02:27 +00001492
Antoine Pitrou834bd812010-10-13 16:17:14 +00001493class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1494 """Tests for socket.makefile() in text mode (rather than binary)"""
1495
1496 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001497 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001498 write_mode = 'wb'
1499 write_msg = MSG
1500 newline = ''
1501
1502
1503class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1504 """Tests for socket.makefile() in text mode (rather than binary)"""
1505
1506 read_mode = 'rb'
1507 read_msg = MSG
1508 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001509 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001510 newline = ''
1511
1512
1513class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1514 """Tests for socket.makefile() in text mode (rather than binary)"""
1515
1516 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001517 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001518 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001519 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001520 newline = ''
1521
1522
Guido van Rossumd8faa362007-04-27 19:54:29 +00001523class NetworkConnectionTest(object):
1524 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001525
Guido van Rossumd8faa362007-04-27 19:54:29 +00001526 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001527 # We're inherited below by BasicTCPTest2, which also inherits
1528 # BasicTCPTest, which defines self.port referenced below.
1529 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001530 self.serv_conn = self.cli
1531
1532class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1533 """Tests that NetworkConnection does not break existing TCP functionality.
1534 """
1535
1536class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001537
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001538 class MockSocket(socket.socket):
1539 def connect(self, *args):
1540 raise socket.timeout('timed out')
1541
1542 @contextlib.contextmanager
1543 def mocked_socket_module(self):
1544 """Return a socket which times out on connect"""
1545 old_socket = socket.socket
1546 socket.socket = self.MockSocket
1547 try:
1548 yield
1549 finally:
1550 socket.socket = old_socket
1551
1552 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001553 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001554 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001555 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001556 with self.assertRaises(socket.error) as cm:
1557 cli.connect((HOST, port))
1558 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1559
1560 def test_create_connection(self):
1561 # Issue #9792: errors raised by create_connection() should have
1562 # a proper errno attribute.
1563 port = support.find_unused_port()
1564 with self.assertRaises(socket.error) as cm:
1565 socket.create_connection((HOST, port))
1566 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1567
1568 def test_create_connection_timeout(self):
1569 # Issue #9792: create_connection() should not recast timeout errors
1570 # as generic socket errors.
1571 with self.mocked_socket_module():
1572 with self.assertRaises(socket.timeout):
1573 socket.create_connection((HOST, 1234))
1574
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575
Victor Stinner45df8202010-04-28 22:31:17 +00001576@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001577class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1578
1579 def __init__(self, methodName='runTest'):
1580 SocketTCPTest.__init__(self, methodName=methodName)
1581 ThreadableTest.__init__(self)
1582
1583 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001584 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001585
1586 def clientTearDown(self):
1587 self.cli.close()
1588 self.cli = None
1589 ThreadableTest.clientTearDown(self)
1590
1591 def _justAccept(self):
1592 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001593 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001594
1595 testFamily = _justAccept
1596 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001597 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001598 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001599 self.assertEqual(self.cli.family, 2)
1600
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001601 testSourceAddress = _justAccept
1602 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001603 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1604 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001605 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001606 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001607 # The port number being used is sufficient to show that the bind()
1608 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001609
Guido van Rossumd8faa362007-04-27 19:54:29 +00001610 testTimeoutDefault = _justAccept
1611 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001612 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001613 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001614 socket.setdefaulttimeout(42)
1615 try:
1616 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001617 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001618 finally:
1619 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001620 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001621
1622 testTimeoutNone = _justAccept
1623 def _testTimeoutNone(self):
1624 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001625 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001626 socket.setdefaulttimeout(30)
1627 try:
1628 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001629 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001630 finally:
1631 socket.setdefaulttimeout(None)
1632 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001633
1634 testTimeoutValueNamed = _justAccept
1635 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001636 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001637 self.assertEqual(self.cli.gettimeout(), 30)
1638
1639 testTimeoutValueNonamed = _justAccept
1640 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001641 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001642 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001643 self.assertEqual(self.cli.gettimeout(), 30)
1644
Victor Stinner45df8202010-04-28 22:31:17 +00001645@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001646class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1647
1648 def __init__(self, methodName='runTest'):
1649 SocketTCPTest.__init__(self, methodName=methodName)
1650 ThreadableTest.__init__(self)
1651
1652 def clientSetUp(self):
1653 pass
1654
1655 def clientTearDown(self):
1656 self.cli.close()
1657 self.cli = None
1658 ThreadableTest.clientTearDown(self)
1659
1660 def testInsideTimeout(self):
1661 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001662 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001663 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001664 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001665 testOutsideTimeout = testInsideTimeout
1666
1667 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001668 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001669 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001670 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001671
1672 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001673 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001674 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001675
1676
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001677class TCPTimeoutTest(SocketTCPTest):
1678
1679 def testTCPTimeout(self):
1680 def raise_timeout(*args, **kwargs):
1681 self.serv.settimeout(1.0)
1682 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001683 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001684 "Error generating a timeout exception (TCP)")
1685
1686 def testTimeoutZero(self):
1687 ok = False
1688 try:
1689 self.serv.settimeout(0.0)
1690 foo = self.serv.accept()
1691 except socket.timeout:
1692 self.fail("caught timeout instead of error (TCP)")
1693 except socket.error:
1694 ok = True
1695 except:
1696 self.fail("caught unexpected exception (TCP)")
1697 if not ok:
1698 self.fail("accept() returned success when we did not expect it")
1699
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001700 def testInterruptedTimeout(self):
1701 # XXX I don't know how to do this test on MSWindows or any other
1702 # plaform that doesn't support signal.alarm() or os.kill(), though
1703 # the bug should have existed on all platforms.
1704 if not hasattr(signal, "alarm"):
1705 return # can only test on *nix
1706 self.serv.settimeout(5.0) # must be longer than alarm
1707 class Alarm(Exception):
1708 pass
1709 def alarm_handler(signal, frame):
1710 raise Alarm
1711 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1712 try:
1713 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1714 try:
1715 foo = self.serv.accept()
1716 except socket.timeout:
1717 self.fail("caught timeout instead of Alarm")
1718 except Alarm:
1719 pass
1720 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001721 self.fail("caught other exception instead of Alarm:"
1722 " %s(%s):\n%s" %
1723 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001724 else:
1725 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001726 finally:
1727 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001728 except Alarm:
1729 self.fail("got Alarm in wrong place")
1730 finally:
1731 # no alarm can be pending. Safe to restore old handler.
1732 signal.signal(signal.SIGALRM, old_alarm)
1733
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001734class UDPTimeoutTest(SocketTCPTest):
1735
1736 def testUDPTimeout(self):
1737 def raise_timeout(*args, **kwargs):
1738 self.serv.settimeout(1.0)
1739 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001740 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001741 "Error generating a timeout exception (UDP)")
1742
1743 def testTimeoutZero(self):
1744 ok = False
1745 try:
1746 self.serv.settimeout(0.0)
1747 foo = self.serv.recv(1024)
1748 except socket.timeout:
1749 self.fail("caught timeout instead of error (UDP)")
1750 except socket.error:
1751 ok = True
1752 except:
1753 self.fail("caught unexpected exception (UDP)")
1754 if not ok:
1755 self.fail("recv() returned success when we did not expect it")
1756
1757class TestExceptions(unittest.TestCase):
1758
1759 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001760 self.assertTrue(issubclass(socket.error, Exception))
1761 self.assertTrue(issubclass(socket.herror, socket.error))
1762 self.assertTrue(issubclass(socket.gaierror, socket.error))
1763 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001764
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001765class TestLinuxAbstractNamespace(unittest.TestCase):
1766
1767 UNIX_PATH_MAX = 108
1768
1769 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001770 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001771 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1772 s1.bind(address)
1773 s1.listen(1)
1774 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1775 s2.connect(s1.getsockname())
1776 with s1.accept()[0] as s3:
1777 self.assertEqual(s1.getsockname(), address)
1778 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001779
1780 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001781 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001782 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1783 s.bind(address)
1784 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001785
1786 def testNameOverflow(self):
1787 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001788 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1789 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001790
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001791
Victor Stinner45df8202010-04-28 22:31:17 +00001792@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001793class BufferIOTest(SocketConnectedTest):
1794 """
1795 Test the buffer versions of socket.recv() and socket.send().
1796 """
1797 def __init__(self, methodName='runTest'):
1798 SocketConnectedTest.__init__(self, methodName=methodName)
1799
Antoine Pitrou25480782010-03-17 22:50:28 +00001800 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001801 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001802 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001803 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001804 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001805 self.assertEqual(msg, MSG)
1806
Antoine Pitrou25480782010-03-17 22:50:28 +00001807 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001808 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001809 self.serv_conn.send(buf)
1810
Antoine Pitrou25480782010-03-17 22:50:28 +00001811 def testRecvIntoBytearray(self):
1812 buf = bytearray(1024)
1813 nbytes = self.cli_conn.recv_into(buf)
1814 self.assertEqual(nbytes, len(MSG))
1815 msg = buf[:len(MSG)]
1816 self.assertEqual(msg, MSG)
1817
1818 _testRecvIntoBytearray = _testRecvIntoArray
1819
1820 def testRecvIntoMemoryview(self):
1821 buf = bytearray(1024)
1822 nbytes = self.cli_conn.recv_into(memoryview(buf))
1823 self.assertEqual(nbytes, len(MSG))
1824 msg = buf[:len(MSG)]
1825 self.assertEqual(msg, MSG)
1826
1827 _testRecvIntoMemoryview = _testRecvIntoArray
1828
1829 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001830 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001831 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001832 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001833 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001834 self.assertEqual(msg, MSG)
1835
Antoine Pitrou25480782010-03-17 22:50:28 +00001836 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001837 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001838 self.serv_conn.send(buf)
1839
Antoine Pitrou25480782010-03-17 22:50:28 +00001840 def testRecvFromIntoBytearray(self):
1841 buf = bytearray(1024)
1842 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1843 self.assertEqual(nbytes, len(MSG))
1844 msg = buf[:len(MSG)]
1845 self.assertEqual(msg, MSG)
1846
1847 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1848
1849 def testRecvFromIntoMemoryview(self):
1850 buf = bytearray(1024)
1851 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1852 self.assertEqual(nbytes, len(MSG))
1853 msg = buf[:len(MSG)]
1854 self.assertEqual(msg, MSG)
1855
1856 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1857
Christian Heimes043d6f62008-01-07 17:19:16 +00001858
1859TIPC_STYPE = 2000
1860TIPC_LOWER = 200
1861TIPC_UPPER = 210
1862
1863def isTipcAvailable():
1864 """Check if the TIPC module is loaded
1865
1866 The TIPC module is not loaded automatically on Ubuntu and probably
1867 other Linux distros.
1868 """
1869 if not hasattr(socket, "AF_TIPC"):
1870 return False
1871 if not os.path.isfile("/proc/modules"):
1872 return False
1873 with open("/proc/modules") as f:
1874 for line in f:
1875 if line.startswith("tipc "):
1876 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001877 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001878 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1879 return False
1880
1881class TIPCTest (unittest.TestCase):
1882 def testRDM(self):
1883 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1884 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1885
1886 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1887 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1888 TIPC_LOWER, TIPC_UPPER)
1889 srv.bind(srvaddr)
1890
1891 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1892 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1893 cli.sendto(MSG, sendaddr)
1894
1895 msg, recvaddr = srv.recvfrom(1024)
1896
1897 self.assertEqual(cli.getsockname(), recvaddr)
1898 self.assertEqual(msg, MSG)
1899
1900
1901class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1902 def __init__(self, methodName = 'runTest'):
1903 unittest.TestCase.__init__(self, methodName = methodName)
1904 ThreadableTest.__init__(self)
1905
1906 def setUp(self):
1907 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1908 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1909 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1910 TIPC_LOWER, TIPC_UPPER)
1911 self.srv.bind(srvaddr)
1912 self.srv.listen(5)
1913 self.serverExplicitReady()
1914 self.conn, self.connaddr = self.srv.accept()
1915
1916 def clientSetUp(self):
1917 # The is a hittable race between serverExplicitReady() and the
1918 # accept() call; sleep a little while to avoid it, otherwise
1919 # we could get an exception
1920 time.sleep(0.1)
1921 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1922 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1923 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1924 self.cli.connect(addr)
1925 self.cliaddr = self.cli.getsockname()
1926
1927 def testStream(self):
1928 msg = self.conn.recv(1024)
1929 self.assertEqual(msg, MSG)
1930 self.assertEqual(self.cliaddr, self.connaddr)
1931
1932 def _testStream(self):
1933 self.cli.send(MSG)
1934 self.cli.close()
1935
1936
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001937@unittest.skipUnless(thread, 'Threading required for this test.')
1938class ContextManagersTest(ThreadedTCPSocketTest):
1939
1940 def _testSocketClass(self):
1941 # base test
1942 with socket.socket() as sock:
1943 self.assertFalse(sock._closed)
1944 self.assertTrue(sock._closed)
1945 # close inside with block
1946 with socket.socket() as sock:
1947 sock.close()
1948 self.assertTrue(sock._closed)
1949 # exception inside with block
1950 with socket.socket() as sock:
1951 self.assertRaises(socket.error, sock.sendall, b'foo')
1952 self.assertTrue(sock._closed)
1953
1954 def testCreateConnectionBase(self):
1955 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001956 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001957 data = conn.recv(1024)
1958 conn.sendall(data)
1959
1960 def _testCreateConnectionBase(self):
1961 address = self.serv.getsockname()
1962 with socket.create_connection(address) as sock:
1963 self.assertFalse(sock._closed)
1964 sock.sendall(b'foo')
1965 self.assertEqual(sock.recv(1024), b'foo')
1966 self.assertTrue(sock._closed)
1967
1968 def testCreateConnectionClose(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 _testCreateConnectionClose(self):
1975 address = self.serv.getsockname()
1976 with socket.create_connection(address) as sock:
1977 sock.close()
1978 self.assertTrue(sock._closed)
1979 self.assertRaises(socket.error, sock.sendall, b'foo')
1980
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001981
Antoine Pitroub1c54962010-10-14 15:05:38 +00001982@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1983 "SOCK_CLOEXEC not defined")
1984@unittest.skipUnless(fcntl, "module fcntl not available")
1985class CloexecConstantTest(unittest.TestCase):
1986 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001987 v = linux_version()
1988 if v < (2, 6, 28):
1989 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1990 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00001991 with socket.socket(socket.AF_INET,
1992 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
1993 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1994 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001995
1996
1997@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1998 "SOCK_NONBLOCK not defined")
1999class NonblockConstantTest(unittest.TestCase):
2000 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2001 if nonblock:
2002 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2003 self.assertEqual(s.gettimeout(), timeout)
2004 else:
2005 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2006 self.assertEqual(s.gettimeout(), None)
2007
2008 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002009 v = linux_version()
2010 if v < (2, 6, 28):
2011 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2012 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002013 # a lot of it seems silly and redundant, but I wanted to test that
2014 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002015 with socket.socket(socket.AF_INET,
2016 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2017 self.checkNonblock(s)
2018 s.setblocking(1)
2019 self.checkNonblock(s, False)
2020 s.setblocking(0)
2021 self.checkNonblock(s)
2022 s.settimeout(None)
2023 self.checkNonblock(s, False)
2024 s.settimeout(2.0)
2025 self.checkNonblock(s, timeout=2.0)
2026 s.setblocking(1)
2027 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002028 # defaulttimeout
2029 t = socket.getdefaulttimeout()
2030 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002031 with socket.socket() as s:
2032 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002033 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002034 with socket.socket() as s:
2035 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002036 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002037 with socket.socket() as s:
2038 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002039 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002040 with socket.socket() as s:
2041 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002042 socket.setdefaulttimeout(t)
2043
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002044
Guido van Rossumb995eb72002-07-31 16:08:40 +00002045def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002046 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002047 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002048
2049 tests.extend([
2050 NonBlockingTCPTests,
2051 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002052 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002053 UnbufferedFileObjectClassTestCase,
2054 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002055 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002056 UnicodeReadFileObjectClassTestCase,
2057 UnicodeWriteFileObjectClassTestCase,
2058 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002059 NetworkConnectionNoServer,
2060 NetworkConnectionAttributesTest,
2061 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002062 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002063 CloexecConstantTest,
2064 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002065 ])
Dave Cole331708b2004-08-09 04:51:41 +00002066 if hasattr(socket, "socketpair"):
2067 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002068 if sys.platform == 'linux2':
2069 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002070 if isTipcAvailable():
2071 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002072 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002073
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002074 thread_info = support.threading_setup()
2075 support.run_unittest(*tests)
2076 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002077
2078if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002079 test_main()