blob: ffa2587a05d19ad8ab3a3910d4e601d8f9e328bb [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
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700375 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
376 'socket.if_nameindex() not available.')
377 def testInterfaceNameIndex(self):
378 interfaces = socket.if_nameindex()
379 for index, name in interfaces:
380 # interface indices are non-zero integers
381 self.assertGreater(index, 0)
382 self.assertEqual(index, socket.if_nametoindex(name))
383 self.assertEqual(name, socket.if_indextoname(index))
384
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000385 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000386 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000387 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000388 try:
389 # On some versions, this loses a reference
390 orig = sys.getrefcount(__name__)
391 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000392 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000393 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000394 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000395
Guido van Rossum24e4af82002-06-12 19:18:08 +0000396 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000397 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000398 try:
399 # On some versions, this crashes the interpreter.
400 socket.getnameinfo(('x', 0, 0, 0), 0)
401 except socket.error:
402 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000403
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000404 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000405 # This just checks that htons etc. are their own inverse,
406 # when looking at the lower 16 or 32 bits.
407 sizes = {socket.htonl: 32, socket.ntohl: 32,
408 socket.htons: 16, socket.ntohs: 16}
409 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000410 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000411 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
412 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000413
Guido van Rossuma2627af2002-09-14 00:58:46 +0000414 swapped = func(mask)
415 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000416 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000417
Guido van Rossum018919a2007-01-15 00:07:32 +0000418 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000419 good_values = [ 1, 2, 3, 1, 2, 3 ]
420 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000421 for k in good_values:
422 socket.ntohl(k)
423 socket.ntohs(k)
424 socket.htonl(k)
425 socket.htons(k)
426 for k in bad_values:
427 self.assertRaises(OverflowError, socket.ntohl, k)
428 self.assertRaises(OverflowError, socket.ntohs, k)
429 self.assertRaises(OverflowError, socket.htonl, k)
430 self.assertRaises(OverflowError, socket.htons, k)
431
Barry Warsaw11b91a02004-06-28 00:50:43 +0000432 def testGetServBy(self):
433 eq = self.assertEqual
434 # Find one service that exists, then check all the related interfaces.
435 # I've ordered this by protocols that have both a tcp and udp
436 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000437 if (sys.platform.startswith('linux') or
438 sys.platform.startswith('freebsd') or
439 sys.platform.startswith('netbsd') or
440 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000441 # avoid the 'echo' service on this platform, as there is an
442 # assumption breaking non-standard port/protocol entry
443 services = ('daytime', 'qotd', 'domain')
444 else:
445 services = ('echo', 'daytime', 'domain')
446 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000447 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000448 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000449 break
450 except socket.error:
451 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000452 else:
453 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000454 # Try same call with optional protocol omitted
455 port2 = socket.getservbyname(service)
456 eq(port, port2)
457 # Try udp, but don't barf it it doesn't exist
458 try:
459 udpport = socket.getservbyname(service, 'udp')
460 except socket.error:
461 udpport = None
462 else:
463 eq(udpport, port)
464 # Now make sure the lookup by port returns the same service name
465 eq(socket.getservbyport(port2), service)
466 eq(socket.getservbyport(port, 'tcp'), service)
467 if udpport is not None:
468 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000469 # Make sure getservbyport does not accept out of range ports.
470 self.assertRaises(OverflowError, socket.getservbyport, -1)
471 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000472
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000473 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000474 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000475 # The default timeout should initially be None
476 self.assertEqual(socket.getdefaulttimeout(), None)
477 s = socket.socket()
478 self.assertEqual(s.gettimeout(), None)
479 s.close()
480
481 # Set the default timeout to 10, and see if it propagates
482 socket.setdefaulttimeout(10)
483 self.assertEqual(socket.getdefaulttimeout(), 10)
484 s = socket.socket()
485 self.assertEqual(s.gettimeout(), 10)
486 s.close()
487
488 # Reset the default timeout to None, and see if it propagates
489 socket.setdefaulttimeout(None)
490 self.assertEqual(socket.getdefaulttimeout(), None)
491 s = socket.socket()
492 self.assertEqual(s.gettimeout(), None)
493 s.close()
494
495 # Check that setting it to an invalid value raises ValueError
496 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
497
498 # Check that setting it to an invalid type raises TypeError
499 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
500
Benjamin Petersonf91df042009-02-13 02:50:59 +0000501 def testIPv4_inet_aton_fourbytes(self):
502 if not hasattr(socket, 'inet_aton'):
503 return # No inet_aton, nothing to check
504 # Test that issue1008086 and issue767150 are fixed.
505 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000506 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
507 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000508
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000509 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000510 if not hasattr(socket, 'inet_pton'):
511 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000512 from socket import inet_aton as f, inet_pton, AF_INET
513 g = lambda a: inet_pton(AF_INET, a)
514
Ezio Melottib3aedd42010-11-20 19:04:17 +0000515 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
516 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
517 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
518 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
519 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000520
Ezio Melottib3aedd42010-11-20 19:04:17 +0000521 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
522 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
523 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
524 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000525
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000526 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000527 if not hasattr(socket, 'inet_pton'):
528 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000529 try:
530 from socket import inet_pton, AF_INET6, has_ipv6
531 if not has_ipv6:
532 return
533 except ImportError:
534 return
535 f = lambda a: inet_pton(AF_INET6, a)
536
Ezio Melottib3aedd42010-11-20 19:04:17 +0000537 self.assertEqual(b'\x00' * 16, f('::'))
538 self.assertEqual(b'\x00' * 16, f('0::0'))
539 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
540 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000541 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 +0000542 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
543 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000544
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000545 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000546 if not hasattr(socket, 'inet_ntop'):
547 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000548 from socket import inet_ntoa as f, inet_ntop, AF_INET
549 g = lambda a: inet_ntop(AF_INET, a)
550
Ezio Melottib3aedd42010-11-20 19:04:17 +0000551 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
552 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
553 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
554 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000555
Ezio Melottib3aedd42010-11-20 19:04:17 +0000556 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
557 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
558 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000559
560 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000561 if not hasattr(socket, 'inet_ntop'):
562 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000563 try:
564 from socket import inet_ntop, AF_INET6, has_ipv6
565 if not has_ipv6:
566 return
567 except ImportError:
568 return
569 f = lambda a: inet_ntop(AF_INET6, a)
570
Ezio Melottib3aedd42010-11-20 19:04:17 +0000571 self.assertEqual('::', f(b'\x00' * 16))
572 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
573 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000574 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000575 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 +0000576 )
577
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000578 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000579
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000580 def testSockName(self):
581 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200582 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000583 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000584 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000585 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000586 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000587 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
588 # it reasonable to get the host's addr in addition to 0.0.0.0.
589 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000590 try:
591 my_ip_addr = socket.gethostbyname(socket.gethostname())
592 except socket.error:
593 # Probably name lookup wasn't set up right; skip this test
594 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000595 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000596 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597
598 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000599 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000600 # We know a socket should start without reuse==0
601 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000602 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000603 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000604 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000605
606 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000607 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000608 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000609 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000610 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
611 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000612 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000614 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000615 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000616 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
617 sock.settimeout(1)
618 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000619 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000620
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000621 def testNewAttributes(self):
622 # testing .family, .type and .protocol
623 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
624 self.assertEqual(sock.family, socket.AF_INET)
625 self.assertEqual(sock.type, socket.SOCK_STREAM)
626 self.assertEqual(sock.proto, 0)
627 sock.close()
628
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000629 def test_getsockaddrarg(self):
630 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200631 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000632 big_port = port + 65536
633 neg_port = port - 65536
634 sock = socket.socket()
635 try:
636 self.assertRaises(OverflowError, sock.bind, (host, big_port))
637 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
638 sock.bind((host, port))
639 finally:
640 sock.close()
641
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000642 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000643 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000644 self.assertTrue(hasattr(socket.socket, 'ioctl'))
645 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
646 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
647 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000648 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
649 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000650 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000651 self.assertRaises(ValueError, s.ioctl, -1, None)
652 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000653
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000654 def testGetaddrinfo(self):
655 try:
656 socket.getaddrinfo('localhost', 80)
657 except socket.gaierror as err:
658 if err.errno == socket.EAI_SERVICE:
659 # see http://bugs.python.org/issue1282647
660 self.skipTest("buggy libc version")
661 raise
662 # len of every sequence is supposed to be == 5
663 for info in socket.getaddrinfo(HOST, None):
664 self.assertEqual(len(info), 5)
665 # host can be a domain name, a string representation of an
666 # IPv4/v6 address or None
667 socket.getaddrinfo('localhost', 80)
668 socket.getaddrinfo('127.0.0.1', 80)
669 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200670 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000671 socket.getaddrinfo('::1', 80)
672 # port can be a string service name such as "http", a numeric
673 # port number or None
674 socket.getaddrinfo(HOST, "http")
675 socket.getaddrinfo(HOST, 80)
676 socket.getaddrinfo(HOST, None)
677 # test family and socktype filters
678 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
679 for family, _, _, _, _ in infos:
680 self.assertEqual(family, socket.AF_INET)
681 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
682 for _, socktype, _, _, _ in infos:
683 self.assertEqual(socktype, socket.SOCK_STREAM)
684 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000685 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000686 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
687 # a server willing to support both IPv4 and IPv6 will
688 # usually do this
689 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
690 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000691 # test keyword arguments
692 a = socket.getaddrinfo(HOST, None)
693 b = socket.getaddrinfo(host=HOST, port=None)
694 self.assertEqual(a, b)
695 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
696 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
697 self.assertEqual(a, b)
698 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
699 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
700 self.assertEqual(a, b)
701 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
702 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
703 self.assertEqual(a, b)
704 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
705 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
706 self.assertEqual(a, b)
707 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
708 socket.AI_PASSIVE)
709 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
710 type=socket.SOCK_STREAM, proto=0,
711 flags=socket.AI_PASSIVE)
712 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000713 # Issue #6697.
714 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000715
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000716 def test_getnameinfo(self):
717 # only IP addresses are allowed
718 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
719
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000720 @unittest.skipUnless(support.is_resource_enabled('network'),
721 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000722 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000723 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000724 # these should all be successful
725 socket.gethostbyname('испытание.python.org')
726 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000727 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
728 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
729 # have a reverse entry yet
730 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000731
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000732 def check_sendall_interrupted(self, with_timeout):
733 # socketpair() is not stricly required, but it makes things easier.
734 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
735 self.skipTest("signal.alarm and socket.socketpair required for this test")
736 # Our signal handlers clobber the C errno by calling a math function
737 # with an invalid domain value.
738 def ok_handler(*args):
739 self.assertRaises(ValueError, math.acosh, 0)
740 def raising_handler(*args):
741 self.assertRaises(ValueError, math.acosh, 0)
742 1 // 0
743 c, s = socket.socketpair()
744 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
745 try:
746 if with_timeout:
747 # Just above the one second minimum for signal.alarm
748 c.settimeout(1.5)
749 with self.assertRaises(ZeroDivisionError):
750 signal.alarm(1)
751 c.sendall(b"x" * (1024**2))
752 if with_timeout:
753 signal.signal(signal.SIGALRM, ok_handler)
754 signal.alarm(1)
755 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
756 finally:
757 signal.signal(signal.SIGALRM, old_alarm)
758 c.close()
759 s.close()
760
761 def test_sendall_interrupted(self):
762 self.check_sendall_interrupted(False)
763
764 def test_sendall_interrupted_with_timeout(self):
765 self.check_sendall_interrupted(True)
766
Antoine Pitroue033e062010-10-29 10:38:18 +0000767 def test_dealloc_warn(self):
768 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
769 r = repr(sock)
770 with self.assertWarns(ResourceWarning) as cm:
771 sock = None
772 support.gc_collect()
773 self.assertIn(r, str(cm.warning.args[0]))
774 # An open socket file object gets dereferenced after the socket
775 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
776 f = sock.makefile('rb')
777 r = repr(sock)
778 sock = None
779 support.gc_collect()
780 with self.assertWarns(ResourceWarning):
781 f = None
782 support.gc_collect()
783
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000784 def test_name_closed_socketio(self):
785 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
786 fp = sock.makefile("rb")
787 fp.close()
788 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
789
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100790 def test_pickle(self):
791 sock = socket.socket()
792 with sock:
793 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
794 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
795
Antoine Pitrou3cade992011-05-10 19:19:13 +0200796 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200797 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
798 srv.bind((HOST, 0))
799 # backlog = 0
800 srv.listen(0)
801 srv.close()
802
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000803
Victor Stinner45df8202010-04-28 22:31:17 +0000804@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000805class BasicTCPTest(SocketConnectedTest):
806
807 def __init__(self, methodName='runTest'):
808 SocketConnectedTest.__init__(self, methodName=methodName)
809
810 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000811 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000813 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814
815 def _testRecv(self):
816 self.serv_conn.send(MSG)
817
818 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000819 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 seg1 = self.cli_conn.recv(len(MSG) - 3)
821 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000822 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000823 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824
825 def _testOverFlowRecv(self):
826 self.serv_conn.send(MSG)
827
828 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000829 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000831 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832
833 def _testRecvFrom(self):
834 self.serv_conn.send(MSG)
835
836 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000837 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
839 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000840 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000841 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000842
843 def _testOverFlowRecvFrom(self):
844 self.serv_conn.send(MSG)
845
846 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000847 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000848 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 while 1:
850 read = self.cli_conn.recv(1024)
851 if not read:
852 break
Guido van Rossume531e292002-08-08 20:28:34 +0000853 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000854 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855
856 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000857 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858 self.serv_conn.sendall(big_chunk)
859
860 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000861 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862 fd = self.cli_conn.fileno()
863 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000864 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000865 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000867 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868
869 def _testFromFd(self):
870 self.serv_conn.send(MSG)
871
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000872 def testDup(self):
873 # Testing dup()
874 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000875 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000876 msg = sock.recv(1024)
877 self.assertEqual(msg, MSG)
878
879 def _testDup(self):
880 self.serv_conn.send(MSG)
881
Guido van Rossum24e4af82002-06-12 19:18:08 +0000882 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000883 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000885 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000886 # wait for _testShutdown to finish: on OS X, when the server
887 # closes the connection the client also becomes disconnected,
888 # and the client's shutdown call will fail. (Issue #4397.)
889 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890
891 def _testShutdown(self):
892 self.serv_conn.send(MSG)
893 self.serv_conn.shutdown(2)
894
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000895 def testDetach(self):
896 # Testing detach()
897 fileno = self.cli_conn.fileno()
898 f = self.cli_conn.detach()
899 self.assertEqual(f, fileno)
900 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000901 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
902 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000903 # ...but we can create another socket using the (still open)
904 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000905 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000906 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000907 msg = sock.recv(1024)
908 self.assertEqual(msg, MSG)
909
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000910 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000911 self.serv_conn.send(MSG)
912
Victor Stinner45df8202010-04-28 22:31:17 +0000913@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000914class BasicUDPTest(ThreadedUDPSocketTest):
915
916 def __init__(self, methodName='runTest'):
917 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
918
919 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000920 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000921 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000922 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923
924 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000925 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000926
Guido van Rossum1c938012002-06-12 21:17:20 +0000927 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000928 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000930 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
Guido van Rossum1c938012002-06-12 21:17:20 +0000932 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000933 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934
Guido van Rossumd8faa362007-04-27 19:54:29 +0000935 def testRecvFromNegative(self):
936 # Negative lengths passed to recvfrom should give ValueError.
937 self.assertRaises(ValueError, self.serv.recvfrom, -1)
938
939 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000940 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000941
Victor Stinner45df8202010-04-28 22:31:17 +0000942@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000943class TCPCloserTest(ThreadedTCPSocketTest):
944
945 def testClose(self):
946 conn, addr = self.serv.accept()
947 conn.close()
948
949 sd = self.cli
950 read, write, err = select.select([sd], [], [], 1.0)
951 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000952 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000953
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000954 # Calling close() many times should be safe.
955 conn.close()
956 conn.close()
957
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000958 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000959 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000960 time.sleep(1.0)
961
Victor Stinner45df8202010-04-28 22:31:17 +0000962@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000963class BasicSocketPairTest(SocketPairTest):
964
965 def __init__(self, methodName='runTest'):
966 SocketPairTest.__init__(self, methodName=methodName)
967
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000968 def _check_defaults(self, sock):
969 self.assertIsInstance(sock, socket.socket)
970 if hasattr(socket, 'AF_UNIX'):
971 self.assertEqual(sock.family, socket.AF_UNIX)
972 else:
973 self.assertEqual(sock.family, socket.AF_INET)
974 self.assertEqual(sock.type, socket.SOCK_STREAM)
975 self.assertEqual(sock.proto, 0)
976
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000977 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000978 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000979
980 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000981 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000982
Dave Cole331708b2004-08-09 04:51:41 +0000983 def testRecv(self):
984 msg = self.serv.recv(1024)
985 self.assertEqual(msg, MSG)
986
987 def _testRecv(self):
988 self.cli.send(MSG)
989
990 def testSend(self):
991 self.serv.send(MSG)
992
993 def _testSend(self):
994 msg = self.cli.recv(1024)
995 self.assertEqual(msg, MSG)
996
Victor Stinner45df8202010-04-28 22:31:17 +0000997@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000998class NonBlockingTCPTests(ThreadedTCPSocketTest):
999
1000 def __init__(self, methodName='runTest'):
1001 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1002
1003 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001004 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001005 self.serv.setblocking(0)
1006 start = time.time()
1007 try:
1008 self.serv.accept()
1009 except socket.error:
1010 pass
1011 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001012 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001013
1014 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001015 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001016
Antoine Pitroub1c54962010-10-14 15:05:38 +00001017 if hasattr(socket, "SOCK_NONBLOCK"):
1018 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001019 v = linux_version()
1020 if v < (2, 6, 28):
1021 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1022 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001023 # reinit server socket
1024 self.serv.close()
1025 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001026 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001027 self.port = support.bind_port(self.serv)
1028 self.serv.listen(1)
1029 # actual testing
1030 start = time.time()
1031 try:
1032 self.serv.accept()
1033 except socket.error:
1034 pass
1035 end = time.time()
1036 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1037
1038 def _testInitNonBlocking(self):
1039 pass
1040
Antoine Pitrou600232b2011-01-05 21:03:42 +00001041 def testInheritFlags(self):
1042 # Issue #7995: when calling accept() on a listening socket with a
1043 # timeout, the resulting socket should not be non-blocking.
1044 self.serv.settimeout(10)
1045 try:
1046 conn, addr = self.serv.accept()
1047 message = conn.recv(len(MSG))
1048 finally:
1049 conn.close()
1050 self.serv.settimeout(None)
1051
1052 def _testInheritFlags(self):
1053 time.sleep(0.1)
1054 self.cli.connect((HOST, self.port))
1055 time.sleep(0.5)
1056 self.cli.send(MSG)
1057
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001059 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001060 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001061 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001062 conn, addr = self.serv.accept()
1063 except socket.error:
1064 pass
1065 else:
1066 self.fail("Error trying to do non-blocking accept.")
1067 read, write, err = select.select([self.serv], [], [])
1068 if self.serv in read:
1069 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001070 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001071 else:
1072 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001073
Guido van Rossum24e4af82002-06-12 19:18:08 +00001074 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001075 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001076 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001077
1078 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001079 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001080 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001081 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082
1083 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001084 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001085 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001086
1087 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001088 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089 conn, addr = self.serv.accept()
1090 conn.setblocking(0)
1091 try:
1092 msg = conn.recv(len(MSG))
1093 except socket.error:
1094 pass
1095 else:
1096 self.fail("Error trying to do non-blocking recv.")
1097 read, write, err = select.select([conn], [], [])
1098 if conn in read:
1099 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001100 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001101 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001102 else:
1103 self.fail("Error during select call to non-blocking socket.")
1104
1105 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001106 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001107 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001108 self.cli.send(MSG)
1109
Victor Stinner45df8202010-04-28 22:31:17 +00001110@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001111class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001112 """Unit tests for the object returned by socket.makefile()
1113
Antoine Pitrou834bd812010-10-13 16:17:14 +00001114 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001115 the client connection. You can read from this file to
1116 get output from the server.
1117
Antoine Pitrou834bd812010-10-13 16:17:14 +00001118 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001119 server connection. You can write to this file to send output
1120 to the client.
1121 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001122
Guido van Rossume9f66142002-08-07 15:46:19 +00001123 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001124 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001125 errors = 'strict'
1126 newline = None
1127
1128 read_mode = 'rb'
1129 read_msg = MSG
1130 write_mode = 'wb'
1131 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001132
Guido van Rossum24e4af82002-06-12 19:18:08 +00001133 def __init__(self, methodName='runTest'):
1134 SocketConnectedTest.__init__(self, methodName=methodName)
1135
1136 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001137 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1138 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001139 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001140 self.read_file = self.cli_conn.makefile(
1141 self.read_mode, self.bufsize,
1142 encoding = self.encoding,
1143 errors = self.errors,
1144 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001145
1146 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001147 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001148 self.read_file.close()
1149 self.assertTrue(self.read_file.closed)
1150 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001151 SocketConnectedTest.tearDown(self)
1152
1153 def clientSetUp(self):
1154 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001155 self.write_file = self.serv_conn.makefile(
1156 self.write_mode, self.bufsize,
1157 encoding = self.encoding,
1158 errors = self.errors,
1159 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001160
1161 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001162 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001163 self.write_file.close()
1164 self.assertTrue(self.write_file.closed)
1165 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001166 SocketConnectedTest.clientTearDown(self)
1167
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001168 def testReadAfterTimeout(self):
1169 # Issue #7322: A file object must disallow further reads
1170 # after a timeout has occurred.
1171 self.cli_conn.settimeout(1)
1172 self.read_file.read(3)
1173 # First read raises a timeout
1174 self.assertRaises(socket.timeout, self.read_file.read, 1)
1175 # Second read is disallowed
1176 with self.assertRaises(IOError) as ctx:
1177 self.read_file.read(1)
1178 self.assertIn("cannot read from timed out object", str(ctx.exception))
1179
1180 def _testReadAfterTimeout(self):
1181 self.write_file.write(self.write_msg[0:3])
1182 self.write_file.flush()
1183 self.serv_finished.wait()
1184
Guido van Rossum24e4af82002-06-12 19:18:08 +00001185 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001186 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001187 first_seg = self.read_file.read(len(self.read_msg)-3)
1188 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001189 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001190 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001191
1192 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001193 self.write_file.write(self.write_msg)
1194 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001195
Guido van Rossum8c943832002-08-08 01:00:28 +00001196 def testFullRead(self):
1197 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001198 msg = self.read_file.read()
1199 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001200
1201 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001202 self.write_file.write(self.write_msg)
1203 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001204
Guido van Rossum24e4af82002-06-12 19:18:08 +00001205 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001206 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001207 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001208 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001209 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001210 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001211 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001212 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001213 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001214
1215 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001216 self.write_file.write(self.write_msg)
1217 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001218
1219 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001220 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001221 line = self.read_file.readline()
1222 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001223
1224 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001225 self.write_file.write(self.write_msg)
1226 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001227
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001228 def testCloseAfterMakefile(self):
1229 # The file returned by makefile should keep the socket open.
1230 self.cli_conn.close()
1231 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001232 msg = self.read_file.read()
1233 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001234
1235 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001236 self.write_file.write(self.write_msg)
1237 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001238
1239 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001240 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001241 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001242 if isinstance(self.read_msg, str):
1243 msg = msg.decode()
1244 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001245
1246 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001247 self.write_file.write(self.write_msg)
1248 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001249
Tim Peters116d83c2004-03-28 02:20:45 +00001250 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001251 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001252
1253 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001254 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001255
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001256 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001257 self.assertEqual(self.read_file.mode, self.read_mode)
1258 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001259
1260 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001261 self.assertEqual(self.write_file.mode, self.write_mode)
1262 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001263
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001264 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001265 self.read_file.close()
1266 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001267 self.cli_conn.close()
1268 self.assertRaises(socket.error, self.cli_conn.getsockname)
1269
1270 def _testRealClose(self):
1271 pass
1272
1273
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001274class FileObjectInterruptedTestCase(unittest.TestCase):
1275 """Test that the file object correctly handles EINTR internally."""
1276
1277 class MockSocket(object):
1278 def __init__(self, recv_funcs=()):
1279 # A generator that returns callables that we'll call for each
1280 # call to recv().
1281 self._recv_step = iter(recv_funcs)
1282
1283 def recv_into(self, buffer):
1284 data = next(self._recv_step)()
1285 assert len(buffer) >= len(data)
1286 buffer[:len(data)] = data
1287 return len(data)
1288
1289 def _decref_socketios(self):
1290 pass
1291
1292 def _textiowrap_for_test(self, buffering=-1):
1293 raw = socket.SocketIO(self, "r")
1294 if buffering < 0:
1295 buffering = io.DEFAULT_BUFFER_SIZE
1296 if buffering == 0:
1297 return raw
1298 buffer = io.BufferedReader(raw, buffering)
1299 text = io.TextIOWrapper(buffer, None, None)
1300 text.mode = "rb"
1301 return text
1302
1303 @staticmethod
1304 def _raise_eintr():
1305 raise socket.error(errno.EINTR)
1306
1307 def _textiowrap_mock_socket(self, mock, buffering=-1):
1308 raw = socket.SocketIO(mock, "r")
1309 if buffering < 0:
1310 buffering = io.DEFAULT_BUFFER_SIZE
1311 if buffering == 0:
1312 return raw
1313 buffer = io.BufferedReader(raw, buffering)
1314 text = io.TextIOWrapper(buffer, None, None)
1315 text.mode = "rb"
1316 return text
1317
1318 def _test_readline(self, size=-1, buffering=-1):
1319 mock_sock = self.MockSocket(recv_funcs=[
1320 lambda : b"This is the first line\nAnd the sec",
1321 self._raise_eintr,
1322 lambda : b"ond line is here\n",
1323 lambda : b"",
1324 lambda : b"", # XXX(gps): io library does an extra EOF read
1325 ])
1326 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001327 self.assertEqual(fo.readline(size), "This is the first line\n")
1328 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001329
1330 def _test_read(self, size=-1, buffering=-1):
1331 mock_sock = self.MockSocket(recv_funcs=[
1332 lambda : b"This is the first line\nAnd the sec",
1333 self._raise_eintr,
1334 lambda : b"ond line is here\n",
1335 lambda : b"",
1336 lambda : b"", # XXX(gps): io library does an extra EOF read
1337 ])
1338 expecting = (b"This is the first line\n"
1339 b"And the second line is here\n")
1340 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1341 if buffering == 0:
1342 data = b''
1343 else:
1344 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001345 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001346 while len(data) != len(expecting):
1347 part = fo.read(size)
1348 if not part:
1349 break
1350 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001351 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001352
1353 def test_default(self):
1354 self._test_readline()
1355 self._test_readline(size=100)
1356 self._test_read()
1357 self._test_read(size=100)
1358
1359 def test_with_1k_buffer(self):
1360 self._test_readline(buffering=1024)
1361 self._test_readline(size=100, buffering=1024)
1362 self._test_read(buffering=1024)
1363 self._test_read(size=100, buffering=1024)
1364
1365 def _test_readline_no_buffer(self, size=-1):
1366 mock_sock = self.MockSocket(recv_funcs=[
1367 lambda : b"a",
1368 lambda : b"\n",
1369 lambda : b"B",
1370 self._raise_eintr,
1371 lambda : b"b",
1372 lambda : b"",
1373 ])
1374 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001375 self.assertEqual(fo.readline(size), b"a\n")
1376 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001377
1378 def test_no_buffer(self):
1379 self._test_readline_no_buffer()
1380 self._test_readline_no_buffer(size=4)
1381 self._test_read(buffering=0)
1382 self._test_read(size=100, buffering=0)
1383
1384
Guido van Rossume9f66142002-08-07 15:46:19 +00001385class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1386
1387 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001388
Guido van Rossume9f66142002-08-07 15:46:19 +00001389 In this case (and in this case only), it should be possible to
1390 create a file object, read a line from it, create another file
1391 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001392 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001393 when reading multiple requests from the same socket."""
1394
1395 bufsize = 0 # Use unbuffered mode
1396
1397 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001398 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001399 line = self.read_file.readline() # first line
1400 self.assertEqual(line, b"A. " + self.write_msg) # first line
1401 self.read_file = self.cli_conn.makefile('rb', 0)
1402 line = self.read_file.readline() # second line
1403 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001404
1405 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001406 self.write_file.write(b"A. " + self.write_msg)
1407 self.write_file.write(b"B. " + self.write_msg)
1408 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001409
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001410 def testMakefileClose(self):
1411 # The file returned by makefile should keep the socket open...
1412 self.cli_conn.close()
1413 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001414 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001415 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001416 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001417 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1418
1419 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001420 self.write_file.write(self.write_msg)
1421 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001422
1423 def testMakefileCloseSocketDestroy(self):
1424 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001425 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001426 refcount_after = sys.getrefcount(self.cli_conn)
1427 self.assertEqual(refcount_before - 1, refcount_after)
1428
1429 def _testMakefileCloseSocketDestroy(self):
1430 pass
1431
Antoine Pitrou98b46702010-09-18 22:59:00 +00001432 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001433 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001434 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1435
1436 def testSmallReadNonBlocking(self):
1437 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001438 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1439 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001440 self.evt1.set()
1441 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001442 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001443 if first_seg is None:
1444 # Data not arrived (can happen under Windows), wait a bit
1445 time.sleep(0.5)
1446 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001447 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001448 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001449 self.assertEqual(n, 3)
1450 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001451 self.assertEqual(msg, self.read_msg)
1452 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1453 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001454
1455 def _testSmallReadNonBlocking(self):
1456 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001457 self.write_file.write(self.write_msg)
1458 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001459 self.evt2.set()
1460 # Avoid cloding the socket before the server test has finished,
1461 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1462 self.serv_finished.wait(5.0)
1463
1464 def testWriteNonBlocking(self):
1465 self.cli_finished.wait(5.0)
1466 # The client thread can't skip directly - the SkipTest exception
1467 # would appear as a failure.
1468 if self.serv_skipped:
1469 self.skipTest(self.serv_skipped)
1470
1471 def _testWriteNonBlocking(self):
1472 self.serv_skipped = None
1473 self.serv_conn.setblocking(False)
1474 # Try to saturate the socket buffer pipe with repeated large writes.
1475 BIG = b"x" * (1024 ** 2)
1476 LIMIT = 10
1477 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001478 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001479 self.assertGreater(n, 0)
1480 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001481 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001482 if n is None:
1483 # Succeeded
1484 break
1485 self.assertGreater(n, 0)
1486 else:
1487 # Let us know that this test didn't manage to establish
1488 # the expected conditions. This is not a failure in itself but,
1489 # if it happens repeatedly, the test should be fixed.
1490 self.serv_skipped = "failed to saturate the socket buffer"
1491
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001492
Guido van Rossum8c943832002-08-08 01:00:28 +00001493class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1494
1495 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1496
1497
1498class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1499
1500 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001501
Thomas Woutersb2137042007-02-01 18:02:27 +00001502
Antoine Pitrou834bd812010-10-13 16:17:14 +00001503class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1504 """Tests for socket.makefile() in text mode (rather than binary)"""
1505
1506 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001507 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001508 write_mode = 'wb'
1509 write_msg = MSG
1510 newline = ''
1511
1512
1513class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1514 """Tests for socket.makefile() in text mode (rather than binary)"""
1515
1516 read_mode = 'rb'
1517 read_msg = MSG
1518 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001519 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001520 newline = ''
1521
1522
1523class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1524 """Tests for socket.makefile() in text mode (rather than binary)"""
1525
1526 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001527 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001528 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001529 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001530 newline = ''
1531
1532
Guido van Rossumd8faa362007-04-27 19:54:29 +00001533class NetworkConnectionTest(object):
1534 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001535
Guido van Rossumd8faa362007-04-27 19:54:29 +00001536 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001537 # We're inherited below by BasicTCPTest2, which also inherits
1538 # BasicTCPTest, which defines self.port referenced below.
1539 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001540 self.serv_conn = self.cli
1541
1542class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1543 """Tests that NetworkConnection does not break existing TCP functionality.
1544 """
1545
1546class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001547
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001548 class MockSocket(socket.socket):
1549 def connect(self, *args):
1550 raise socket.timeout('timed out')
1551
1552 @contextlib.contextmanager
1553 def mocked_socket_module(self):
1554 """Return a socket which times out on connect"""
1555 old_socket = socket.socket
1556 socket.socket = self.MockSocket
1557 try:
1558 yield
1559 finally:
1560 socket.socket = old_socket
1561
1562 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001563 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001564 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001565 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001566 with self.assertRaises(socket.error) as cm:
1567 cli.connect((HOST, port))
1568 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1569
1570 def test_create_connection(self):
1571 # Issue #9792: errors raised by create_connection() should have
1572 # a proper errno attribute.
1573 port = support.find_unused_port()
1574 with self.assertRaises(socket.error) as cm:
1575 socket.create_connection((HOST, port))
1576 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1577
1578 def test_create_connection_timeout(self):
1579 # Issue #9792: create_connection() should not recast timeout errors
1580 # as generic socket errors.
1581 with self.mocked_socket_module():
1582 with self.assertRaises(socket.timeout):
1583 socket.create_connection((HOST, 1234))
1584
Guido van Rossumd8faa362007-04-27 19:54:29 +00001585
Victor Stinner45df8202010-04-28 22:31:17 +00001586@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001587class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1588
1589 def __init__(self, methodName='runTest'):
1590 SocketTCPTest.__init__(self, methodName=methodName)
1591 ThreadableTest.__init__(self)
1592
1593 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001594 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001595
1596 def clientTearDown(self):
1597 self.cli.close()
1598 self.cli = None
1599 ThreadableTest.clientTearDown(self)
1600
1601 def _justAccept(self):
1602 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001603 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001604
1605 testFamily = _justAccept
1606 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001607 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001608 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001609 self.assertEqual(self.cli.family, 2)
1610
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001611 testSourceAddress = _justAccept
1612 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001613 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1614 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001615 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001616 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001617 # The port number being used is sufficient to show that the bind()
1618 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001619
Guido van Rossumd8faa362007-04-27 19:54:29 +00001620 testTimeoutDefault = _justAccept
1621 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001622 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001623 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001624 socket.setdefaulttimeout(42)
1625 try:
1626 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001627 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001628 finally:
1629 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001630 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001631
1632 testTimeoutNone = _justAccept
1633 def _testTimeoutNone(self):
1634 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001635 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001636 socket.setdefaulttimeout(30)
1637 try:
1638 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001639 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001640 finally:
1641 socket.setdefaulttimeout(None)
1642 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001643
1644 testTimeoutValueNamed = _justAccept
1645 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001646 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001647 self.assertEqual(self.cli.gettimeout(), 30)
1648
1649 testTimeoutValueNonamed = _justAccept
1650 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001651 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001652 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001653 self.assertEqual(self.cli.gettimeout(), 30)
1654
Victor Stinner45df8202010-04-28 22:31:17 +00001655@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001656class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1657
1658 def __init__(self, methodName='runTest'):
1659 SocketTCPTest.__init__(self, methodName=methodName)
1660 ThreadableTest.__init__(self)
1661
1662 def clientSetUp(self):
1663 pass
1664
1665 def clientTearDown(self):
1666 self.cli.close()
1667 self.cli = None
1668 ThreadableTest.clientTearDown(self)
1669
1670 def testInsideTimeout(self):
1671 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001672 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001673 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001674 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001675 testOutsideTimeout = testInsideTimeout
1676
1677 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001678 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001679 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001680 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001681
1682 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001683 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001684 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001685
1686
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001687class TCPTimeoutTest(SocketTCPTest):
1688
1689 def testTCPTimeout(self):
1690 def raise_timeout(*args, **kwargs):
1691 self.serv.settimeout(1.0)
1692 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001693 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001694 "Error generating a timeout exception (TCP)")
1695
1696 def testTimeoutZero(self):
1697 ok = False
1698 try:
1699 self.serv.settimeout(0.0)
1700 foo = self.serv.accept()
1701 except socket.timeout:
1702 self.fail("caught timeout instead of error (TCP)")
1703 except socket.error:
1704 ok = True
1705 except:
1706 self.fail("caught unexpected exception (TCP)")
1707 if not ok:
1708 self.fail("accept() returned success when we did not expect it")
1709
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001710 def testInterruptedTimeout(self):
1711 # XXX I don't know how to do this test on MSWindows or any other
1712 # plaform that doesn't support signal.alarm() or os.kill(), though
1713 # the bug should have existed on all platforms.
1714 if not hasattr(signal, "alarm"):
1715 return # can only test on *nix
1716 self.serv.settimeout(5.0) # must be longer than alarm
1717 class Alarm(Exception):
1718 pass
1719 def alarm_handler(signal, frame):
1720 raise Alarm
1721 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1722 try:
1723 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1724 try:
1725 foo = self.serv.accept()
1726 except socket.timeout:
1727 self.fail("caught timeout instead of Alarm")
1728 except Alarm:
1729 pass
1730 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001731 self.fail("caught other exception instead of Alarm:"
1732 " %s(%s):\n%s" %
1733 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001734 else:
1735 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001736 finally:
1737 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001738 except Alarm:
1739 self.fail("got Alarm in wrong place")
1740 finally:
1741 # no alarm can be pending. Safe to restore old handler.
1742 signal.signal(signal.SIGALRM, old_alarm)
1743
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001744class UDPTimeoutTest(SocketTCPTest):
1745
1746 def testUDPTimeout(self):
1747 def raise_timeout(*args, **kwargs):
1748 self.serv.settimeout(1.0)
1749 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001750 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001751 "Error generating a timeout exception (UDP)")
1752
1753 def testTimeoutZero(self):
1754 ok = False
1755 try:
1756 self.serv.settimeout(0.0)
1757 foo = self.serv.recv(1024)
1758 except socket.timeout:
1759 self.fail("caught timeout instead of error (UDP)")
1760 except socket.error:
1761 ok = True
1762 except:
1763 self.fail("caught unexpected exception (UDP)")
1764 if not ok:
1765 self.fail("recv() returned success when we did not expect it")
1766
1767class TestExceptions(unittest.TestCase):
1768
1769 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001770 self.assertTrue(issubclass(socket.error, Exception))
1771 self.assertTrue(issubclass(socket.herror, socket.error))
1772 self.assertTrue(issubclass(socket.gaierror, socket.error))
1773 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001774
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001775class TestLinuxAbstractNamespace(unittest.TestCase):
1776
1777 UNIX_PATH_MAX = 108
1778
1779 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001780 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001781 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1782 s1.bind(address)
1783 s1.listen(1)
1784 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1785 s2.connect(s1.getsockname())
1786 with s1.accept()[0] as s3:
1787 self.assertEqual(s1.getsockname(), address)
1788 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001789
1790 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001791 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001792 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1793 s.bind(address)
1794 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001795
1796 def testNameOverflow(self):
1797 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001798 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1799 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001800
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001801
Victor Stinner45df8202010-04-28 22:31:17 +00001802@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001803class BufferIOTest(SocketConnectedTest):
1804 """
1805 Test the buffer versions of socket.recv() and socket.send().
1806 """
1807 def __init__(self, methodName='runTest'):
1808 SocketConnectedTest.__init__(self, methodName=methodName)
1809
Antoine Pitrou25480782010-03-17 22:50:28 +00001810 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001811 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001812 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001813 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001814 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001815 self.assertEqual(msg, MSG)
1816
Antoine Pitrou25480782010-03-17 22:50:28 +00001817 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001818 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001819 self.serv_conn.send(buf)
1820
Antoine Pitrou25480782010-03-17 22:50:28 +00001821 def testRecvIntoBytearray(self):
1822 buf = bytearray(1024)
1823 nbytes = self.cli_conn.recv_into(buf)
1824 self.assertEqual(nbytes, len(MSG))
1825 msg = buf[:len(MSG)]
1826 self.assertEqual(msg, MSG)
1827
1828 _testRecvIntoBytearray = _testRecvIntoArray
1829
1830 def testRecvIntoMemoryview(self):
1831 buf = bytearray(1024)
1832 nbytes = self.cli_conn.recv_into(memoryview(buf))
1833 self.assertEqual(nbytes, len(MSG))
1834 msg = buf[:len(MSG)]
1835 self.assertEqual(msg, MSG)
1836
1837 _testRecvIntoMemoryview = _testRecvIntoArray
1838
1839 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001840 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001841 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001842 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001843 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001844 self.assertEqual(msg, MSG)
1845
Antoine Pitrou25480782010-03-17 22:50:28 +00001846 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001847 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001848 self.serv_conn.send(buf)
1849
Antoine Pitrou25480782010-03-17 22:50:28 +00001850 def testRecvFromIntoBytearray(self):
1851 buf = bytearray(1024)
1852 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1853 self.assertEqual(nbytes, len(MSG))
1854 msg = buf[:len(MSG)]
1855 self.assertEqual(msg, MSG)
1856
1857 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1858
1859 def testRecvFromIntoMemoryview(self):
1860 buf = bytearray(1024)
1861 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1862 self.assertEqual(nbytes, len(MSG))
1863 msg = buf[:len(MSG)]
1864 self.assertEqual(msg, MSG)
1865
1866 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1867
Christian Heimes043d6f62008-01-07 17:19:16 +00001868
1869TIPC_STYPE = 2000
1870TIPC_LOWER = 200
1871TIPC_UPPER = 210
1872
1873def isTipcAvailable():
1874 """Check if the TIPC module is loaded
1875
1876 The TIPC module is not loaded automatically on Ubuntu and probably
1877 other Linux distros.
1878 """
1879 if not hasattr(socket, "AF_TIPC"):
1880 return False
1881 if not os.path.isfile("/proc/modules"):
1882 return False
1883 with open("/proc/modules") as f:
1884 for line in f:
1885 if line.startswith("tipc "):
1886 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001887 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001888 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1889 return False
1890
1891class TIPCTest (unittest.TestCase):
1892 def testRDM(self):
1893 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1894 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1895
1896 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1897 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1898 TIPC_LOWER, TIPC_UPPER)
1899 srv.bind(srvaddr)
1900
1901 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1902 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1903 cli.sendto(MSG, sendaddr)
1904
1905 msg, recvaddr = srv.recvfrom(1024)
1906
1907 self.assertEqual(cli.getsockname(), recvaddr)
1908 self.assertEqual(msg, MSG)
1909
1910
1911class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1912 def __init__(self, methodName = 'runTest'):
1913 unittest.TestCase.__init__(self, methodName = methodName)
1914 ThreadableTest.__init__(self)
1915
1916 def setUp(self):
1917 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1918 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1919 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1920 TIPC_LOWER, TIPC_UPPER)
1921 self.srv.bind(srvaddr)
1922 self.srv.listen(5)
1923 self.serverExplicitReady()
1924 self.conn, self.connaddr = self.srv.accept()
1925
1926 def clientSetUp(self):
1927 # The is a hittable race between serverExplicitReady() and the
1928 # accept() call; sleep a little while to avoid it, otherwise
1929 # we could get an exception
1930 time.sleep(0.1)
1931 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1932 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1933 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1934 self.cli.connect(addr)
1935 self.cliaddr = self.cli.getsockname()
1936
1937 def testStream(self):
1938 msg = self.conn.recv(1024)
1939 self.assertEqual(msg, MSG)
1940 self.assertEqual(self.cliaddr, self.connaddr)
1941
1942 def _testStream(self):
1943 self.cli.send(MSG)
1944 self.cli.close()
1945
1946
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001947@unittest.skipUnless(thread, 'Threading required for this test.')
1948class ContextManagersTest(ThreadedTCPSocketTest):
1949
1950 def _testSocketClass(self):
1951 # base test
1952 with socket.socket() as sock:
1953 self.assertFalse(sock._closed)
1954 self.assertTrue(sock._closed)
1955 # close inside with block
1956 with socket.socket() as sock:
1957 sock.close()
1958 self.assertTrue(sock._closed)
1959 # exception inside with block
1960 with socket.socket() as sock:
1961 self.assertRaises(socket.error, sock.sendall, b'foo')
1962 self.assertTrue(sock._closed)
1963
1964 def testCreateConnectionBase(self):
1965 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001966 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001967 data = conn.recv(1024)
1968 conn.sendall(data)
1969
1970 def _testCreateConnectionBase(self):
1971 address = self.serv.getsockname()
1972 with socket.create_connection(address) as sock:
1973 self.assertFalse(sock._closed)
1974 sock.sendall(b'foo')
1975 self.assertEqual(sock.recv(1024), b'foo')
1976 self.assertTrue(sock._closed)
1977
1978 def testCreateConnectionClose(self):
1979 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001980 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001981 data = conn.recv(1024)
1982 conn.sendall(data)
1983
1984 def _testCreateConnectionClose(self):
1985 address = self.serv.getsockname()
1986 with socket.create_connection(address) as sock:
1987 sock.close()
1988 self.assertTrue(sock._closed)
1989 self.assertRaises(socket.error, sock.sendall, b'foo')
1990
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001991
Antoine Pitroub1c54962010-10-14 15:05:38 +00001992@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1993 "SOCK_CLOEXEC not defined")
1994@unittest.skipUnless(fcntl, "module fcntl not available")
1995class CloexecConstantTest(unittest.TestCase):
1996 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001997 v = linux_version()
1998 if v < (2, 6, 28):
1999 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2000 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002001 with socket.socket(socket.AF_INET,
2002 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2003 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2004 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002005
2006
2007@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2008 "SOCK_NONBLOCK not defined")
2009class NonblockConstantTest(unittest.TestCase):
2010 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2011 if nonblock:
2012 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2013 self.assertEqual(s.gettimeout(), timeout)
2014 else:
2015 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2016 self.assertEqual(s.gettimeout(), None)
2017
2018 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002019 v = linux_version()
2020 if v < (2, 6, 28):
2021 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2022 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002023 # a lot of it seems silly and redundant, but I wanted to test that
2024 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002025 with socket.socket(socket.AF_INET,
2026 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2027 self.checkNonblock(s)
2028 s.setblocking(1)
2029 self.checkNonblock(s, False)
2030 s.setblocking(0)
2031 self.checkNonblock(s)
2032 s.settimeout(None)
2033 self.checkNonblock(s, False)
2034 s.settimeout(2.0)
2035 self.checkNonblock(s, timeout=2.0)
2036 s.setblocking(1)
2037 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002038 # defaulttimeout
2039 t = socket.getdefaulttimeout()
2040 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002041 with socket.socket() as s:
2042 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002043 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002044 with socket.socket() as s:
2045 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002046 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002047 with socket.socket() as s:
2048 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002049 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002050 with socket.socket() as s:
2051 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002052 socket.setdefaulttimeout(t)
2053
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002054
Guido van Rossumb995eb72002-07-31 16:08:40 +00002055def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002056 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002057 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002058
2059 tests.extend([
2060 NonBlockingTCPTests,
2061 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002062 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002063 UnbufferedFileObjectClassTestCase,
2064 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002065 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002066 UnicodeReadFileObjectClassTestCase,
2067 UnicodeWriteFileObjectClassTestCase,
2068 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002069 NetworkConnectionNoServer,
2070 NetworkConnectionAttributesTest,
2071 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002072 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002073 CloexecConstantTest,
2074 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002075 ])
Dave Cole331708b2004-08-09 04:51:41 +00002076 if hasattr(socket, "socketpair"):
2077 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002078 if sys.platform == 'linux2':
2079 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002080 if isTipcAvailable():
2081 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002082 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002083
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002084 thread_info = support.threading_setup()
2085 support.run_unittest(*tests)
2086 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002087
2088if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002089 test_main()