blob: a449f5bdcc410ba10a34b5c38513e70e7c6b7231 [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:
Charles-François Natali60713592011-05-20 16:55:06 +0200380 self.assertIsInstance(index, int)
381 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700382 # interface indices are non-zero integers
383 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200384 _index = socket.if_nametoindex(name)
385 self.assertIsInstance(_index, int)
386 self.assertEqual(index, _index)
387 _name = socket.if_indextoname(index)
388 self.assertIsInstance(_name, str)
389 self.assertEqual(name, _name)
390
391 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
392 'socket.if_nameindex() not available.')
393 def testInvalidInterfaceNameIndex(self):
394 # test nonexistent interface index/name
395 self.assertRaises(socket.error, socket.if_indextoname, 0)
396 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
397 # test with invalid values
398 self.assertRaises(TypeError, socket.if_nametoindex, 0)
399 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700400
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000401 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000402 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000403 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000404 try:
405 # On some versions, this loses a reference
406 orig = sys.getrefcount(__name__)
407 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000408 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000409 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000410 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000411
Guido van Rossum24e4af82002-06-12 19:18:08 +0000412 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000413 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000414 try:
415 # On some versions, this crashes the interpreter.
416 socket.getnameinfo(('x', 0, 0, 0), 0)
417 except socket.error:
418 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000419
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000420 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000421 # This just checks that htons etc. are their own inverse,
422 # when looking at the lower 16 or 32 bits.
423 sizes = {socket.htonl: 32, socket.ntohl: 32,
424 socket.htons: 16, socket.ntohs: 16}
425 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000426 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000427 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
428 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000429
Guido van Rossuma2627af2002-09-14 00:58:46 +0000430 swapped = func(mask)
431 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000432 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000433
Guido van Rossum018919a2007-01-15 00:07:32 +0000434 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000435 good_values = [ 1, 2, 3, 1, 2, 3 ]
436 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000437 for k in good_values:
438 socket.ntohl(k)
439 socket.ntohs(k)
440 socket.htonl(k)
441 socket.htons(k)
442 for k in bad_values:
443 self.assertRaises(OverflowError, socket.ntohl, k)
444 self.assertRaises(OverflowError, socket.ntohs, k)
445 self.assertRaises(OverflowError, socket.htonl, k)
446 self.assertRaises(OverflowError, socket.htons, k)
447
Barry Warsaw11b91a02004-06-28 00:50:43 +0000448 def testGetServBy(self):
449 eq = self.assertEqual
450 # Find one service that exists, then check all the related interfaces.
451 # I've ordered this by protocols that have both a tcp and udp
452 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000453 if (sys.platform.startswith('linux') or
454 sys.platform.startswith('freebsd') or
455 sys.platform.startswith('netbsd') or
456 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000457 # avoid the 'echo' service on this platform, as there is an
458 # assumption breaking non-standard port/protocol entry
459 services = ('daytime', 'qotd', 'domain')
460 else:
461 services = ('echo', 'daytime', 'domain')
462 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000463 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000464 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000465 break
466 except socket.error:
467 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000468 else:
469 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000470 # Try same call with optional protocol omitted
471 port2 = socket.getservbyname(service)
472 eq(port, port2)
473 # Try udp, but don't barf it it doesn't exist
474 try:
475 udpport = socket.getservbyname(service, 'udp')
476 except socket.error:
477 udpport = None
478 else:
479 eq(udpport, port)
480 # Now make sure the lookup by port returns the same service name
481 eq(socket.getservbyport(port2), service)
482 eq(socket.getservbyport(port, 'tcp'), service)
483 if udpport is not None:
484 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000485 # Make sure getservbyport does not accept out of range ports.
486 self.assertRaises(OverflowError, socket.getservbyport, -1)
487 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000489 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000490 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000491 # The default timeout should initially be None
492 self.assertEqual(socket.getdefaulttimeout(), None)
493 s = socket.socket()
494 self.assertEqual(s.gettimeout(), None)
495 s.close()
496
497 # Set the default timeout to 10, and see if it propagates
498 socket.setdefaulttimeout(10)
499 self.assertEqual(socket.getdefaulttimeout(), 10)
500 s = socket.socket()
501 self.assertEqual(s.gettimeout(), 10)
502 s.close()
503
504 # Reset the default timeout to None, and see if it propagates
505 socket.setdefaulttimeout(None)
506 self.assertEqual(socket.getdefaulttimeout(), None)
507 s = socket.socket()
508 self.assertEqual(s.gettimeout(), None)
509 s.close()
510
511 # Check that setting it to an invalid value raises ValueError
512 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
513
514 # Check that setting it to an invalid type raises TypeError
515 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
516
Benjamin Petersonf91df042009-02-13 02:50:59 +0000517 def testIPv4_inet_aton_fourbytes(self):
518 if not hasattr(socket, 'inet_aton'):
519 return # No inet_aton, nothing to check
520 # Test that issue1008086 and issue767150 are fixed.
521 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000522 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
523 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000524
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000525 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000526 if not hasattr(socket, 'inet_pton'):
527 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000528 from socket import inet_aton as f, inet_pton, AF_INET
529 g = lambda a: inet_pton(AF_INET, a)
530
Ezio Melottib3aedd42010-11-20 19:04:17 +0000531 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
532 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
533 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
534 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
535 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000536
Ezio Melottib3aedd42010-11-20 19:04:17 +0000537 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
538 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
539 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
540 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000541
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000542 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000543 if not hasattr(socket, 'inet_pton'):
544 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000545 try:
546 from socket import inet_pton, AF_INET6, has_ipv6
547 if not has_ipv6:
548 return
549 except ImportError:
550 return
551 f = lambda a: inet_pton(AF_INET6, a)
552
Ezio Melottib3aedd42010-11-20 19:04:17 +0000553 self.assertEqual(b'\x00' * 16, f('::'))
554 self.assertEqual(b'\x00' * 16, f('0::0'))
555 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
556 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000557 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 +0000558 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
559 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000560
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000561 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000562 if not hasattr(socket, 'inet_ntop'):
563 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000564 from socket import inet_ntoa as f, inet_ntop, AF_INET
565 g = lambda a: inet_ntop(AF_INET, a)
566
Ezio Melottib3aedd42010-11-20 19:04:17 +0000567 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
568 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
569 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
570 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000571
Ezio Melottib3aedd42010-11-20 19:04:17 +0000572 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
573 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
574 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000575
576 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000577 if not hasattr(socket, 'inet_ntop'):
578 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000579 try:
580 from socket import inet_ntop, AF_INET6, has_ipv6
581 if not has_ipv6:
582 return
583 except ImportError:
584 return
585 f = lambda a: inet_ntop(AF_INET6, a)
586
Ezio Melottib3aedd42010-11-20 19:04:17 +0000587 self.assertEqual('::', f(b'\x00' * 16))
588 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
589 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000590 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000591 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 +0000592 )
593
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000594 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000595
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000596 def testSockName(self):
597 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200598 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000599 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000600 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000601 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000602 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000603 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
604 # it reasonable to get the host's addr in addition to 0.0.0.0.
605 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000606 try:
607 my_ip_addr = socket.gethostbyname(socket.gethostname())
608 except socket.error:
609 # Probably name lookup wasn't set up right; skip this test
610 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000611 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000612 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613
614 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000615 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616 # We know a socket should start without reuse==0
617 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000618 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000620 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621
622 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000623 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000624 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000625 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000626 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
627 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000628 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000629
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000630 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000631 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000632 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
633 sock.settimeout(1)
634 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000635 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000636
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000637 def testNewAttributes(self):
638 # testing .family, .type and .protocol
639 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
640 self.assertEqual(sock.family, socket.AF_INET)
641 self.assertEqual(sock.type, socket.SOCK_STREAM)
642 self.assertEqual(sock.proto, 0)
643 sock.close()
644
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000645 def test_getsockaddrarg(self):
646 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200647 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000648 big_port = port + 65536
649 neg_port = port - 65536
650 sock = socket.socket()
651 try:
652 self.assertRaises(OverflowError, sock.bind, (host, big_port))
653 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
654 sock.bind((host, port))
655 finally:
656 sock.close()
657
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000658 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000659 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000660 self.assertTrue(hasattr(socket.socket, 'ioctl'))
661 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
662 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
663 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000664 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
665 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000666 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000667 self.assertRaises(ValueError, s.ioctl, -1, None)
668 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000669
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000670 def testGetaddrinfo(self):
671 try:
672 socket.getaddrinfo('localhost', 80)
673 except socket.gaierror as err:
674 if err.errno == socket.EAI_SERVICE:
675 # see http://bugs.python.org/issue1282647
676 self.skipTest("buggy libc version")
677 raise
678 # len of every sequence is supposed to be == 5
679 for info in socket.getaddrinfo(HOST, None):
680 self.assertEqual(len(info), 5)
681 # host can be a domain name, a string representation of an
682 # IPv4/v6 address or None
683 socket.getaddrinfo('localhost', 80)
684 socket.getaddrinfo('127.0.0.1', 80)
685 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200686 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000687 socket.getaddrinfo('::1', 80)
688 # port can be a string service name such as "http", a numeric
689 # port number or None
690 socket.getaddrinfo(HOST, "http")
691 socket.getaddrinfo(HOST, 80)
692 socket.getaddrinfo(HOST, None)
693 # test family and socktype filters
694 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
695 for family, _, _, _, _ in infos:
696 self.assertEqual(family, socket.AF_INET)
697 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
698 for _, socktype, _, _, _ in infos:
699 self.assertEqual(socktype, socket.SOCK_STREAM)
700 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000701 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000702 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
703 # a server willing to support both IPv4 and IPv6 will
704 # usually do this
705 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
706 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000707 # test keyword arguments
708 a = socket.getaddrinfo(HOST, None)
709 b = socket.getaddrinfo(host=HOST, port=None)
710 self.assertEqual(a, b)
711 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
712 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
713 self.assertEqual(a, b)
714 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
715 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
716 self.assertEqual(a, b)
717 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
718 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
719 self.assertEqual(a, b)
720 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
721 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
722 self.assertEqual(a, b)
723 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
724 socket.AI_PASSIVE)
725 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
726 type=socket.SOCK_STREAM, proto=0,
727 flags=socket.AI_PASSIVE)
728 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000729 # Issue #6697.
730 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000731
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000732 def test_getnameinfo(self):
733 # only IP addresses are allowed
734 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
735
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000736 @unittest.skipUnless(support.is_resource_enabled('network'),
737 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000738 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000739 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000740 # these should all be successful
741 socket.gethostbyname('испытание.python.org')
742 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000743 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
744 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
745 # have a reverse entry yet
746 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000747
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000748 def check_sendall_interrupted(self, with_timeout):
749 # socketpair() is not stricly required, but it makes things easier.
750 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
751 self.skipTest("signal.alarm and socket.socketpair required for this test")
752 # Our signal handlers clobber the C errno by calling a math function
753 # with an invalid domain value.
754 def ok_handler(*args):
755 self.assertRaises(ValueError, math.acosh, 0)
756 def raising_handler(*args):
757 self.assertRaises(ValueError, math.acosh, 0)
758 1 // 0
759 c, s = socket.socketpair()
760 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
761 try:
762 if with_timeout:
763 # Just above the one second minimum for signal.alarm
764 c.settimeout(1.5)
765 with self.assertRaises(ZeroDivisionError):
766 signal.alarm(1)
767 c.sendall(b"x" * (1024**2))
768 if with_timeout:
769 signal.signal(signal.SIGALRM, ok_handler)
770 signal.alarm(1)
771 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
772 finally:
773 signal.signal(signal.SIGALRM, old_alarm)
774 c.close()
775 s.close()
776
777 def test_sendall_interrupted(self):
778 self.check_sendall_interrupted(False)
779
780 def test_sendall_interrupted_with_timeout(self):
781 self.check_sendall_interrupted(True)
782
Antoine Pitroue033e062010-10-29 10:38:18 +0000783 def test_dealloc_warn(self):
784 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
785 r = repr(sock)
786 with self.assertWarns(ResourceWarning) as cm:
787 sock = None
788 support.gc_collect()
789 self.assertIn(r, str(cm.warning.args[0]))
790 # An open socket file object gets dereferenced after the socket
791 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
792 f = sock.makefile('rb')
793 r = repr(sock)
794 sock = None
795 support.gc_collect()
796 with self.assertWarns(ResourceWarning):
797 f = None
798 support.gc_collect()
799
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000800 def test_name_closed_socketio(self):
801 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
802 fp = sock.makefile("rb")
803 fp.close()
804 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
805
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100806 def test_pickle(self):
807 sock = socket.socket()
808 with sock:
809 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
810 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
811
Antoine Pitrou3cade992011-05-10 19:19:13 +0200812 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200813 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
814 srv.bind((HOST, 0))
815 # backlog = 0
816 srv.listen(0)
817 srv.close()
818
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000819
Victor Stinner45df8202010-04-28 22:31:17 +0000820@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821class BasicTCPTest(SocketConnectedTest):
822
823 def __init__(self, methodName='runTest'):
824 SocketConnectedTest.__init__(self, methodName=methodName)
825
826 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000827 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000829 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830
831 def _testRecv(self):
832 self.serv_conn.send(MSG)
833
834 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000835 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836 seg1 = self.cli_conn.recv(len(MSG) - 3)
837 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000838 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000839 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840
841 def _testOverFlowRecv(self):
842 self.serv_conn.send(MSG)
843
844 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000845 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000847 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848
849 def _testRecvFrom(self):
850 self.serv_conn.send(MSG)
851
852 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000853 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
855 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000856 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000857 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858
859 def _testOverFlowRecvFrom(self):
860 self.serv_conn.send(MSG)
861
862 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000863 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000864 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865 while 1:
866 read = self.cli_conn.recv(1024)
867 if not read:
868 break
Guido van Rossume531e292002-08-08 20:28:34 +0000869 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000870 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871
872 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000873 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874 self.serv_conn.sendall(big_chunk)
875
876 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000877 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878 fd = self.cli_conn.fileno()
879 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000880 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000881 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000882 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000883 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884
885 def _testFromFd(self):
886 self.serv_conn.send(MSG)
887
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000888 def testDup(self):
889 # Testing dup()
890 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000891 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000892 msg = sock.recv(1024)
893 self.assertEqual(msg, MSG)
894
895 def _testDup(self):
896 self.serv_conn.send(MSG)
897
Guido van Rossum24e4af82002-06-12 19:18:08 +0000898 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000899 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000900 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000901 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000902 # wait for _testShutdown to finish: on OS X, when the server
903 # closes the connection the client also becomes disconnected,
904 # and the client's shutdown call will fail. (Issue #4397.)
905 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000906
907 def _testShutdown(self):
908 self.serv_conn.send(MSG)
909 self.serv_conn.shutdown(2)
910
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000911 def testDetach(self):
912 # Testing detach()
913 fileno = self.cli_conn.fileno()
914 f = self.cli_conn.detach()
915 self.assertEqual(f, fileno)
916 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000917 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
918 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000919 # ...but we can create another socket using the (still open)
920 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000921 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000922 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000923 msg = sock.recv(1024)
924 self.assertEqual(msg, MSG)
925
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000926 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000927 self.serv_conn.send(MSG)
928
Victor Stinner45df8202010-04-28 22:31:17 +0000929@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930class BasicUDPTest(ThreadedUDPSocketTest):
931
932 def __init__(self, methodName='runTest'):
933 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
934
935 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000936 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000938 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000939
940 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000941 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942
Guido van Rossum1c938012002-06-12 21:17:20 +0000943 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000944 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000945 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000946 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000947
Guido van Rossum1c938012002-06-12 21:17:20 +0000948 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000949 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000950
Guido van Rossumd8faa362007-04-27 19:54:29 +0000951 def testRecvFromNegative(self):
952 # Negative lengths passed to recvfrom should give ValueError.
953 self.assertRaises(ValueError, self.serv.recvfrom, -1)
954
955 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000956 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000957
Victor Stinner45df8202010-04-28 22:31:17 +0000958@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000959class TCPCloserTest(ThreadedTCPSocketTest):
960
961 def testClose(self):
962 conn, addr = self.serv.accept()
963 conn.close()
964
965 sd = self.cli
966 read, write, err = select.select([sd], [], [], 1.0)
967 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000968 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000969
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000970 # Calling close() many times should be safe.
971 conn.close()
972 conn.close()
973
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000974 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000975 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000976 time.sleep(1.0)
977
Victor Stinner45df8202010-04-28 22:31:17 +0000978@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000979class BasicSocketPairTest(SocketPairTest):
980
981 def __init__(self, methodName='runTest'):
982 SocketPairTest.__init__(self, methodName=methodName)
983
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000984 def _check_defaults(self, sock):
985 self.assertIsInstance(sock, socket.socket)
986 if hasattr(socket, 'AF_UNIX'):
987 self.assertEqual(sock.family, socket.AF_UNIX)
988 else:
989 self.assertEqual(sock.family, socket.AF_INET)
990 self.assertEqual(sock.type, socket.SOCK_STREAM)
991 self.assertEqual(sock.proto, 0)
992
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000993 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000994 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000995
996 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000997 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000998
Dave Cole331708b2004-08-09 04:51:41 +0000999 def testRecv(self):
1000 msg = self.serv.recv(1024)
1001 self.assertEqual(msg, MSG)
1002
1003 def _testRecv(self):
1004 self.cli.send(MSG)
1005
1006 def testSend(self):
1007 self.serv.send(MSG)
1008
1009 def _testSend(self):
1010 msg = self.cli.recv(1024)
1011 self.assertEqual(msg, MSG)
1012
Victor Stinner45df8202010-04-28 22:31:17 +00001013@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001014class NonBlockingTCPTests(ThreadedTCPSocketTest):
1015
1016 def __init__(self, methodName='runTest'):
1017 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1018
1019 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001020 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001021 self.serv.setblocking(0)
1022 start = time.time()
1023 try:
1024 self.serv.accept()
1025 except socket.error:
1026 pass
1027 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001028 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001029
1030 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001031 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001032
Antoine Pitroub1c54962010-10-14 15:05:38 +00001033 if hasattr(socket, "SOCK_NONBLOCK"):
1034 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001035 v = linux_version()
1036 if v < (2, 6, 28):
1037 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1038 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001039 # reinit server socket
1040 self.serv.close()
1041 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001042 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001043 self.port = support.bind_port(self.serv)
1044 self.serv.listen(1)
1045 # actual testing
1046 start = time.time()
1047 try:
1048 self.serv.accept()
1049 except socket.error:
1050 pass
1051 end = time.time()
1052 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1053
1054 def _testInitNonBlocking(self):
1055 pass
1056
Antoine Pitrou600232b2011-01-05 21:03:42 +00001057 def testInheritFlags(self):
1058 # Issue #7995: when calling accept() on a listening socket with a
1059 # timeout, the resulting socket should not be non-blocking.
1060 self.serv.settimeout(10)
1061 try:
1062 conn, addr = self.serv.accept()
1063 message = conn.recv(len(MSG))
1064 finally:
1065 conn.close()
1066 self.serv.settimeout(None)
1067
1068 def _testInheritFlags(self):
1069 time.sleep(0.1)
1070 self.cli.connect((HOST, self.port))
1071 time.sleep(0.5)
1072 self.cli.send(MSG)
1073
Guido van Rossum24e4af82002-06-12 19:18:08 +00001074 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001075 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001076 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001077 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001078 conn, addr = self.serv.accept()
1079 except socket.error:
1080 pass
1081 else:
1082 self.fail("Error trying to do non-blocking accept.")
1083 read, write, err = select.select([self.serv], [], [])
1084 if self.serv in read:
1085 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001086 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001087 else:
1088 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001089
Guido van Rossum24e4af82002-06-12 19:18:08 +00001090 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001091 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001092 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001093
1094 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001095 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001096 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001097 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098
1099 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001100 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001101 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001102
1103 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001104 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001105 conn, addr = self.serv.accept()
1106 conn.setblocking(0)
1107 try:
1108 msg = conn.recv(len(MSG))
1109 except socket.error:
1110 pass
1111 else:
1112 self.fail("Error trying to do non-blocking recv.")
1113 read, write, err = select.select([conn], [], [])
1114 if conn in read:
1115 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001116 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001117 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001118 else:
1119 self.fail("Error during select call to non-blocking socket.")
1120
1121 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001122 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001123 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001124 self.cli.send(MSG)
1125
Victor Stinner45df8202010-04-28 22:31:17 +00001126@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001127class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001128 """Unit tests for the object returned by socket.makefile()
1129
Antoine Pitrou834bd812010-10-13 16:17:14 +00001130 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001131 the client connection. You can read from this file to
1132 get output from the server.
1133
Antoine Pitrou834bd812010-10-13 16:17:14 +00001134 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001135 server connection. You can write to this file to send output
1136 to the client.
1137 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001138
Guido van Rossume9f66142002-08-07 15:46:19 +00001139 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001140 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001141 errors = 'strict'
1142 newline = None
1143
1144 read_mode = 'rb'
1145 read_msg = MSG
1146 write_mode = 'wb'
1147 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001148
Guido van Rossum24e4af82002-06-12 19:18:08 +00001149 def __init__(self, methodName='runTest'):
1150 SocketConnectedTest.__init__(self, methodName=methodName)
1151
1152 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001153 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1154 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001156 self.read_file = self.cli_conn.makefile(
1157 self.read_mode, self.bufsize,
1158 encoding = self.encoding,
1159 errors = self.errors,
1160 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001161
1162 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001163 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001164 self.read_file.close()
1165 self.assertTrue(self.read_file.closed)
1166 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001167 SocketConnectedTest.tearDown(self)
1168
1169 def clientSetUp(self):
1170 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001171 self.write_file = self.serv_conn.makefile(
1172 self.write_mode, self.bufsize,
1173 encoding = self.encoding,
1174 errors = self.errors,
1175 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001176
1177 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001178 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001179 self.write_file.close()
1180 self.assertTrue(self.write_file.closed)
1181 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001182 SocketConnectedTest.clientTearDown(self)
1183
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001184 def testReadAfterTimeout(self):
1185 # Issue #7322: A file object must disallow further reads
1186 # after a timeout has occurred.
1187 self.cli_conn.settimeout(1)
1188 self.read_file.read(3)
1189 # First read raises a timeout
1190 self.assertRaises(socket.timeout, self.read_file.read, 1)
1191 # Second read is disallowed
1192 with self.assertRaises(IOError) as ctx:
1193 self.read_file.read(1)
1194 self.assertIn("cannot read from timed out object", str(ctx.exception))
1195
1196 def _testReadAfterTimeout(self):
1197 self.write_file.write(self.write_msg[0:3])
1198 self.write_file.flush()
1199 self.serv_finished.wait()
1200
Guido van Rossum24e4af82002-06-12 19:18:08 +00001201 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001202 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001203 first_seg = self.read_file.read(len(self.read_msg)-3)
1204 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001205 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001206 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001207
1208 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001209 self.write_file.write(self.write_msg)
1210 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001211
Guido van Rossum8c943832002-08-08 01:00:28 +00001212 def testFullRead(self):
1213 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001214 msg = self.read_file.read()
1215 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001216
1217 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001218 self.write_file.write(self.write_msg)
1219 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001220
Guido van Rossum24e4af82002-06-12 19:18:08 +00001221 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001222 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001223 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001224 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001225 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001226 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001227 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001228 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001229 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001230
1231 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001232 self.write_file.write(self.write_msg)
1233 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001234
1235 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001236 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001237 line = self.read_file.readline()
1238 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001239
1240 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001241 self.write_file.write(self.write_msg)
1242 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001243
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001244 def testCloseAfterMakefile(self):
1245 # The file returned by makefile should keep the socket open.
1246 self.cli_conn.close()
1247 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001248 msg = self.read_file.read()
1249 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001250
1251 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001252 self.write_file.write(self.write_msg)
1253 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001254
1255 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001256 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001257 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001258 if isinstance(self.read_msg, str):
1259 msg = msg.decode()
1260 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001261
1262 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001263 self.write_file.write(self.write_msg)
1264 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001265
Tim Peters116d83c2004-03-28 02:20:45 +00001266 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001267 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001268
1269 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001270 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001271
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001272 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001273 self.assertEqual(self.read_file.mode, self.read_mode)
1274 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001275
1276 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001277 self.assertEqual(self.write_file.mode, self.write_mode)
1278 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001279
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001280 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001281 self.read_file.close()
1282 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001283 self.cli_conn.close()
1284 self.assertRaises(socket.error, self.cli_conn.getsockname)
1285
1286 def _testRealClose(self):
1287 pass
1288
1289
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001290class FileObjectInterruptedTestCase(unittest.TestCase):
1291 """Test that the file object correctly handles EINTR internally."""
1292
1293 class MockSocket(object):
1294 def __init__(self, recv_funcs=()):
1295 # A generator that returns callables that we'll call for each
1296 # call to recv().
1297 self._recv_step = iter(recv_funcs)
1298
1299 def recv_into(self, buffer):
1300 data = next(self._recv_step)()
1301 assert len(buffer) >= len(data)
1302 buffer[:len(data)] = data
1303 return len(data)
1304
1305 def _decref_socketios(self):
1306 pass
1307
1308 def _textiowrap_for_test(self, buffering=-1):
1309 raw = socket.SocketIO(self, "r")
1310 if buffering < 0:
1311 buffering = io.DEFAULT_BUFFER_SIZE
1312 if buffering == 0:
1313 return raw
1314 buffer = io.BufferedReader(raw, buffering)
1315 text = io.TextIOWrapper(buffer, None, None)
1316 text.mode = "rb"
1317 return text
1318
1319 @staticmethod
1320 def _raise_eintr():
1321 raise socket.error(errno.EINTR)
1322
1323 def _textiowrap_mock_socket(self, mock, buffering=-1):
1324 raw = socket.SocketIO(mock, "r")
1325 if buffering < 0:
1326 buffering = io.DEFAULT_BUFFER_SIZE
1327 if buffering == 0:
1328 return raw
1329 buffer = io.BufferedReader(raw, buffering)
1330 text = io.TextIOWrapper(buffer, None, None)
1331 text.mode = "rb"
1332 return text
1333
1334 def _test_readline(self, size=-1, buffering=-1):
1335 mock_sock = self.MockSocket(recv_funcs=[
1336 lambda : b"This is the first line\nAnd the sec",
1337 self._raise_eintr,
1338 lambda : b"ond line is here\n",
1339 lambda : b"",
1340 lambda : b"", # XXX(gps): io library does an extra EOF read
1341 ])
1342 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001343 self.assertEqual(fo.readline(size), "This is the first line\n")
1344 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001345
1346 def _test_read(self, size=-1, buffering=-1):
1347 mock_sock = self.MockSocket(recv_funcs=[
1348 lambda : b"This is the first line\nAnd the sec",
1349 self._raise_eintr,
1350 lambda : b"ond line is here\n",
1351 lambda : b"",
1352 lambda : b"", # XXX(gps): io library does an extra EOF read
1353 ])
1354 expecting = (b"This is the first line\n"
1355 b"And the second line is here\n")
1356 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1357 if buffering == 0:
1358 data = b''
1359 else:
1360 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001361 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001362 while len(data) != len(expecting):
1363 part = fo.read(size)
1364 if not part:
1365 break
1366 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001367 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001368
1369 def test_default(self):
1370 self._test_readline()
1371 self._test_readline(size=100)
1372 self._test_read()
1373 self._test_read(size=100)
1374
1375 def test_with_1k_buffer(self):
1376 self._test_readline(buffering=1024)
1377 self._test_readline(size=100, buffering=1024)
1378 self._test_read(buffering=1024)
1379 self._test_read(size=100, buffering=1024)
1380
1381 def _test_readline_no_buffer(self, size=-1):
1382 mock_sock = self.MockSocket(recv_funcs=[
1383 lambda : b"a",
1384 lambda : b"\n",
1385 lambda : b"B",
1386 self._raise_eintr,
1387 lambda : b"b",
1388 lambda : b"",
1389 ])
1390 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001391 self.assertEqual(fo.readline(size), b"a\n")
1392 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001393
1394 def test_no_buffer(self):
1395 self._test_readline_no_buffer()
1396 self._test_readline_no_buffer(size=4)
1397 self._test_read(buffering=0)
1398 self._test_read(size=100, buffering=0)
1399
1400
Guido van Rossume9f66142002-08-07 15:46:19 +00001401class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1402
1403 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001404
Guido van Rossume9f66142002-08-07 15:46:19 +00001405 In this case (and in this case only), it should be possible to
1406 create a file object, read a line from it, create another file
1407 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001408 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001409 when reading multiple requests from the same socket."""
1410
1411 bufsize = 0 # Use unbuffered mode
1412
1413 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001414 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001415 line = self.read_file.readline() # first line
1416 self.assertEqual(line, b"A. " + self.write_msg) # first line
1417 self.read_file = self.cli_conn.makefile('rb', 0)
1418 line = self.read_file.readline() # second line
1419 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001420
1421 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001422 self.write_file.write(b"A. " + self.write_msg)
1423 self.write_file.write(b"B. " + self.write_msg)
1424 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001425
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001426 def testMakefileClose(self):
1427 # The file returned by makefile should keep the socket open...
1428 self.cli_conn.close()
1429 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001430 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001431 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001432 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001433 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1434
1435 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001436 self.write_file.write(self.write_msg)
1437 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001438
1439 def testMakefileCloseSocketDestroy(self):
1440 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001441 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001442 refcount_after = sys.getrefcount(self.cli_conn)
1443 self.assertEqual(refcount_before - 1, refcount_after)
1444
1445 def _testMakefileCloseSocketDestroy(self):
1446 pass
1447
Antoine Pitrou98b46702010-09-18 22:59:00 +00001448 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001449 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001450 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1451
1452 def testSmallReadNonBlocking(self):
1453 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001454 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1455 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001456 self.evt1.set()
1457 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001458 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001459 if first_seg is None:
1460 # Data not arrived (can happen under Windows), wait a bit
1461 time.sleep(0.5)
1462 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001463 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001464 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001465 self.assertEqual(n, 3)
1466 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001467 self.assertEqual(msg, self.read_msg)
1468 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1469 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001470
1471 def _testSmallReadNonBlocking(self):
1472 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001473 self.write_file.write(self.write_msg)
1474 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001475 self.evt2.set()
1476 # Avoid cloding the socket before the server test has finished,
1477 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1478 self.serv_finished.wait(5.0)
1479
1480 def testWriteNonBlocking(self):
1481 self.cli_finished.wait(5.0)
1482 # The client thread can't skip directly - the SkipTest exception
1483 # would appear as a failure.
1484 if self.serv_skipped:
1485 self.skipTest(self.serv_skipped)
1486
1487 def _testWriteNonBlocking(self):
1488 self.serv_skipped = None
1489 self.serv_conn.setblocking(False)
1490 # Try to saturate the socket buffer pipe with repeated large writes.
1491 BIG = b"x" * (1024 ** 2)
1492 LIMIT = 10
1493 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001494 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001495 self.assertGreater(n, 0)
1496 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001497 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001498 if n is None:
1499 # Succeeded
1500 break
1501 self.assertGreater(n, 0)
1502 else:
1503 # Let us know that this test didn't manage to establish
1504 # the expected conditions. This is not a failure in itself but,
1505 # if it happens repeatedly, the test should be fixed.
1506 self.serv_skipped = "failed to saturate the socket buffer"
1507
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001508
Guido van Rossum8c943832002-08-08 01:00:28 +00001509class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1510
1511 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1512
1513
1514class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1515
1516 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001517
Thomas Woutersb2137042007-02-01 18:02:27 +00001518
Antoine Pitrou834bd812010-10-13 16:17:14 +00001519class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1520 """Tests for socket.makefile() in text mode (rather than binary)"""
1521
1522 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001523 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001524 write_mode = 'wb'
1525 write_msg = MSG
1526 newline = ''
1527
1528
1529class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1530 """Tests for socket.makefile() in text mode (rather than binary)"""
1531
1532 read_mode = 'rb'
1533 read_msg = MSG
1534 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001535 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001536 newline = ''
1537
1538
1539class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1540 """Tests for socket.makefile() in text mode (rather than binary)"""
1541
1542 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001543 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001544 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001545 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001546 newline = ''
1547
1548
Guido van Rossumd8faa362007-04-27 19:54:29 +00001549class NetworkConnectionTest(object):
1550 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001551
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001553 # We're inherited below by BasicTCPTest2, which also inherits
1554 # BasicTCPTest, which defines self.port referenced below.
1555 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001556 self.serv_conn = self.cli
1557
1558class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1559 """Tests that NetworkConnection does not break existing TCP functionality.
1560 """
1561
1562class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001563
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001564 class MockSocket(socket.socket):
1565 def connect(self, *args):
1566 raise socket.timeout('timed out')
1567
1568 @contextlib.contextmanager
1569 def mocked_socket_module(self):
1570 """Return a socket which times out on connect"""
1571 old_socket = socket.socket
1572 socket.socket = self.MockSocket
1573 try:
1574 yield
1575 finally:
1576 socket.socket = old_socket
1577
1578 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001579 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001580 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001581 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001582 with self.assertRaises(socket.error) as cm:
1583 cli.connect((HOST, port))
1584 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1585
1586 def test_create_connection(self):
1587 # Issue #9792: errors raised by create_connection() should have
1588 # a proper errno attribute.
1589 port = support.find_unused_port()
1590 with self.assertRaises(socket.error) as cm:
1591 socket.create_connection((HOST, port))
1592 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1593
1594 def test_create_connection_timeout(self):
1595 # Issue #9792: create_connection() should not recast timeout errors
1596 # as generic socket errors.
1597 with self.mocked_socket_module():
1598 with self.assertRaises(socket.timeout):
1599 socket.create_connection((HOST, 1234))
1600
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601
Victor Stinner45df8202010-04-28 22:31:17 +00001602@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1604
1605 def __init__(self, methodName='runTest'):
1606 SocketTCPTest.__init__(self, methodName=methodName)
1607 ThreadableTest.__init__(self)
1608
1609 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001610 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001611
1612 def clientTearDown(self):
1613 self.cli.close()
1614 self.cli = None
1615 ThreadableTest.clientTearDown(self)
1616
1617 def _justAccept(self):
1618 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001619 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001620
1621 testFamily = _justAccept
1622 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001623 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001624 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001625 self.assertEqual(self.cli.family, 2)
1626
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001627 testSourceAddress = _justAccept
1628 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001629 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1630 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001631 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001632 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001633 # The port number being used is sufficient to show that the bind()
1634 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001635
Guido van Rossumd8faa362007-04-27 19:54:29 +00001636 testTimeoutDefault = _justAccept
1637 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001638 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001639 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001640 socket.setdefaulttimeout(42)
1641 try:
1642 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001643 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001644 finally:
1645 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001646 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001647
1648 testTimeoutNone = _justAccept
1649 def _testTimeoutNone(self):
1650 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001651 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001652 socket.setdefaulttimeout(30)
1653 try:
1654 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001655 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001656 finally:
1657 socket.setdefaulttimeout(None)
1658 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001659
1660 testTimeoutValueNamed = _justAccept
1661 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001662 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001663 self.assertEqual(self.cli.gettimeout(), 30)
1664
1665 testTimeoutValueNonamed = _justAccept
1666 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001667 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001668 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001669 self.assertEqual(self.cli.gettimeout(), 30)
1670
Victor Stinner45df8202010-04-28 22:31:17 +00001671@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001672class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1673
1674 def __init__(self, methodName='runTest'):
1675 SocketTCPTest.__init__(self, methodName=methodName)
1676 ThreadableTest.__init__(self)
1677
1678 def clientSetUp(self):
1679 pass
1680
1681 def clientTearDown(self):
1682 self.cli.close()
1683 self.cli = None
1684 ThreadableTest.clientTearDown(self)
1685
1686 def testInsideTimeout(self):
1687 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001688 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001689 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001690 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001691 testOutsideTimeout = testInsideTimeout
1692
1693 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001694 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001695 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001696 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001697
1698 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001699 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001700 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001701
1702
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001703class TCPTimeoutTest(SocketTCPTest):
1704
1705 def testTCPTimeout(self):
1706 def raise_timeout(*args, **kwargs):
1707 self.serv.settimeout(1.0)
1708 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001709 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001710 "Error generating a timeout exception (TCP)")
1711
1712 def testTimeoutZero(self):
1713 ok = False
1714 try:
1715 self.serv.settimeout(0.0)
1716 foo = self.serv.accept()
1717 except socket.timeout:
1718 self.fail("caught timeout instead of error (TCP)")
1719 except socket.error:
1720 ok = True
1721 except:
1722 self.fail("caught unexpected exception (TCP)")
1723 if not ok:
1724 self.fail("accept() returned success when we did not expect it")
1725
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001726 def testInterruptedTimeout(self):
1727 # XXX I don't know how to do this test on MSWindows or any other
1728 # plaform that doesn't support signal.alarm() or os.kill(), though
1729 # the bug should have existed on all platforms.
1730 if not hasattr(signal, "alarm"):
1731 return # can only test on *nix
1732 self.serv.settimeout(5.0) # must be longer than alarm
1733 class Alarm(Exception):
1734 pass
1735 def alarm_handler(signal, frame):
1736 raise Alarm
1737 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1738 try:
1739 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1740 try:
1741 foo = self.serv.accept()
1742 except socket.timeout:
1743 self.fail("caught timeout instead of Alarm")
1744 except Alarm:
1745 pass
1746 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001747 self.fail("caught other exception instead of Alarm:"
1748 " %s(%s):\n%s" %
1749 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001750 else:
1751 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001752 finally:
1753 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001754 except Alarm:
1755 self.fail("got Alarm in wrong place")
1756 finally:
1757 # no alarm can be pending. Safe to restore old handler.
1758 signal.signal(signal.SIGALRM, old_alarm)
1759
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001760class UDPTimeoutTest(SocketTCPTest):
1761
1762 def testUDPTimeout(self):
1763 def raise_timeout(*args, **kwargs):
1764 self.serv.settimeout(1.0)
1765 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001766 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001767 "Error generating a timeout exception (UDP)")
1768
1769 def testTimeoutZero(self):
1770 ok = False
1771 try:
1772 self.serv.settimeout(0.0)
1773 foo = self.serv.recv(1024)
1774 except socket.timeout:
1775 self.fail("caught timeout instead of error (UDP)")
1776 except socket.error:
1777 ok = True
1778 except:
1779 self.fail("caught unexpected exception (UDP)")
1780 if not ok:
1781 self.fail("recv() returned success when we did not expect it")
1782
1783class TestExceptions(unittest.TestCase):
1784
1785 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001786 self.assertTrue(issubclass(socket.error, Exception))
1787 self.assertTrue(issubclass(socket.herror, socket.error))
1788 self.assertTrue(issubclass(socket.gaierror, socket.error))
1789 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001790
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001791class TestLinuxAbstractNamespace(unittest.TestCase):
1792
1793 UNIX_PATH_MAX = 108
1794
1795 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001796 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001797 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1798 s1.bind(address)
1799 s1.listen(1)
1800 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1801 s2.connect(s1.getsockname())
1802 with s1.accept()[0] as s3:
1803 self.assertEqual(s1.getsockname(), address)
1804 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001805
1806 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001807 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001808 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1809 s.bind(address)
1810 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001811
1812 def testNameOverflow(self):
1813 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001814 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1815 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001816
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001817
Victor Stinner45df8202010-04-28 22:31:17 +00001818@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001819class BufferIOTest(SocketConnectedTest):
1820 """
1821 Test the buffer versions of socket.recv() and socket.send().
1822 """
1823 def __init__(self, methodName='runTest'):
1824 SocketConnectedTest.__init__(self, methodName=methodName)
1825
Antoine Pitrou25480782010-03-17 22:50:28 +00001826 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001827 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001828 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001829 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001830 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001831 self.assertEqual(msg, MSG)
1832
Antoine Pitrou25480782010-03-17 22:50:28 +00001833 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001834 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835 self.serv_conn.send(buf)
1836
Antoine Pitrou25480782010-03-17 22:50:28 +00001837 def testRecvIntoBytearray(self):
1838 buf = bytearray(1024)
1839 nbytes = self.cli_conn.recv_into(buf)
1840 self.assertEqual(nbytes, len(MSG))
1841 msg = buf[:len(MSG)]
1842 self.assertEqual(msg, MSG)
1843
1844 _testRecvIntoBytearray = _testRecvIntoArray
1845
1846 def testRecvIntoMemoryview(self):
1847 buf = bytearray(1024)
1848 nbytes = self.cli_conn.recv_into(memoryview(buf))
1849 self.assertEqual(nbytes, len(MSG))
1850 msg = buf[:len(MSG)]
1851 self.assertEqual(msg, MSG)
1852
1853 _testRecvIntoMemoryview = _testRecvIntoArray
1854
1855 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001856 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001857 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001858 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001859 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001860 self.assertEqual(msg, MSG)
1861
Antoine Pitrou25480782010-03-17 22:50:28 +00001862 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001863 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001864 self.serv_conn.send(buf)
1865
Antoine Pitrou25480782010-03-17 22:50:28 +00001866 def testRecvFromIntoBytearray(self):
1867 buf = bytearray(1024)
1868 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1869 self.assertEqual(nbytes, len(MSG))
1870 msg = buf[:len(MSG)]
1871 self.assertEqual(msg, MSG)
1872
1873 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1874
1875 def testRecvFromIntoMemoryview(self):
1876 buf = bytearray(1024)
1877 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1878 self.assertEqual(nbytes, len(MSG))
1879 msg = buf[:len(MSG)]
1880 self.assertEqual(msg, MSG)
1881
1882 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1883
Christian Heimes043d6f62008-01-07 17:19:16 +00001884
1885TIPC_STYPE = 2000
1886TIPC_LOWER = 200
1887TIPC_UPPER = 210
1888
1889def isTipcAvailable():
1890 """Check if the TIPC module is loaded
1891
1892 The TIPC module is not loaded automatically on Ubuntu and probably
1893 other Linux distros.
1894 """
1895 if not hasattr(socket, "AF_TIPC"):
1896 return False
1897 if not os.path.isfile("/proc/modules"):
1898 return False
1899 with open("/proc/modules") as f:
1900 for line in f:
1901 if line.startswith("tipc "):
1902 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001903 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001904 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1905 return False
1906
1907class TIPCTest (unittest.TestCase):
1908 def testRDM(self):
1909 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1910 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1911
1912 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1913 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1914 TIPC_LOWER, TIPC_UPPER)
1915 srv.bind(srvaddr)
1916
1917 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1918 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1919 cli.sendto(MSG, sendaddr)
1920
1921 msg, recvaddr = srv.recvfrom(1024)
1922
1923 self.assertEqual(cli.getsockname(), recvaddr)
1924 self.assertEqual(msg, MSG)
1925
1926
1927class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1928 def __init__(self, methodName = 'runTest'):
1929 unittest.TestCase.__init__(self, methodName = methodName)
1930 ThreadableTest.__init__(self)
1931
1932 def setUp(self):
1933 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1934 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1935 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1936 TIPC_LOWER, TIPC_UPPER)
1937 self.srv.bind(srvaddr)
1938 self.srv.listen(5)
1939 self.serverExplicitReady()
1940 self.conn, self.connaddr = self.srv.accept()
1941
1942 def clientSetUp(self):
1943 # The is a hittable race between serverExplicitReady() and the
1944 # accept() call; sleep a little while to avoid it, otherwise
1945 # we could get an exception
1946 time.sleep(0.1)
1947 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1948 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1949 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1950 self.cli.connect(addr)
1951 self.cliaddr = self.cli.getsockname()
1952
1953 def testStream(self):
1954 msg = self.conn.recv(1024)
1955 self.assertEqual(msg, MSG)
1956 self.assertEqual(self.cliaddr, self.connaddr)
1957
1958 def _testStream(self):
1959 self.cli.send(MSG)
1960 self.cli.close()
1961
1962
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001963@unittest.skipUnless(thread, 'Threading required for this test.')
1964class ContextManagersTest(ThreadedTCPSocketTest):
1965
1966 def _testSocketClass(self):
1967 # base test
1968 with socket.socket() as sock:
1969 self.assertFalse(sock._closed)
1970 self.assertTrue(sock._closed)
1971 # close inside with block
1972 with socket.socket() as sock:
1973 sock.close()
1974 self.assertTrue(sock._closed)
1975 # exception inside with block
1976 with socket.socket() as sock:
1977 self.assertRaises(socket.error, sock.sendall, b'foo')
1978 self.assertTrue(sock._closed)
1979
1980 def testCreateConnectionBase(self):
1981 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001982 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001983 data = conn.recv(1024)
1984 conn.sendall(data)
1985
1986 def _testCreateConnectionBase(self):
1987 address = self.serv.getsockname()
1988 with socket.create_connection(address) as sock:
1989 self.assertFalse(sock._closed)
1990 sock.sendall(b'foo')
1991 self.assertEqual(sock.recv(1024), b'foo')
1992 self.assertTrue(sock._closed)
1993
1994 def testCreateConnectionClose(self):
1995 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001996 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001997 data = conn.recv(1024)
1998 conn.sendall(data)
1999
2000 def _testCreateConnectionClose(self):
2001 address = self.serv.getsockname()
2002 with socket.create_connection(address) as sock:
2003 sock.close()
2004 self.assertTrue(sock._closed)
2005 self.assertRaises(socket.error, sock.sendall, b'foo')
2006
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002007
Antoine Pitroub1c54962010-10-14 15:05:38 +00002008@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
2009 "SOCK_CLOEXEC not defined")
2010@unittest.skipUnless(fcntl, "module fcntl not available")
2011class CloexecConstantTest(unittest.TestCase):
2012 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002013 v = linux_version()
2014 if v < (2, 6, 28):
2015 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2016 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002017 with socket.socket(socket.AF_INET,
2018 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2019 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2020 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002021
2022
2023@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2024 "SOCK_NONBLOCK not defined")
2025class NonblockConstantTest(unittest.TestCase):
2026 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2027 if nonblock:
2028 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2029 self.assertEqual(s.gettimeout(), timeout)
2030 else:
2031 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2032 self.assertEqual(s.gettimeout(), None)
2033
2034 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002035 v = linux_version()
2036 if v < (2, 6, 28):
2037 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2038 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002039 # a lot of it seems silly and redundant, but I wanted to test that
2040 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002041 with socket.socket(socket.AF_INET,
2042 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2043 self.checkNonblock(s)
2044 s.setblocking(1)
2045 self.checkNonblock(s, False)
2046 s.setblocking(0)
2047 self.checkNonblock(s)
2048 s.settimeout(None)
2049 self.checkNonblock(s, False)
2050 s.settimeout(2.0)
2051 self.checkNonblock(s, timeout=2.0)
2052 s.setblocking(1)
2053 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002054 # defaulttimeout
2055 t = socket.getdefaulttimeout()
2056 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002057 with socket.socket() as s:
2058 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002059 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002060 with socket.socket() as s:
2061 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002062 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002063 with socket.socket() as s:
2064 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002065 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002066 with socket.socket() as s:
2067 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002068 socket.setdefaulttimeout(t)
2069
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002070
Guido van Rossumb995eb72002-07-31 16:08:40 +00002071def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002072 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002073 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002074
2075 tests.extend([
2076 NonBlockingTCPTests,
2077 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002078 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002079 UnbufferedFileObjectClassTestCase,
2080 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002081 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002082 UnicodeReadFileObjectClassTestCase,
2083 UnicodeWriteFileObjectClassTestCase,
2084 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002085 NetworkConnectionNoServer,
2086 NetworkConnectionAttributesTest,
2087 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002088 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002089 CloexecConstantTest,
2090 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002091 ])
Dave Cole331708b2004-08-09 04:51:41 +00002092 if hasattr(socket, "socketpair"):
2093 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002094 if sys.platform == 'linux2':
2095 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002096 if isTipcAvailable():
2097 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002098 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002099
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002100 thread_info = support.threading_setup()
2101 support.run_unittest(*tests)
2102 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002103
2104if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002105 test_main()