blob: c811ec445cfdc09a7ae2c625123f576c1a1f298c [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Antoine Pitroub1c54962010-10-14 15:05:38 +000022try:
23 import fcntl
24except ImportError:
25 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000026
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000027def linux_version():
28 try:
29 # platform.release() is something like '2.6.33.7-desktop-2mnb'
30 version_string = platform.release().split('-')[0]
31 return tuple(map(int, version_string.split('.')))
32 except ValueError:
33 return 0, 0, 0
34
Benjamin Petersonee8712c2008-05-20 21:35:26 +000035HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000036MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
Victor Stinner45df8202010-04-28 22:31:17 +000038try:
39 import _thread as thread
40 import threading
41except ImportError:
42 thread = None
43 threading = None
44
Guido van Rossum24e4af82002-06-12 19:18:08 +000045class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000046
Guido van Rossum24e4af82002-06-12 19:18:08 +000047 def setUp(self):
48 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000049 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000050 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000051
Guido van Rossum24e4af82002-06-12 19:18:08 +000052 def tearDown(self):
53 self.serv.close()
54 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000055
Guido van Rossum24e4af82002-06-12 19:18:08 +000056class SocketUDPTest(unittest.TestCase):
57
58 def setUp(self):
59 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000060 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000061
62 def tearDown(self):
63 self.serv.close()
64 self.serv = None
65
66class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000067 """Threadable Test class
68
69 The ThreadableTest class makes it easy to create a threaded
70 client/server pair from an existing unit test. To create a
71 new threaded class from an existing unit test, use multiple
72 inheritance:
73
74 class NewClass (OldClass, ThreadableTest):
75 pass
76
77 This class defines two new fixture functions with obvious
78 purposes for overriding:
79
80 clientSetUp ()
81 clientTearDown ()
82
83 Any new test functions within the class must then define
84 tests in pairs, where the test name is preceeded with a
85 '_' to indicate the client portion of the test. Ex:
86
87 def testFoo(self):
88 # Server portion
89
90 def _testFoo(self):
91 # Client portion
92
93 Any exceptions raised by the clients during their tests
94 are caught and transferred to the main thread to alert
95 the testing framework.
96
97 Note, the server setup function cannot call any blocking
98 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000099 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000100 the blocking call (such as in setting up a client/server
101 connection and performing the accept() in setUp().
102 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000103
104 def __init__(self):
105 # Swap the true setup function
106 self.__setUp = self.setUp
107 self.__tearDown = self.tearDown
108 self.setUp = self._setUp
109 self.tearDown = self._tearDown
110
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 def serverExplicitReady(self):
112 """This method allows the server to explicitly indicate that
113 it wants the client thread to proceed. This is useful if the
114 server is about to execute a blocking routine that is
115 dependent upon the client thread during its setup routine."""
116 self.server_ready.set()
117
Guido van Rossum24e4af82002-06-12 19:18:08 +0000118 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000119 self.server_ready = threading.Event()
120 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000122 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123
124 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000125 methodname = self.id()
126 i = methodname.rfind('.')
127 methodname = methodname[i+1:]
128 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000129 self.client_thread = thread.start_new_thread(
130 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000131
132 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000133 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000134 self.server_ready.set()
135 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 def _tearDown(self):
138 self.__tearDown()
139 self.done.wait()
140
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000141 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000142 exc = self.queue.get()
143 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000144
145 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.wait()
147 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000149 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000150 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000151 try:
152 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000153 except BaseException as e:
154 self.queue.put(e)
155 finally:
156 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000157
158 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000159 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160
161 def clientTearDown(self):
162 self.done.set()
163 thread.exit()
164
165class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
166
167 def __init__(self, methodName='runTest'):
168 SocketTCPTest.__init__(self, methodName=methodName)
169 ThreadableTest.__init__(self)
170
171 def clientSetUp(self):
172 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
173
174 def clientTearDown(self):
175 self.cli.close()
176 self.cli = None
177 ThreadableTest.clientTearDown(self)
178
179class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
180
181 def __init__(self, methodName='runTest'):
182 SocketUDPTest.__init__(self, methodName=methodName)
183 ThreadableTest.__init__(self)
184
185 def clientSetUp(self):
186 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
187
Brian Curtin3beb38f2010-11-04 03:41:43 +0000188 def clientTearDown(self):
189 self.cli.close()
190 self.cli = None
191 ThreadableTest.clientTearDown(self)
192
Guido van Rossum24e4af82002-06-12 19:18:08 +0000193class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000194 """Socket tests for client-server connection.
195
196 self.cli_conn is a client socket connected to the server. The
197 setUp() method guarantees that it is connected to the server.
198 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000199
200 def __init__(self, methodName='runTest'):
201 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
202
203 def setUp(self):
204 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000205 # Indicate explicitly we're ready for the client thread to
206 # proceed and then perform the blocking call to accept
207 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000208 conn, addr = self.serv.accept()
209 self.cli_conn = conn
210
211 def tearDown(self):
212 self.cli_conn.close()
213 self.cli_conn = None
214 ThreadedTCPSocketTest.tearDown(self)
215
216 def clientSetUp(self):
217 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000218 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000219 self.serv_conn = self.cli
220
221 def clientTearDown(self):
222 self.serv_conn.close()
223 self.serv_conn = None
224 ThreadedTCPSocketTest.clientTearDown(self)
225
Dave Cole331708b2004-08-09 04:51:41 +0000226class SocketPairTest(unittest.TestCase, ThreadableTest):
227
228 def __init__(self, methodName='runTest'):
229 unittest.TestCase.__init__(self, methodName=methodName)
230 ThreadableTest.__init__(self)
231
232 def setUp(self):
233 self.serv, self.cli = socket.socketpair()
234
235 def tearDown(self):
236 self.serv.close()
237 self.serv = None
238
239 def clientSetUp(self):
240 pass
241
242 def clientTearDown(self):
243 self.cli.close()
244 self.cli = None
245 ThreadableTest.clientTearDown(self)
246
Tim Peters494aaee2004-08-09 18:54:11 +0000247
Guido van Rossum24e4af82002-06-12 19:18:08 +0000248#######################################################################
249## Begin Tests
250
251class GeneralModuleTests(unittest.TestCase):
252
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000253 def test_repr(self):
254 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000255 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000256 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000257
Raymond Hettinger027bb632004-05-31 03:09:25 +0000258 def test_weakref(self):
259 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
260 p = proxy(s)
261 self.assertEqual(p.fileno(), s.fileno())
262 s.close()
263 s = None
264 try:
265 p.fileno()
266 except ReferenceError:
267 pass
268 else:
269 self.fail('Socket proxy still exists')
270
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000272 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300273 msg = "Error raising socket exception (%s)."
274 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300276 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300278 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280
Ezio Melotti63e42302011-05-07 19:47:48 +0300281 def testSendtoErrors(self):
282 # Testing that sendto doens't masks failures. See #10169.
283 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
284 self.addCleanup(s.close)
285 s.bind(('', 0))
286 sockname = s.getsockname()
287 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300288 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300289 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300290 self.assertEqual(str(cm.exception),
291 "'str' does not support the buffer interface")
292 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300293 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300294 self.assertEqual(str(cm.exception),
295 "'complex' does not support the buffer interface")
296 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300297 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300298 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300299 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300300 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300301 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300302 self.assertEqual(str(cm.exception),
303 "'str' does not support the buffer interface")
304 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300305 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300306 self.assertEqual(str(cm.exception),
307 "'complex' does not support the buffer interface")
308 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300309 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300310 self.assertIn('not NoneType', str(cm.exception))
311 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300312 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300313 self.assertIn('an integer is required', str(cm.exception))
314 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300315 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300316 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300317 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300318 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300319 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300320 self.assertIn('(1 given)', str(cm.exception))
321 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300322 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300323 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300324
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000326 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000327 socket.AF_INET
328 socket.SOCK_STREAM
329 socket.SOCK_DGRAM
330 socket.SOCK_RAW
331 socket.SOCK_RDM
332 socket.SOCK_SEQPACKET
333 socket.SOL_SOCKET
334 socket.SO_REUSEADDR
335
Guido van Rossum654c11e2002-06-13 20:24:17 +0000336 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000337 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000338 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000339 try:
340 ip = socket.gethostbyname(hostname)
341 except socket.error:
342 # Probably name lookup wasn't set up right; skip this test
343 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000344 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000345 try:
346 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
347 except socket.error:
348 # Probably a similar problem as above; skip this test
349 return
Brett Cannon01668a12005-03-11 00:04:17 +0000350 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000351 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000352 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000353 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000354
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000355 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
356 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
357 def test_sethostname(self):
358 oldhn = socket.gethostname()
359 try:
360 socket.sethostname('new')
361 except socket.error as e:
362 if e.errno == errno.EPERM:
363 self.skipTest("test should be run as root")
364 else:
365 raise
366 try:
367 # running test as root!
368 self.assertEqual(socket.gethostname(), 'new')
369 # Should work with bytes objects too
370 socket.sethostname(b'bar')
371 self.assertEqual(socket.gethostname(), 'bar')
372 finally:
373 socket.sethostname(oldhn)
374
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000375 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000376 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000377 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378 try:
379 # On some versions, this loses a reference
380 orig = sys.getrefcount(__name__)
381 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000382 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000383 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000385
Guido van Rossum24e4af82002-06-12 19:18:08 +0000386 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000387 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000388 try:
389 # On some versions, this crashes the interpreter.
390 socket.getnameinfo(('x', 0, 0, 0), 0)
391 except socket.error:
392 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000393
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000394 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000395 # This just checks that htons etc. are their own inverse,
396 # when looking at the lower 16 or 32 bits.
397 sizes = {socket.htonl: 32, socket.ntohl: 32,
398 socket.htons: 16, socket.ntohs: 16}
399 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000400 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000401 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
402 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000403
Guido van Rossuma2627af2002-09-14 00:58:46 +0000404 swapped = func(mask)
405 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000406 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000407
Guido van Rossum018919a2007-01-15 00:07:32 +0000408 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000409 good_values = [ 1, 2, 3, 1, 2, 3 ]
410 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000411 for k in good_values:
412 socket.ntohl(k)
413 socket.ntohs(k)
414 socket.htonl(k)
415 socket.htons(k)
416 for k in bad_values:
417 self.assertRaises(OverflowError, socket.ntohl, k)
418 self.assertRaises(OverflowError, socket.ntohs, k)
419 self.assertRaises(OverflowError, socket.htonl, k)
420 self.assertRaises(OverflowError, socket.htons, k)
421
Barry Warsaw11b91a02004-06-28 00:50:43 +0000422 def testGetServBy(self):
423 eq = self.assertEqual
424 # Find one service that exists, then check all the related interfaces.
425 # I've ordered this by protocols that have both a tcp and udp
426 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000427 if (sys.platform.startswith('linux') or
428 sys.platform.startswith('freebsd') or
429 sys.platform.startswith('netbsd') or
430 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000431 # avoid the 'echo' service on this platform, as there is an
432 # assumption breaking non-standard port/protocol entry
433 services = ('daytime', 'qotd', 'domain')
434 else:
435 services = ('echo', 'daytime', 'domain')
436 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000437 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000438 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000439 break
440 except socket.error:
441 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000442 else:
443 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000444 # Try same call with optional protocol omitted
445 port2 = socket.getservbyname(service)
446 eq(port, port2)
447 # Try udp, but don't barf it it doesn't exist
448 try:
449 udpport = socket.getservbyname(service, 'udp')
450 except socket.error:
451 udpport = None
452 else:
453 eq(udpport, port)
454 # Now make sure the lookup by port returns the same service name
455 eq(socket.getservbyport(port2), service)
456 eq(socket.getservbyport(port, 'tcp'), service)
457 if udpport is not None:
458 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000459 # Make sure getservbyport does not accept out of range ports.
460 self.assertRaises(OverflowError, socket.getservbyport, -1)
461 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000462
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000463 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000464 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000465 # The default timeout should initially be None
466 self.assertEqual(socket.getdefaulttimeout(), None)
467 s = socket.socket()
468 self.assertEqual(s.gettimeout(), None)
469 s.close()
470
471 # Set the default timeout to 10, and see if it propagates
472 socket.setdefaulttimeout(10)
473 self.assertEqual(socket.getdefaulttimeout(), 10)
474 s = socket.socket()
475 self.assertEqual(s.gettimeout(), 10)
476 s.close()
477
478 # Reset the default timeout to None, and see if it propagates
479 socket.setdefaulttimeout(None)
480 self.assertEqual(socket.getdefaulttimeout(), None)
481 s = socket.socket()
482 self.assertEqual(s.gettimeout(), None)
483 s.close()
484
485 # Check that setting it to an invalid value raises ValueError
486 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
487
488 # Check that setting it to an invalid type raises TypeError
489 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
490
Benjamin Petersonf91df042009-02-13 02:50:59 +0000491 def testIPv4_inet_aton_fourbytes(self):
492 if not hasattr(socket, 'inet_aton'):
493 return # No inet_aton, nothing to check
494 # Test that issue1008086 and issue767150 are fixed.
495 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000496 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
497 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000498
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000499 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000500 if not hasattr(socket, 'inet_pton'):
501 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000502 from socket import inet_aton as f, inet_pton, AF_INET
503 g = lambda a: inet_pton(AF_INET, a)
504
Ezio Melottib3aedd42010-11-20 19:04:17 +0000505 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
506 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
507 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
508 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
509 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000510
Ezio Melottib3aedd42010-11-20 19:04:17 +0000511 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
512 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
513 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
514 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000515
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000516 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000517 if not hasattr(socket, 'inet_pton'):
518 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000519 try:
520 from socket import inet_pton, AF_INET6, has_ipv6
521 if not has_ipv6:
522 return
523 except ImportError:
524 return
525 f = lambda a: inet_pton(AF_INET6, a)
526
Ezio Melottib3aedd42010-11-20 19:04:17 +0000527 self.assertEqual(b'\x00' * 16, f('::'))
528 self.assertEqual(b'\x00' * 16, f('0::0'))
529 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
530 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000531 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000532 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
533 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000534
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000535 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000536 if not hasattr(socket, 'inet_ntop'):
537 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000538 from socket import inet_ntoa as f, inet_ntop, AF_INET
539 g = lambda a: inet_ntop(AF_INET, a)
540
Ezio Melottib3aedd42010-11-20 19:04:17 +0000541 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
542 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
543 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
544 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000545
Ezio Melottib3aedd42010-11-20 19:04:17 +0000546 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
547 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
548 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000549
550 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000551 if not hasattr(socket, 'inet_ntop'):
552 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000553 try:
554 from socket import inet_ntop, AF_INET6, has_ipv6
555 if not has_ipv6:
556 return
557 except ImportError:
558 return
559 f = lambda a: inet_ntop(AF_INET6, a)
560
Ezio Melottib3aedd42010-11-20 19:04:17 +0000561 self.assertEqual('::', f(b'\x00' * 16))
562 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
563 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000564 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000565 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000566 )
567
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000568 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000569
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000570 def _get_unused_port(self, bind_address='0.0.0.0'):
571 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000572
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000573 Args:
574 bind_address: Hostname or IP address to search for a port on.
575
576 Returns: A most likely to be unused port.
577 """
578 tempsock = socket.socket()
579 tempsock.bind((bind_address, 0))
580 host, port = tempsock.getsockname()
581 tempsock.close()
582 return port
583
584 def testSockName(self):
585 # Testing getsockname()
586 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000588 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000589 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000591 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
592 # it reasonable to get the host's addr in addition to 0.0.0.0.
593 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000594 try:
595 my_ip_addr = socket.gethostbyname(socket.gethostname())
596 except socket.error:
597 # Probably name lookup wasn't set up right; skip this test
598 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000599 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000600 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000601
602 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000603 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 # We know a socket should start without reuse==0
605 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000606 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000607 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000608 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000609
610 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000611 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000612 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000613 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
615 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000616 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000618 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000619 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000620 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
621 sock.settimeout(1)
622 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000623 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000624
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000625 def testNewAttributes(self):
626 # testing .family, .type and .protocol
627 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
628 self.assertEqual(sock.family, socket.AF_INET)
629 self.assertEqual(sock.type, socket.SOCK_STREAM)
630 self.assertEqual(sock.proto, 0)
631 sock.close()
632
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000633 def test_getsockaddrarg(self):
634 host = '0.0.0.0'
635 port = self._get_unused_port(bind_address=host)
636 big_port = port + 65536
637 neg_port = port - 65536
638 sock = socket.socket()
639 try:
640 self.assertRaises(OverflowError, sock.bind, (host, big_port))
641 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
642 sock.bind((host, port))
643 finally:
644 sock.close()
645
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000646 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000647 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000648 self.assertTrue(hasattr(socket.socket, 'ioctl'))
649 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
650 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
651 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000652 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
653 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000654 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000655 self.assertRaises(ValueError, s.ioctl, -1, None)
656 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000657
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000658 def testGetaddrinfo(self):
659 try:
660 socket.getaddrinfo('localhost', 80)
661 except socket.gaierror as err:
662 if err.errno == socket.EAI_SERVICE:
663 # see http://bugs.python.org/issue1282647
664 self.skipTest("buggy libc version")
665 raise
666 # len of every sequence is supposed to be == 5
667 for info in socket.getaddrinfo(HOST, None):
668 self.assertEqual(len(info), 5)
669 # host can be a domain name, a string representation of an
670 # IPv4/v6 address or None
671 socket.getaddrinfo('localhost', 80)
672 socket.getaddrinfo('127.0.0.1', 80)
673 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200674 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000675 socket.getaddrinfo('::1', 80)
676 # port can be a string service name such as "http", a numeric
677 # port number or None
678 socket.getaddrinfo(HOST, "http")
679 socket.getaddrinfo(HOST, 80)
680 socket.getaddrinfo(HOST, None)
681 # test family and socktype filters
682 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
683 for family, _, _, _, _ in infos:
684 self.assertEqual(family, socket.AF_INET)
685 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
686 for _, socktype, _, _, _ in infos:
687 self.assertEqual(socktype, socket.SOCK_STREAM)
688 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000689 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000690 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
691 # a server willing to support both IPv4 and IPv6 will
692 # usually do this
693 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
694 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000695 # test keyword arguments
696 a = socket.getaddrinfo(HOST, None)
697 b = socket.getaddrinfo(host=HOST, port=None)
698 self.assertEqual(a, b)
699 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
700 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
701 self.assertEqual(a, b)
702 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
703 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
704 self.assertEqual(a, b)
705 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
706 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
707 self.assertEqual(a, b)
708 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
709 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
710 self.assertEqual(a, b)
711 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
712 socket.AI_PASSIVE)
713 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
714 type=socket.SOCK_STREAM, proto=0,
715 flags=socket.AI_PASSIVE)
716 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000717 # Issue #6697.
718 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000719
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000720 def test_getnameinfo(self):
721 # only IP addresses are allowed
722 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
723
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000724 @unittest.skipUnless(support.is_resource_enabled('network'),
725 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000726 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000727 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000728 # these should all be successful
729 socket.gethostbyname('испытание.python.org')
730 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000731 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
732 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
733 # have a reverse entry yet
734 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000735
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000736 def check_sendall_interrupted(self, with_timeout):
737 # socketpair() is not stricly required, but it makes things easier.
738 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
739 self.skipTest("signal.alarm and socket.socketpair required for this test")
740 # Our signal handlers clobber the C errno by calling a math function
741 # with an invalid domain value.
742 def ok_handler(*args):
743 self.assertRaises(ValueError, math.acosh, 0)
744 def raising_handler(*args):
745 self.assertRaises(ValueError, math.acosh, 0)
746 1 // 0
747 c, s = socket.socketpair()
748 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
749 try:
750 if with_timeout:
751 # Just above the one second minimum for signal.alarm
752 c.settimeout(1.5)
753 with self.assertRaises(ZeroDivisionError):
754 signal.alarm(1)
755 c.sendall(b"x" * (1024**2))
756 if with_timeout:
757 signal.signal(signal.SIGALRM, ok_handler)
758 signal.alarm(1)
759 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
760 finally:
761 signal.signal(signal.SIGALRM, old_alarm)
762 c.close()
763 s.close()
764
765 def test_sendall_interrupted(self):
766 self.check_sendall_interrupted(False)
767
768 def test_sendall_interrupted_with_timeout(self):
769 self.check_sendall_interrupted(True)
770
Antoine Pitroue033e062010-10-29 10:38:18 +0000771 def test_dealloc_warn(self):
772 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
773 r = repr(sock)
774 with self.assertWarns(ResourceWarning) as cm:
775 sock = None
776 support.gc_collect()
777 self.assertIn(r, str(cm.warning.args[0]))
778 # An open socket file object gets dereferenced after the socket
779 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
780 f = sock.makefile('rb')
781 r = repr(sock)
782 sock = None
783 support.gc_collect()
784 with self.assertWarns(ResourceWarning):
785 f = None
786 support.gc_collect()
787
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000788 def test_name_closed_socketio(self):
789 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
790 fp = sock.makefile("rb")
791 fp.close()
792 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
793
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100794 def test_pickle(self):
795 sock = socket.socket()
796 with sock:
797 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
798 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
799
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000800
Victor Stinner45df8202010-04-28 22:31:17 +0000801@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802class BasicTCPTest(SocketConnectedTest):
803
804 def __init__(self, methodName='runTest'):
805 SocketConnectedTest.__init__(self, methodName=methodName)
806
807 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000808 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000810 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811
812 def _testRecv(self):
813 self.serv_conn.send(MSG)
814
815 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000816 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817 seg1 = self.cli_conn.recv(len(MSG) - 3)
818 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000819 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000820 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821
822 def _testOverFlowRecv(self):
823 self.serv_conn.send(MSG)
824
825 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000826 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000827 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000828 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829
830 def _testRecvFrom(self):
831 self.serv_conn.send(MSG)
832
833 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000834 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000835 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
836 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000837 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000838 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000839
840 def _testOverFlowRecvFrom(self):
841 self.serv_conn.send(MSG)
842
843 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000844 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000845 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 while 1:
847 read = self.cli_conn.recv(1024)
848 if not read:
849 break
Guido van Rossume531e292002-08-08 20:28:34 +0000850 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000851 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852
853 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000854 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855 self.serv_conn.sendall(big_chunk)
856
857 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859 fd = self.cli_conn.fileno()
860 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000861 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000862 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000864 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865
866 def _testFromFd(self):
867 self.serv_conn.send(MSG)
868
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000869 def testDup(self):
870 # Testing dup()
871 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000872 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000873 msg = sock.recv(1024)
874 self.assertEqual(msg, MSG)
875
876 def _testDup(self):
877 self.serv_conn.send(MSG)
878
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000880 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000881 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000882 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000883 # wait for _testShutdown to finish: on OS X, when the server
884 # closes the connection the client also becomes disconnected,
885 # and the client's shutdown call will fail. (Issue #4397.)
886 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887
888 def _testShutdown(self):
889 self.serv_conn.send(MSG)
890 self.serv_conn.shutdown(2)
891
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000892 def testDetach(self):
893 # Testing detach()
894 fileno = self.cli_conn.fileno()
895 f = self.cli_conn.detach()
896 self.assertEqual(f, fileno)
897 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000898 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
899 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000900 # ...but we can create another socket using the (still open)
901 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000902 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000903 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000904 msg = sock.recv(1024)
905 self.assertEqual(msg, MSG)
906
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000907 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000908 self.serv_conn.send(MSG)
909
Victor Stinner45df8202010-04-28 22:31:17 +0000910@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000911class BasicUDPTest(ThreadedUDPSocketTest):
912
913 def __init__(self, methodName='runTest'):
914 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
915
916 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000917 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000918 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000919 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920
921 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000922 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923
Guido van Rossum1c938012002-06-12 21:17:20 +0000924 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000925 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000926 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000927 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000928
Guido van Rossum1c938012002-06-12 21:17:20 +0000929 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000930 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
Guido van Rossumd8faa362007-04-27 19:54:29 +0000932 def testRecvFromNegative(self):
933 # Negative lengths passed to recvfrom should give ValueError.
934 self.assertRaises(ValueError, self.serv.recvfrom, -1)
935
936 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000937 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000938
Victor Stinner45df8202010-04-28 22:31:17 +0000939@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000940class TCPCloserTest(ThreadedTCPSocketTest):
941
942 def testClose(self):
943 conn, addr = self.serv.accept()
944 conn.close()
945
946 sd = self.cli
947 read, write, err = select.select([sd], [], [], 1.0)
948 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000949 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000950
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000951 # Calling close() many times should be safe.
952 conn.close()
953 conn.close()
954
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000955 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000956 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000957 time.sleep(1.0)
958
Victor Stinner45df8202010-04-28 22:31:17 +0000959@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000960class BasicSocketPairTest(SocketPairTest):
961
962 def __init__(self, methodName='runTest'):
963 SocketPairTest.__init__(self, methodName=methodName)
964
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000965 def _check_defaults(self, sock):
966 self.assertIsInstance(sock, socket.socket)
967 if hasattr(socket, 'AF_UNIX'):
968 self.assertEqual(sock.family, socket.AF_UNIX)
969 else:
970 self.assertEqual(sock.family, socket.AF_INET)
971 self.assertEqual(sock.type, socket.SOCK_STREAM)
972 self.assertEqual(sock.proto, 0)
973
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000974 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000975 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000976
977 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000978 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000979
Dave Cole331708b2004-08-09 04:51:41 +0000980 def testRecv(self):
981 msg = self.serv.recv(1024)
982 self.assertEqual(msg, MSG)
983
984 def _testRecv(self):
985 self.cli.send(MSG)
986
987 def testSend(self):
988 self.serv.send(MSG)
989
990 def _testSend(self):
991 msg = self.cli.recv(1024)
992 self.assertEqual(msg, MSG)
993
Victor Stinner45df8202010-04-28 22:31:17 +0000994@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000995class NonBlockingTCPTests(ThreadedTCPSocketTest):
996
997 def __init__(self, methodName='runTest'):
998 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
999
1000 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001001 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001002 self.serv.setblocking(0)
1003 start = time.time()
1004 try:
1005 self.serv.accept()
1006 except socket.error:
1007 pass
1008 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001009 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001010
1011 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001012 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001013
Antoine Pitroub1c54962010-10-14 15:05:38 +00001014 if hasattr(socket, "SOCK_NONBLOCK"):
1015 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001016 v = linux_version()
1017 if v < (2, 6, 28):
1018 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1019 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001020 # reinit server socket
1021 self.serv.close()
1022 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001023 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001024 self.port = support.bind_port(self.serv)
1025 self.serv.listen(1)
1026 # actual testing
1027 start = time.time()
1028 try:
1029 self.serv.accept()
1030 except socket.error:
1031 pass
1032 end = time.time()
1033 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1034
1035 def _testInitNonBlocking(self):
1036 pass
1037
Antoine Pitrou600232b2011-01-05 21:03:42 +00001038 def testInheritFlags(self):
1039 # Issue #7995: when calling accept() on a listening socket with a
1040 # timeout, the resulting socket should not be non-blocking.
1041 self.serv.settimeout(10)
1042 try:
1043 conn, addr = self.serv.accept()
1044 message = conn.recv(len(MSG))
1045 finally:
1046 conn.close()
1047 self.serv.settimeout(None)
1048
1049 def _testInheritFlags(self):
1050 time.sleep(0.1)
1051 self.cli.connect((HOST, self.port))
1052 time.sleep(0.5)
1053 self.cli.send(MSG)
1054
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001056 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001057 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001058 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059 conn, addr = self.serv.accept()
1060 except socket.error:
1061 pass
1062 else:
1063 self.fail("Error trying to do non-blocking accept.")
1064 read, write, err = select.select([self.serv], [], [])
1065 if self.serv in read:
1066 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001067 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001068 else:
1069 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001070
Guido van Rossum24e4af82002-06-12 19:18:08 +00001071 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001072 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001073 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001074
1075 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001076 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001077 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001078 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001079
1080 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001081 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001082 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001083
1084 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001085 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001086 conn, addr = self.serv.accept()
1087 conn.setblocking(0)
1088 try:
1089 msg = conn.recv(len(MSG))
1090 except socket.error:
1091 pass
1092 else:
1093 self.fail("Error trying to do non-blocking recv.")
1094 read, write, err = select.select([conn], [], [])
1095 if conn in read:
1096 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001097 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001098 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001099 else:
1100 self.fail("Error during select call to non-blocking socket.")
1101
1102 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001103 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001104 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001105 self.cli.send(MSG)
1106
Victor Stinner45df8202010-04-28 22:31:17 +00001107@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001108class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001109 """Unit tests for the object returned by socket.makefile()
1110
Antoine Pitrou834bd812010-10-13 16:17:14 +00001111 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001112 the client connection. You can read from this file to
1113 get output from the server.
1114
Antoine Pitrou834bd812010-10-13 16:17:14 +00001115 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001116 server connection. You can write to this file to send output
1117 to the client.
1118 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001119
Guido van Rossume9f66142002-08-07 15:46:19 +00001120 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001121 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001122 errors = 'strict'
1123 newline = None
1124
1125 read_mode = 'rb'
1126 read_msg = MSG
1127 write_mode = 'wb'
1128 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001129
Guido van Rossum24e4af82002-06-12 19:18:08 +00001130 def __init__(self, methodName='runTest'):
1131 SocketConnectedTest.__init__(self, methodName=methodName)
1132
1133 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001134 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1135 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001136 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001137 self.read_file = self.cli_conn.makefile(
1138 self.read_mode, self.bufsize,
1139 encoding = self.encoding,
1140 errors = self.errors,
1141 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001142
1143 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001144 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001145 self.read_file.close()
1146 self.assertTrue(self.read_file.closed)
1147 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001148 SocketConnectedTest.tearDown(self)
1149
1150 def clientSetUp(self):
1151 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001152 self.write_file = self.serv_conn.makefile(
1153 self.write_mode, self.bufsize,
1154 encoding = self.encoding,
1155 errors = self.errors,
1156 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001157
1158 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001159 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001160 self.write_file.close()
1161 self.assertTrue(self.write_file.closed)
1162 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001163 SocketConnectedTest.clientTearDown(self)
1164
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001165 def testReadAfterTimeout(self):
1166 # Issue #7322: A file object must disallow further reads
1167 # after a timeout has occurred.
1168 self.cli_conn.settimeout(1)
1169 self.read_file.read(3)
1170 # First read raises a timeout
1171 self.assertRaises(socket.timeout, self.read_file.read, 1)
1172 # Second read is disallowed
1173 with self.assertRaises(IOError) as ctx:
1174 self.read_file.read(1)
1175 self.assertIn("cannot read from timed out object", str(ctx.exception))
1176
1177 def _testReadAfterTimeout(self):
1178 self.write_file.write(self.write_msg[0:3])
1179 self.write_file.flush()
1180 self.serv_finished.wait()
1181
Guido van Rossum24e4af82002-06-12 19:18:08 +00001182 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001183 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001184 first_seg = self.read_file.read(len(self.read_msg)-3)
1185 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001186 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001187 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001188
1189 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001190 self.write_file.write(self.write_msg)
1191 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001192
Guido van Rossum8c943832002-08-08 01:00:28 +00001193 def testFullRead(self):
1194 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001195 msg = self.read_file.read()
1196 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001197
1198 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001199 self.write_file.write(self.write_msg)
1200 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001201
Guido van Rossum24e4af82002-06-12 19:18:08 +00001202 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001203 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001204 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001205 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001206 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001207 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001208 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001209 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001210 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001211
1212 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001213 self.write_file.write(self.write_msg)
1214 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001215
1216 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001217 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001218 line = self.read_file.readline()
1219 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001220
1221 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001222 self.write_file.write(self.write_msg)
1223 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001224
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001225 def testCloseAfterMakefile(self):
1226 # The file returned by makefile should keep the socket open.
1227 self.cli_conn.close()
1228 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001229 msg = self.read_file.read()
1230 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001231
1232 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001233 self.write_file.write(self.write_msg)
1234 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001235
1236 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001237 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001238 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001239 if isinstance(self.read_msg, str):
1240 msg = msg.decode()
1241 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001242
1243 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001244 self.write_file.write(self.write_msg)
1245 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001246
Tim Peters116d83c2004-03-28 02:20:45 +00001247 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001248 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001249
1250 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001251 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001252
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001253 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001254 self.assertEqual(self.read_file.mode, self.read_mode)
1255 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001256
1257 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001258 self.assertEqual(self.write_file.mode, self.write_mode)
1259 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001260
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001261 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001262 self.read_file.close()
1263 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001264 self.cli_conn.close()
1265 self.assertRaises(socket.error, self.cli_conn.getsockname)
1266
1267 def _testRealClose(self):
1268 pass
1269
1270
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001271class FileObjectInterruptedTestCase(unittest.TestCase):
1272 """Test that the file object correctly handles EINTR internally."""
1273
1274 class MockSocket(object):
1275 def __init__(self, recv_funcs=()):
1276 # A generator that returns callables that we'll call for each
1277 # call to recv().
1278 self._recv_step = iter(recv_funcs)
1279
1280 def recv_into(self, buffer):
1281 data = next(self._recv_step)()
1282 assert len(buffer) >= len(data)
1283 buffer[:len(data)] = data
1284 return len(data)
1285
1286 def _decref_socketios(self):
1287 pass
1288
1289 def _textiowrap_for_test(self, buffering=-1):
1290 raw = socket.SocketIO(self, "r")
1291 if buffering < 0:
1292 buffering = io.DEFAULT_BUFFER_SIZE
1293 if buffering == 0:
1294 return raw
1295 buffer = io.BufferedReader(raw, buffering)
1296 text = io.TextIOWrapper(buffer, None, None)
1297 text.mode = "rb"
1298 return text
1299
1300 @staticmethod
1301 def _raise_eintr():
1302 raise socket.error(errno.EINTR)
1303
1304 def _textiowrap_mock_socket(self, mock, buffering=-1):
1305 raw = socket.SocketIO(mock, "r")
1306 if buffering < 0:
1307 buffering = io.DEFAULT_BUFFER_SIZE
1308 if buffering == 0:
1309 return raw
1310 buffer = io.BufferedReader(raw, buffering)
1311 text = io.TextIOWrapper(buffer, None, None)
1312 text.mode = "rb"
1313 return text
1314
1315 def _test_readline(self, size=-1, buffering=-1):
1316 mock_sock = self.MockSocket(recv_funcs=[
1317 lambda : b"This is the first line\nAnd the sec",
1318 self._raise_eintr,
1319 lambda : b"ond line is here\n",
1320 lambda : b"",
1321 lambda : b"", # XXX(gps): io library does an extra EOF read
1322 ])
1323 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001324 self.assertEqual(fo.readline(size), "This is the first line\n")
1325 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001326
1327 def _test_read(self, size=-1, buffering=-1):
1328 mock_sock = self.MockSocket(recv_funcs=[
1329 lambda : b"This is the first line\nAnd the sec",
1330 self._raise_eintr,
1331 lambda : b"ond line is here\n",
1332 lambda : b"",
1333 lambda : b"", # XXX(gps): io library does an extra EOF read
1334 ])
1335 expecting = (b"This is the first line\n"
1336 b"And the second line is here\n")
1337 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1338 if buffering == 0:
1339 data = b''
1340 else:
1341 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001342 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001343 while len(data) != len(expecting):
1344 part = fo.read(size)
1345 if not part:
1346 break
1347 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001348 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001349
1350 def test_default(self):
1351 self._test_readline()
1352 self._test_readline(size=100)
1353 self._test_read()
1354 self._test_read(size=100)
1355
1356 def test_with_1k_buffer(self):
1357 self._test_readline(buffering=1024)
1358 self._test_readline(size=100, buffering=1024)
1359 self._test_read(buffering=1024)
1360 self._test_read(size=100, buffering=1024)
1361
1362 def _test_readline_no_buffer(self, size=-1):
1363 mock_sock = self.MockSocket(recv_funcs=[
1364 lambda : b"a",
1365 lambda : b"\n",
1366 lambda : b"B",
1367 self._raise_eintr,
1368 lambda : b"b",
1369 lambda : b"",
1370 ])
1371 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001372 self.assertEqual(fo.readline(size), b"a\n")
1373 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001374
1375 def test_no_buffer(self):
1376 self._test_readline_no_buffer()
1377 self._test_readline_no_buffer(size=4)
1378 self._test_read(buffering=0)
1379 self._test_read(size=100, buffering=0)
1380
1381
Guido van Rossume9f66142002-08-07 15:46:19 +00001382class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1383
1384 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001385
Guido van Rossume9f66142002-08-07 15:46:19 +00001386 In this case (and in this case only), it should be possible to
1387 create a file object, read a line from it, create another file
1388 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001389 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001390 when reading multiple requests from the same socket."""
1391
1392 bufsize = 0 # Use unbuffered mode
1393
1394 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001395 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001396 line = self.read_file.readline() # first line
1397 self.assertEqual(line, b"A. " + self.write_msg) # first line
1398 self.read_file = self.cli_conn.makefile('rb', 0)
1399 line = self.read_file.readline() # second line
1400 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001401
1402 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001403 self.write_file.write(b"A. " + self.write_msg)
1404 self.write_file.write(b"B. " + self.write_msg)
1405 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001406
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001407 def testMakefileClose(self):
1408 # The file returned by makefile should keep the socket open...
1409 self.cli_conn.close()
1410 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001411 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001412 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001413 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001414 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1415
1416 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001417 self.write_file.write(self.write_msg)
1418 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001419
1420 def testMakefileCloseSocketDestroy(self):
1421 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001422 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001423 refcount_after = sys.getrefcount(self.cli_conn)
1424 self.assertEqual(refcount_before - 1, refcount_after)
1425
1426 def _testMakefileCloseSocketDestroy(self):
1427 pass
1428
Antoine Pitrou98b46702010-09-18 22:59:00 +00001429 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001430 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001431 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1432
1433 def testSmallReadNonBlocking(self):
1434 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001435 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1436 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001437 self.evt1.set()
1438 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001439 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001440 if first_seg is None:
1441 # Data not arrived (can happen under Windows), wait a bit
1442 time.sleep(0.5)
1443 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001444 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001445 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001446 self.assertEqual(n, 3)
1447 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001448 self.assertEqual(msg, self.read_msg)
1449 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1450 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001451
1452 def _testSmallReadNonBlocking(self):
1453 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001454 self.write_file.write(self.write_msg)
1455 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001456 self.evt2.set()
1457 # Avoid cloding the socket before the server test has finished,
1458 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1459 self.serv_finished.wait(5.0)
1460
1461 def testWriteNonBlocking(self):
1462 self.cli_finished.wait(5.0)
1463 # The client thread can't skip directly - the SkipTest exception
1464 # would appear as a failure.
1465 if self.serv_skipped:
1466 self.skipTest(self.serv_skipped)
1467
1468 def _testWriteNonBlocking(self):
1469 self.serv_skipped = None
1470 self.serv_conn.setblocking(False)
1471 # Try to saturate the socket buffer pipe with repeated large writes.
1472 BIG = b"x" * (1024 ** 2)
1473 LIMIT = 10
1474 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001475 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001476 self.assertGreater(n, 0)
1477 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001478 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001479 if n is None:
1480 # Succeeded
1481 break
1482 self.assertGreater(n, 0)
1483 else:
1484 # Let us know that this test didn't manage to establish
1485 # the expected conditions. This is not a failure in itself but,
1486 # if it happens repeatedly, the test should be fixed.
1487 self.serv_skipped = "failed to saturate the socket buffer"
1488
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001489
Guido van Rossum8c943832002-08-08 01:00:28 +00001490class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1491
1492 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1493
1494
1495class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1496
1497 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001498
Thomas Woutersb2137042007-02-01 18:02:27 +00001499
Antoine Pitrou834bd812010-10-13 16:17:14 +00001500class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1501 """Tests for socket.makefile() in text mode (rather than binary)"""
1502
1503 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001504 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001505 write_mode = 'wb'
1506 write_msg = MSG
1507 newline = ''
1508
1509
1510class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1511 """Tests for socket.makefile() in text mode (rather than binary)"""
1512
1513 read_mode = 'rb'
1514 read_msg = MSG
1515 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001516 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001517 newline = ''
1518
1519
1520class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1521 """Tests for socket.makefile() in text mode (rather than binary)"""
1522
1523 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001524 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001525 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001526 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001527 newline = ''
1528
1529
Guido van Rossumd8faa362007-04-27 19:54:29 +00001530class NetworkConnectionTest(object):
1531 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001532
Guido van Rossumd8faa362007-04-27 19:54:29 +00001533 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001534 # We're inherited below by BasicTCPTest2, which also inherits
1535 # BasicTCPTest, which defines self.port referenced below.
1536 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001537 self.serv_conn = self.cli
1538
1539class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1540 """Tests that NetworkConnection does not break existing TCP functionality.
1541 """
1542
1543class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001544
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001545 class MockSocket(socket.socket):
1546 def connect(self, *args):
1547 raise socket.timeout('timed out')
1548
1549 @contextlib.contextmanager
1550 def mocked_socket_module(self):
1551 """Return a socket which times out on connect"""
1552 old_socket = socket.socket
1553 socket.socket = self.MockSocket
1554 try:
1555 yield
1556 finally:
1557 socket.socket = old_socket
1558
1559 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001560 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001561 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001562 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001563 with self.assertRaises(socket.error) as cm:
1564 cli.connect((HOST, port))
1565 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1566
1567 def test_create_connection(self):
1568 # Issue #9792: errors raised by create_connection() should have
1569 # a proper errno attribute.
1570 port = support.find_unused_port()
1571 with self.assertRaises(socket.error) as cm:
1572 socket.create_connection((HOST, port))
1573 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1574
1575 def test_create_connection_timeout(self):
1576 # Issue #9792: create_connection() should not recast timeout errors
1577 # as generic socket errors.
1578 with self.mocked_socket_module():
1579 with self.assertRaises(socket.timeout):
1580 socket.create_connection((HOST, 1234))
1581
Guido van Rossumd8faa362007-04-27 19:54:29 +00001582
Victor Stinner45df8202010-04-28 22:31:17 +00001583@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001584class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1585
1586 def __init__(self, methodName='runTest'):
1587 SocketTCPTest.__init__(self, methodName=methodName)
1588 ThreadableTest.__init__(self)
1589
1590 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001591 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001592
1593 def clientTearDown(self):
1594 self.cli.close()
1595 self.cli = None
1596 ThreadableTest.clientTearDown(self)
1597
1598 def _justAccept(self):
1599 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001600 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601
1602 testFamily = _justAccept
1603 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001604 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001605 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001606 self.assertEqual(self.cli.family, 2)
1607
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001608 testSourceAddress = _justAccept
1609 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001610 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1611 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001612 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001613 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001614 # The port number being used is sufficient to show that the bind()
1615 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001616
Guido van Rossumd8faa362007-04-27 19:54:29 +00001617 testTimeoutDefault = _justAccept
1618 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001619 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001620 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001621 socket.setdefaulttimeout(42)
1622 try:
1623 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001624 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001625 finally:
1626 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001627 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001628
1629 testTimeoutNone = _justAccept
1630 def _testTimeoutNone(self):
1631 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001632 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001633 socket.setdefaulttimeout(30)
1634 try:
1635 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001636 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001637 finally:
1638 socket.setdefaulttimeout(None)
1639 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001640
1641 testTimeoutValueNamed = _justAccept
1642 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001643 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001644 self.assertEqual(self.cli.gettimeout(), 30)
1645
1646 testTimeoutValueNonamed = _justAccept
1647 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001648 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001649 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001650 self.assertEqual(self.cli.gettimeout(), 30)
1651
Victor Stinner45df8202010-04-28 22:31:17 +00001652@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001653class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1654
1655 def __init__(self, methodName='runTest'):
1656 SocketTCPTest.__init__(self, methodName=methodName)
1657 ThreadableTest.__init__(self)
1658
1659 def clientSetUp(self):
1660 pass
1661
1662 def clientTearDown(self):
1663 self.cli.close()
1664 self.cli = None
1665 ThreadableTest.clientTearDown(self)
1666
1667 def testInsideTimeout(self):
1668 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001669 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001670 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001671 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001672 testOutsideTimeout = testInsideTimeout
1673
1674 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001675 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001676 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001677 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001678
1679 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001680 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001681 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001682
1683
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001684class TCPTimeoutTest(SocketTCPTest):
1685
1686 def testTCPTimeout(self):
1687 def raise_timeout(*args, **kwargs):
1688 self.serv.settimeout(1.0)
1689 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001690 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001691 "Error generating a timeout exception (TCP)")
1692
1693 def testTimeoutZero(self):
1694 ok = False
1695 try:
1696 self.serv.settimeout(0.0)
1697 foo = self.serv.accept()
1698 except socket.timeout:
1699 self.fail("caught timeout instead of error (TCP)")
1700 except socket.error:
1701 ok = True
1702 except:
1703 self.fail("caught unexpected exception (TCP)")
1704 if not ok:
1705 self.fail("accept() returned success when we did not expect it")
1706
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001707 def testInterruptedTimeout(self):
1708 # XXX I don't know how to do this test on MSWindows or any other
1709 # plaform that doesn't support signal.alarm() or os.kill(), though
1710 # the bug should have existed on all platforms.
1711 if not hasattr(signal, "alarm"):
1712 return # can only test on *nix
1713 self.serv.settimeout(5.0) # must be longer than alarm
1714 class Alarm(Exception):
1715 pass
1716 def alarm_handler(signal, frame):
1717 raise Alarm
1718 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1719 try:
1720 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1721 try:
1722 foo = self.serv.accept()
1723 except socket.timeout:
1724 self.fail("caught timeout instead of Alarm")
1725 except Alarm:
1726 pass
1727 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001728 self.fail("caught other exception instead of Alarm:"
1729 " %s(%s):\n%s" %
1730 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001731 else:
1732 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001733 finally:
1734 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001735 except Alarm:
1736 self.fail("got Alarm in wrong place")
1737 finally:
1738 # no alarm can be pending. Safe to restore old handler.
1739 signal.signal(signal.SIGALRM, old_alarm)
1740
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001741class UDPTimeoutTest(SocketTCPTest):
1742
1743 def testUDPTimeout(self):
1744 def raise_timeout(*args, **kwargs):
1745 self.serv.settimeout(1.0)
1746 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001747 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001748 "Error generating a timeout exception (UDP)")
1749
1750 def testTimeoutZero(self):
1751 ok = False
1752 try:
1753 self.serv.settimeout(0.0)
1754 foo = self.serv.recv(1024)
1755 except socket.timeout:
1756 self.fail("caught timeout instead of error (UDP)")
1757 except socket.error:
1758 ok = True
1759 except:
1760 self.fail("caught unexpected exception (UDP)")
1761 if not ok:
1762 self.fail("recv() returned success when we did not expect it")
1763
1764class TestExceptions(unittest.TestCase):
1765
1766 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001767 self.assertTrue(issubclass(socket.error, Exception))
1768 self.assertTrue(issubclass(socket.herror, socket.error))
1769 self.assertTrue(issubclass(socket.gaierror, socket.error))
1770 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001771
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001772class TestLinuxAbstractNamespace(unittest.TestCase):
1773
1774 UNIX_PATH_MAX = 108
1775
1776 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001777 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001778 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1779 s1.bind(address)
1780 s1.listen(1)
1781 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1782 s2.connect(s1.getsockname())
1783 with s1.accept()[0] as s3:
1784 self.assertEqual(s1.getsockname(), address)
1785 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001786
1787 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001788 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001789 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1790 s.bind(address)
1791 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001792
1793 def testNameOverflow(self):
1794 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001795 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1796 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001797
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001798
Victor Stinner45df8202010-04-28 22:31:17 +00001799@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001800class BufferIOTest(SocketConnectedTest):
1801 """
1802 Test the buffer versions of socket.recv() and socket.send().
1803 """
1804 def __init__(self, methodName='runTest'):
1805 SocketConnectedTest.__init__(self, methodName=methodName)
1806
Antoine Pitrou25480782010-03-17 22:50:28 +00001807 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001808 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001809 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001810 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001811 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001812 self.assertEqual(msg, MSG)
1813
Antoine Pitrou25480782010-03-17 22:50:28 +00001814 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001815 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816 self.serv_conn.send(buf)
1817
Antoine Pitrou25480782010-03-17 22:50:28 +00001818 def testRecvIntoBytearray(self):
1819 buf = bytearray(1024)
1820 nbytes = self.cli_conn.recv_into(buf)
1821 self.assertEqual(nbytes, len(MSG))
1822 msg = buf[:len(MSG)]
1823 self.assertEqual(msg, MSG)
1824
1825 _testRecvIntoBytearray = _testRecvIntoArray
1826
1827 def testRecvIntoMemoryview(self):
1828 buf = bytearray(1024)
1829 nbytes = self.cli_conn.recv_into(memoryview(buf))
1830 self.assertEqual(nbytes, len(MSG))
1831 msg = buf[:len(MSG)]
1832 self.assertEqual(msg, MSG)
1833
1834 _testRecvIntoMemoryview = _testRecvIntoArray
1835
1836 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001837 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001838 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001839 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001840 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001841 self.assertEqual(msg, MSG)
1842
Antoine Pitrou25480782010-03-17 22:50:28 +00001843 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001844 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001845 self.serv_conn.send(buf)
1846
Antoine Pitrou25480782010-03-17 22:50:28 +00001847 def testRecvFromIntoBytearray(self):
1848 buf = bytearray(1024)
1849 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1850 self.assertEqual(nbytes, len(MSG))
1851 msg = buf[:len(MSG)]
1852 self.assertEqual(msg, MSG)
1853
1854 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1855
1856 def testRecvFromIntoMemoryview(self):
1857 buf = bytearray(1024)
1858 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1859 self.assertEqual(nbytes, len(MSG))
1860 msg = buf[:len(MSG)]
1861 self.assertEqual(msg, MSG)
1862
1863 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1864
Christian Heimes043d6f62008-01-07 17:19:16 +00001865
1866TIPC_STYPE = 2000
1867TIPC_LOWER = 200
1868TIPC_UPPER = 210
1869
1870def isTipcAvailable():
1871 """Check if the TIPC module is loaded
1872
1873 The TIPC module is not loaded automatically on Ubuntu and probably
1874 other Linux distros.
1875 """
1876 if not hasattr(socket, "AF_TIPC"):
1877 return False
1878 if not os.path.isfile("/proc/modules"):
1879 return False
1880 with open("/proc/modules") as f:
1881 for line in f:
1882 if line.startswith("tipc "):
1883 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001884 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001885 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1886 return False
1887
1888class TIPCTest (unittest.TestCase):
1889 def testRDM(self):
1890 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1891 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1892
1893 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1894 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1895 TIPC_LOWER, TIPC_UPPER)
1896 srv.bind(srvaddr)
1897
1898 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1899 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1900 cli.sendto(MSG, sendaddr)
1901
1902 msg, recvaddr = srv.recvfrom(1024)
1903
1904 self.assertEqual(cli.getsockname(), recvaddr)
1905 self.assertEqual(msg, MSG)
1906
1907
1908class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1909 def __init__(self, methodName = 'runTest'):
1910 unittest.TestCase.__init__(self, methodName = methodName)
1911 ThreadableTest.__init__(self)
1912
1913 def setUp(self):
1914 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1915 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1916 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1917 TIPC_LOWER, TIPC_UPPER)
1918 self.srv.bind(srvaddr)
1919 self.srv.listen(5)
1920 self.serverExplicitReady()
1921 self.conn, self.connaddr = self.srv.accept()
1922
1923 def clientSetUp(self):
1924 # The is a hittable race between serverExplicitReady() and the
1925 # accept() call; sleep a little while to avoid it, otherwise
1926 # we could get an exception
1927 time.sleep(0.1)
1928 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1929 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1930 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1931 self.cli.connect(addr)
1932 self.cliaddr = self.cli.getsockname()
1933
1934 def testStream(self):
1935 msg = self.conn.recv(1024)
1936 self.assertEqual(msg, MSG)
1937 self.assertEqual(self.cliaddr, self.connaddr)
1938
1939 def _testStream(self):
1940 self.cli.send(MSG)
1941 self.cli.close()
1942
1943
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001944@unittest.skipUnless(thread, 'Threading required for this test.')
1945class ContextManagersTest(ThreadedTCPSocketTest):
1946
1947 def _testSocketClass(self):
1948 # base test
1949 with socket.socket() as sock:
1950 self.assertFalse(sock._closed)
1951 self.assertTrue(sock._closed)
1952 # close inside with block
1953 with socket.socket() as sock:
1954 sock.close()
1955 self.assertTrue(sock._closed)
1956 # exception inside with block
1957 with socket.socket() as sock:
1958 self.assertRaises(socket.error, sock.sendall, b'foo')
1959 self.assertTrue(sock._closed)
1960
1961 def testCreateConnectionBase(self):
1962 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001963 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001964 data = conn.recv(1024)
1965 conn.sendall(data)
1966
1967 def _testCreateConnectionBase(self):
1968 address = self.serv.getsockname()
1969 with socket.create_connection(address) as sock:
1970 self.assertFalse(sock._closed)
1971 sock.sendall(b'foo')
1972 self.assertEqual(sock.recv(1024), b'foo')
1973 self.assertTrue(sock._closed)
1974
1975 def testCreateConnectionClose(self):
1976 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001977 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001978 data = conn.recv(1024)
1979 conn.sendall(data)
1980
1981 def _testCreateConnectionClose(self):
1982 address = self.serv.getsockname()
1983 with socket.create_connection(address) as sock:
1984 sock.close()
1985 self.assertTrue(sock._closed)
1986 self.assertRaises(socket.error, sock.sendall, b'foo')
1987
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001988
Antoine Pitroub1c54962010-10-14 15:05:38 +00001989@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1990 "SOCK_CLOEXEC not defined")
1991@unittest.skipUnless(fcntl, "module fcntl not available")
1992class CloexecConstantTest(unittest.TestCase):
1993 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001994 v = linux_version()
1995 if v < (2, 6, 28):
1996 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1997 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00001998 with socket.socket(socket.AF_INET,
1999 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2000 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2001 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002002
2003
2004@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2005 "SOCK_NONBLOCK not defined")
2006class NonblockConstantTest(unittest.TestCase):
2007 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2008 if nonblock:
2009 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2010 self.assertEqual(s.gettimeout(), timeout)
2011 else:
2012 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2013 self.assertEqual(s.gettimeout(), None)
2014
2015 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002016 v = linux_version()
2017 if v < (2, 6, 28):
2018 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2019 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002020 # a lot of it seems silly and redundant, but I wanted to test that
2021 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002022 with socket.socket(socket.AF_INET,
2023 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2024 self.checkNonblock(s)
2025 s.setblocking(1)
2026 self.checkNonblock(s, False)
2027 s.setblocking(0)
2028 self.checkNonblock(s)
2029 s.settimeout(None)
2030 self.checkNonblock(s, False)
2031 s.settimeout(2.0)
2032 self.checkNonblock(s, timeout=2.0)
2033 s.setblocking(1)
2034 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002035 # defaulttimeout
2036 t = socket.getdefaulttimeout()
2037 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002038 with socket.socket() as s:
2039 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002040 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002041 with socket.socket() as s:
2042 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002043 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002044 with socket.socket() as s:
2045 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002046 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002047 with socket.socket() as s:
2048 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002049 socket.setdefaulttimeout(t)
2050
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002051
Guido van Rossumb995eb72002-07-31 16:08:40 +00002052def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002053 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002054 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002055
2056 tests.extend([
2057 NonBlockingTCPTests,
2058 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002059 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002060 UnbufferedFileObjectClassTestCase,
2061 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002062 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002063 UnicodeReadFileObjectClassTestCase,
2064 UnicodeWriteFileObjectClassTestCase,
2065 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002066 NetworkConnectionNoServer,
2067 NetworkConnectionAttributesTest,
2068 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002069 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002070 CloexecConstantTest,
2071 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002072 ])
Dave Cole331708b2004-08-09 04:51:41 +00002073 if hasattr(socket, "socketpair"):
2074 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002075 if sys.platform == 'linux2':
2076 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002077 if isTipcAvailable():
2078 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002079 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002080
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002081 thread_info = support.threading_setup()
2082 support.run_unittest(*tests)
2083 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002084
2085if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002086 test_main()