blob: 59e3019f5eb9a52fab94816721be207f4694ba0a [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
Benjamin Petersonee8712c2008-05-20 21:35:26 +000027HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000028MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Victor Stinner45df8202010-04-28 22:31:17 +000030try:
31 import _thread as thread
32 import threading
33except ImportError:
34 thread = None
35 threading = None
36
Guido van Rossum24e4af82002-06-12 19:18:08 +000037class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000038
Guido van Rossum24e4af82002-06-12 19:18:08 +000039 def setUp(self):
40 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000041 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000042 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000043
Guido van Rossum24e4af82002-06-12 19:18:08 +000044 def tearDown(self):
45 self.serv.close()
46 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000047
Guido van Rossum24e4af82002-06-12 19:18:08 +000048class SocketUDPTest(unittest.TestCase):
49
50 def setUp(self):
51 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000052 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000053
54 def tearDown(self):
55 self.serv.close()
56 self.serv = None
57
58class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000059 """Threadable Test class
60
61 The ThreadableTest class makes it easy to create a threaded
62 client/server pair from an existing unit test. To create a
63 new threaded class from an existing unit test, use multiple
64 inheritance:
65
66 class NewClass (OldClass, ThreadableTest):
67 pass
68
69 This class defines two new fixture functions with obvious
70 purposes for overriding:
71
72 clientSetUp ()
73 clientTearDown ()
74
75 Any new test functions within the class must then define
76 tests in pairs, where the test name is preceeded with a
77 '_' to indicate the client portion of the test. Ex:
78
79 def testFoo(self):
80 # Server portion
81
82 def _testFoo(self):
83 # Client portion
84
85 Any exceptions raised by the clients during their tests
86 are caught and transferred to the main thread to alert
87 the testing framework.
88
89 Note, the server setup function cannot call any blocking
90 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000091 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000092 the blocking call (such as in setting up a client/server
93 connection and performing the accept() in setUp().
94 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000095
96 def __init__(self):
97 # Swap the true setup function
98 self.__setUp = self.setUp
99 self.__tearDown = self.tearDown
100 self.setUp = self._setUp
101 self.tearDown = self._tearDown
102
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000103 def serverExplicitReady(self):
104 """This method allows the server to explicitly indicate that
105 it wants the client thread to proceed. This is useful if the
106 server is about to execute a blocking routine that is
107 dependent upon the client thread during its setup routine."""
108 self.server_ready.set()
109
Guido van Rossum24e4af82002-06-12 19:18:08 +0000110 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 self.server_ready = threading.Event()
112 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000113 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000114 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000117 methodname = self.id()
118 i = methodname.rfind('.')
119 methodname = methodname[i+1:]
120 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000121 self.client_thread = thread.start_new_thread(
122 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123
124 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000125 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000126 self.server_ready.set()
127 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000128
129 def _tearDown(self):
130 self.__tearDown()
131 self.done.wait()
132
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000133 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000134 exc = self.queue.get()
135 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000138 self.server_ready.wait()
139 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000140 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000141 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000142 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143 try:
144 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000145 except BaseException as e:
146 self.queue.put(e)
147 finally:
148 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149
150 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000151 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000152
153 def clientTearDown(self):
154 self.done.set()
155 thread.exit()
156
157class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
158
159 def __init__(self, methodName='runTest'):
160 SocketTCPTest.__init__(self, methodName=methodName)
161 ThreadableTest.__init__(self)
162
163 def clientSetUp(self):
164 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
165
166 def clientTearDown(self):
167 self.cli.close()
168 self.cli = None
169 ThreadableTest.clientTearDown(self)
170
171class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
172
173 def __init__(self, methodName='runTest'):
174 SocketUDPTest.__init__(self, methodName=methodName)
175 ThreadableTest.__init__(self)
176
177 def clientSetUp(self):
178 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
179
Brian Curtin3beb38f2010-11-04 03:41:43 +0000180 def clientTearDown(self):
181 self.cli.close()
182 self.cli = None
183 ThreadableTest.clientTearDown(self)
184
Guido van Rossum24e4af82002-06-12 19:18:08 +0000185class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000186 """Socket tests for client-server connection.
187
188 self.cli_conn is a client socket connected to the server. The
189 setUp() method guarantees that it is connected to the server.
190 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000191
192 def __init__(self, methodName='runTest'):
193 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
194
195 def setUp(self):
196 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000197 # Indicate explicitly we're ready for the client thread to
198 # proceed and then perform the blocking call to accept
199 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000200 conn, addr = self.serv.accept()
201 self.cli_conn = conn
202
203 def tearDown(self):
204 self.cli_conn.close()
205 self.cli_conn = None
206 ThreadedTCPSocketTest.tearDown(self)
207
208 def clientSetUp(self):
209 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000210 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211 self.serv_conn = self.cli
212
213 def clientTearDown(self):
214 self.serv_conn.close()
215 self.serv_conn = None
216 ThreadedTCPSocketTest.clientTearDown(self)
217
Dave Cole331708b2004-08-09 04:51:41 +0000218class SocketPairTest(unittest.TestCase, ThreadableTest):
219
220 def __init__(self, methodName='runTest'):
221 unittest.TestCase.__init__(self, methodName=methodName)
222 ThreadableTest.__init__(self)
223
224 def setUp(self):
225 self.serv, self.cli = socket.socketpair()
226
227 def tearDown(self):
228 self.serv.close()
229 self.serv = None
230
231 def clientSetUp(self):
232 pass
233
234 def clientTearDown(self):
235 self.cli.close()
236 self.cli = None
237 ThreadableTest.clientTearDown(self)
238
Tim Peters494aaee2004-08-09 18:54:11 +0000239
Guido van Rossum24e4af82002-06-12 19:18:08 +0000240#######################################################################
241## Begin Tests
242
243class GeneralModuleTests(unittest.TestCase):
244
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000245 def test_repr(self):
246 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000247 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000248 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000249
Raymond Hettinger027bb632004-05-31 03:09:25 +0000250 def test_weakref(self):
251 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
252 p = proxy(s)
253 self.assertEqual(p.fileno(), s.fileno())
254 s.close()
255 s = None
256 try:
257 p.fileno()
258 except ReferenceError:
259 pass
260 else:
261 self.fail('Socket proxy still exists')
262
Guido van Rossum24e4af82002-06-12 19:18:08 +0000263 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000264 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300265 msg = "Error raising socket exception (%s)."
266 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300268 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000269 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300270 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272
Ezio Melotti63e42302011-05-07 19:47:48 +0300273 def testSendtoErrors(self):
274 # Testing that sendto doens't masks failures. See #10169.
275 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
276 self.addCleanup(s.close)
277 s.bind(('', 0))
278 sockname = s.getsockname()
279 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300280 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300281 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300282 self.assertEqual(str(cm.exception),
283 "'str' does not support the buffer interface")
284 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300285 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300286 self.assertEqual(str(cm.exception),
287 "'complex' does not support the buffer interface")
288 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300289 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300290 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300291 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300292 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300293 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300294 self.assertEqual(str(cm.exception),
295 "'str' does not support the buffer interface")
296 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300297 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300298 self.assertEqual(str(cm.exception),
299 "'complex' does not support the buffer interface")
300 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300301 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300302 self.assertIn('not NoneType', str(cm.exception))
303 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300304 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300305 self.assertIn('an integer is required', str(cm.exception))
306 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300307 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300308 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300309 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300310 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300311 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300312 self.assertIn('(1 given)', str(cm.exception))
313 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300314 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300315 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300316
Guido van Rossum24e4af82002-06-12 19:18:08 +0000317 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000318 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000319 socket.AF_INET
320 socket.SOCK_STREAM
321 socket.SOCK_DGRAM
322 socket.SOCK_RAW
323 socket.SOCK_RDM
324 socket.SOCK_SEQPACKET
325 socket.SOL_SOCKET
326 socket.SO_REUSEADDR
327
Guido van Rossum654c11e2002-06-13 20:24:17 +0000328 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000329 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000330 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000331 try:
332 ip = socket.gethostbyname(hostname)
333 except socket.error:
334 # Probably name lookup wasn't set up right; skip this test
335 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000336 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000337 try:
338 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
339 except socket.error:
340 # Probably a similar problem as above; skip this test
341 return
Brett Cannon01668a12005-03-11 00:04:17 +0000342 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000343 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000344 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000345 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000346
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000347 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
348 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
349 def test_sethostname(self):
350 oldhn = socket.gethostname()
351 try:
352 socket.sethostname('new')
353 except socket.error as e:
354 if e.errno == errno.EPERM:
355 self.skipTest("test should be run as root")
356 else:
357 raise
358 try:
359 # running test as root!
360 self.assertEqual(socket.gethostname(), 'new')
361 # Should work with bytes objects too
362 socket.sethostname(b'bar')
363 self.assertEqual(socket.gethostname(), 'bar')
364 finally:
365 socket.sethostname(oldhn)
366
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700367 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
368 'socket.if_nameindex() not available.')
369 def testInterfaceNameIndex(self):
370 interfaces = socket.if_nameindex()
371 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200372 self.assertIsInstance(index, int)
373 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700374 # interface indices are non-zero integers
375 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200376 _index = socket.if_nametoindex(name)
377 self.assertIsInstance(_index, int)
378 self.assertEqual(index, _index)
379 _name = socket.if_indextoname(index)
380 self.assertIsInstance(_name, str)
381 self.assertEqual(name, _name)
382
383 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
384 'socket.if_nameindex() not available.')
385 def testInvalidInterfaceNameIndex(self):
386 # test nonexistent interface index/name
387 self.assertRaises(socket.error, socket.if_indextoname, 0)
388 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
389 # test with invalid values
390 self.assertRaises(TypeError, socket.if_nametoindex, 0)
391 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700392
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000393 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000394 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000395 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000396 try:
397 # On some versions, this loses a reference
398 orig = sys.getrefcount(__name__)
399 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000400 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000401 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000402 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000403
Guido van Rossum24e4af82002-06-12 19:18:08 +0000404 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000405 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000406 try:
407 # On some versions, this crashes the interpreter.
408 socket.getnameinfo(('x', 0, 0, 0), 0)
409 except socket.error:
410 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000411
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000412 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000413 # This just checks that htons etc. are their own inverse,
414 # when looking at the lower 16 or 32 bits.
415 sizes = {socket.htonl: 32, socket.ntohl: 32,
416 socket.htons: 16, socket.ntohs: 16}
417 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000418 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000419 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
420 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000421
Guido van Rossuma2627af2002-09-14 00:58:46 +0000422 swapped = func(mask)
423 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000424 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000425
Guido van Rossum018919a2007-01-15 00:07:32 +0000426 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000427 good_values = [ 1, 2, 3, 1, 2, 3 ]
428 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000429 for k in good_values:
430 socket.ntohl(k)
431 socket.ntohs(k)
432 socket.htonl(k)
433 socket.htons(k)
434 for k in bad_values:
435 self.assertRaises(OverflowError, socket.ntohl, k)
436 self.assertRaises(OverflowError, socket.ntohs, k)
437 self.assertRaises(OverflowError, socket.htonl, k)
438 self.assertRaises(OverflowError, socket.htons, k)
439
Barry Warsaw11b91a02004-06-28 00:50:43 +0000440 def testGetServBy(self):
441 eq = self.assertEqual
442 # Find one service that exists, then check all the related interfaces.
443 # I've ordered this by protocols that have both a tcp and udp
444 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000445 if (sys.platform.startswith('linux') or
446 sys.platform.startswith('freebsd') or
447 sys.platform.startswith('netbsd') or
448 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000449 # avoid the 'echo' service on this platform, as there is an
450 # assumption breaking non-standard port/protocol entry
451 services = ('daytime', 'qotd', 'domain')
452 else:
453 services = ('echo', 'daytime', 'domain')
454 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000455 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000456 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000457 break
458 except socket.error:
459 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000460 else:
461 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000462 # Try same call with optional protocol omitted
463 port2 = socket.getservbyname(service)
464 eq(port, port2)
465 # Try udp, but don't barf it it doesn't exist
466 try:
467 udpport = socket.getservbyname(service, 'udp')
468 except socket.error:
469 udpport = None
470 else:
471 eq(udpport, port)
472 # Now make sure the lookup by port returns the same service name
473 eq(socket.getservbyport(port2), service)
474 eq(socket.getservbyport(port, 'tcp'), service)
475 if udpport is not None:
476 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000477 # Make sure getservbyport does not accept out of range ports.
478 self.assertRaises(OverflowError, socket.getservbyport, -1)
479 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000480
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000481 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000482 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000483 # The default timeout should initially be None
484 self.assertEqual(socket.getdefaulttimeout(), None)
485 s = socket.socket()
486 self.assertEqual(s.gettimeout(), None)
487 s.close()
488
489 # Set the default timeout to 10, and see if it propagates
490 socket.setdefaulttimeout(10)
491 self.assertEqual(socket.getdefaulttimeout(), 10)
492 s = socket.socket()
493 self.assertEqual(s.gettimeout(), 10)
494 s.close()
495
496 # Reset the default timeout to None, and see if it propagates
497 socket.setdefaulttimeout(None)
498 self.assertEqual(socket.getdefaulttimeout(), None)
499 s = socket.socket()
500 self.assertEqual(s.gettimeout(), None)
501 s.close()
502
503 # Check that setting it to an invalid value raises ValueError
504 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
505
506 # Check that setting it to an invalid type raises TypeError
507 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
508
Benjamin Petersonf91df042009-02-13 02:50:59 +0000509 def testIPv4_inet_aton_fourbytes(self):
510 if not hasattr(socket, 'inet_aton'):
511 return # No inet_aton, nothing to check
512 # Test that issue1008086 and issue767150 are fixed.
513 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000514 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
515 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000516
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000517 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000518 if not hasattr(socket, 'inet_pton'):
519 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000520 from socket import inet_aton as f, inet_pton, AF_INET
521 g = lambda a: inet_pton(AF_INET, a)
522
Ezio Melottib3aedd42010-11-20 19:04:17 +0000523 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
524 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
525 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
526 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
527 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000528
Ezio Melottib3aedd42010-11-20 19:04:17 +0000529 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
530 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
531 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
532 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000533
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000534 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000535 if not hasattr(socket, 'inet_pton'):
536 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000537 try:
538 from socket import inet_pton, AF_INET6, has_ipv6
539 if not has_ipv6:
540 return
541 except ImportError:
542 return
543 f = lambda a: inet_pton(AF_INET6, a)
544
Ezio Melottib3aedd42010-11-20 19:04:17 +0000545 self.assertEqual(b'\x00' * 16, f('::'))
546 self.assertEqual(b'\x00' * 16, f('0::0'))
547 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
548 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000549 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 +0000550 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
551 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000552
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000553 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000554 if not hasattr(socket, 'inet_ntop'):
555 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000556 from socket import inet_ntoa as f, inet_ntop, AF_INET
557 g = lambda a: inet_ntop(AF_INET, a)
558
Ezio Melottib3aedd42010-11-20 19:04:17 +0000559 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
560 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
561 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
562 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000563
Ezio Melottib3aedd42010-11-20 19:04:17 +0000564 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
565 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
566 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000567
568 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000569 if not hasattr(socket, 'inet_ntop'):
570 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000571 try:
572 from socket import inet_ntop, AF_INET6, has_ipv6
573 if not has_ipv6:
574 return
575 except ImportError:
576 return
577 f = lambda a: inet_ntop(AF_INET6, a)
578
Ezio Melottib3aedd42010-11-20 19:04:17 +0000579 self.assertEqual('::', f(b'\x00' * 16))
580 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
581 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000582 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000583 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 +0000584 )
585
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000586 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000587
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000588 def testSockName(self):
589 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200590 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000591 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000592 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000593 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000594 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000595 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
596 # it reasonable to get the host's addr in addition to 0.0.0.0.
597 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000598 try:
599 my_ip_addr = socket.gethostbyname(socket.gethostname())
600 except socket.error:
601 # Probably name lookup wasn't set up right; skip this test
602 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000603 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000604 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000605
606 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000607 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000608 # We know a socket should start without reuse==0
609 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000610 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000612 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613
614 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000615 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000617 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000618 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
619 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000620 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000622 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000623 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000624 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
625 sock.settimeout(1)
626 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000627 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000628
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000629 def testNewAttributes(self):
630 # testing .family, .type and .protocol
631 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
632 self.assertEqual(sock.family, socket.AF_INET)
633 self.assertEqual(sock.type, socket.SOCK_STREAM)
634 self.assertEqual(sock.proto, 0)
635 sock.close()
636
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000637 def test_getsockaddrarg(self):
638 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200639 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000640 big_port = port + 65536
641 neg_port = port - 65536
642 sock = socket.socket()
643 try:
644 self.assertRaises(OverflowError, sock.bind, (host, big_port))
645 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
646 sock.bind((host, port))
647 finally:
648 sock.close()
649
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000650 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000651 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000652 self.assertTrue(hasattr(socket.socket, 'ioctl'))
653 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
654 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
655 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000656 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
657 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000658 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000659 self.assertRaises(ValueError, s.ioctl, -1, None)
660 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000661
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000662 def testGetaddrinfo(self):
663 try:
664 socket.getaddrinfo('localhost', 80)
665 except socket.gaierror as err:
666 if err.errno == socket.EAI_SERVICE:
667 # see http://bugs.python.org/issue1282647
668 self.skipTest("buggy libc version")
669 raise
670 # len of every sequence is supposed to be == 5
671 for info in socket.getaddrinfo(HOST, None):
672 self.assertEqual(len(info), 5)
673 # host can be a domain name, a string representation of an
674 # IPv4/v6 address or None
675 socket.getaddrinfo('localhost', 80)
676 socket.getaddrinfo('127.0.0.1', 80)
677 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200678 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000679 socket.getaddrinfo('::1', 80)
680 # port can be a string service name such as "http", a numeric
681 # port number or None
682 socket.getaddrinfo(HOST, "http")
683 socket.getaddrinfo(HOST, 80)
684 socket.getaddrinfo(HOST, None)
685 # test family and socktype filters
686 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
687 for family, _, _, _, _ in infos:
688 self.assertEqual(family, socket.AF_INET)
689 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
690 for _, socktype, _, _, _ in infos:
691 self.assertEqual(socktype, socket.SOCK_STREAM)
692 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000693 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000694 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
695 # a server willing to support both IPv4 and IPv6 will
696 # usually do this
697 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
698 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000699 # test keyword arguments
700 a = socket.getaddrinfo(HOST, None)
701 b = socket.getaddrinfo(host=HOST, port=None)
702 self.assertEqual(a, b)
703 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
704 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
705 self.assertEqual(a, b)
706 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
707 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
708 self.assertEqual(a, b)
709 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
710 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
711 self.assertEqual(a, b)
712 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
713 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
714 self.assertEqual(a, b)
715 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
716 socket.AI_PASSIVE)
717 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
718 type=socket.SOCK_STREAM, proto=0,
719 flags=socket.AI_PASSIVE)
720 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000721 # Issue #6697.
722 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000723
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000724 def test_getnameinfo(self):
725 # only IP addresses are allowed
726 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
727
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000728 @unittest.skipUnless(support.is_resource_enabled('network'),
729 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000730 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000731 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000732 # these should all be successful
733 socket.gethostbyname('испытание.python.org')
734 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000735 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
736 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
737 # have a reverse entry yet
738 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000739
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000740 def check_sendall_interrupted(self, with_timeout):
741 # socketpair() is not stricly required, but it makes things easier.
742 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
743 self.skipTest("signal.alarm and socket.socketpair required for this test")
744 # Our signal handlers clobber the C errno by calling a math function
745 # with an invalid domain value.
746 def ok_handler(*args):
747 self.assertRaises(ValueError, math.acosh, 0)
748 def raising_handler(*args):
749 self.assertRaises(ValueError, math.acosh, 0)
750 1 // 0
751 c, s = socket.socketpair()
752 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
753 try:
754 if with_timeout:
755 # Just above the one second minimum for signal.alarm
756 c.settimeout(1.5)
757 with self.assertRaises(ZeroDivisionError):
758 signal.alarm(1)
759 c.sendall(b"x" * (1024**2))
760 if with_timeout:
761 signal.signal(signal.SIGALRM, ok_handler)
762 signal.alarm(1)
763 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
764 finally:
765 signal.signal(signal.SIGALRM, old_alarm)
766 c.close()
767 s.close()
768
769 def test_sendall_interrupted(self):
770 self.check_sendall_interrupted(False)
771
772 def test_sendall_interrupted_with_timeout(self):
773 self.check_sendall_interrupted(True)
774
Antoine Pitroue033e062010-10-29 10:38:18 +0000775 def test_dealloc_warn(self):
776 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
777 r = repr(sock)
778 with self.assertWarns(ResourceWarning) as cm:
779 sock = None
780 support.gc_collect()
781 self.assertIn(r, str(cm.warning.args[0]))
782 # An open socket file object gets dereferenced after the socket
783 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
784 f = sock.makefile('rb')
785 r = repr(sock)
786 sock = None
787 support.gc_collect()
788 with self.assertWarns(ResourceWarning):
789 f = None
790 support.gc_collect()
791
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000792 def test_name_closed_socketio(self):
793 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
794 fp = sock.makefile("rb")
795 fp.close()
796 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
797
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100798 def test_pickle(self):
799 sock = socket.socket()
800 with sock:
801 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
802 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
803
Antoine Pitrou3cade992011-05-10 19:19:13 +0200804 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200805 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
806 srv.bind((HOST, 0))
807 # backlog = 0
808 srv.listen(0)
809 srv.close()
810
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000811
Victor Stinner45df8202010-04-28 22:31:17 +0000812@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813class BasicTCPTest(SocketConnectedTest):
814
815 def __init__(self, methodName='runTest'):
816 SocketConnectedTest.__init__(self, methodName=methodName)
817
818 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000819 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000821 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822
823 def _testRecv(self):
824 self.serv_conn.send(MSG)
825
826 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000827 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 seg1 = self.cli_conn.recv(len(MSG) - 3)
829 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000830 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000831 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832
833 def _testOverFlowRecv(self):
834 self.serv_conn.send(MSG)
835
836 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000837 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000839 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840
841 def _testRecvFrom(self):
842 self.serv_conn.send(MSG)
843
844 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000845 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
847 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000848 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000849 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850
851 def _testOverFlowRecvFrom(self):
852 self.serv_conn.send(MSG)
853
854 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000855 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000856 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 while 1:
858 read = self.cli_conn.recv(1024)
859 if not read:
860 break
Guido van Rossume531e292002-08-08 20:28:34 +0000861 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000862 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863
864 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000865 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 self.serv_conn.sendall(big_chunk)
867
868 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000869 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 fd = self.cli_conn.fileno()
871 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000872 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000873 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000875 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876
877 def _testFromFd(self):
878 self.serv_conn.send(MSG)
879
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000880 def testDup(self):
881 # Testing dup()
882 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000883 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000884 msg = sock.recv(1024)
885 self.assertEqual(msg, MSG)
886
887 def _testDup(self):
888 self.serv_conn.send(MSG)
889
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000891 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000893 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000894 # wait for _testShutdown to finish: on OS X, when the server
895 # closes the connection the client also becomes disconnected,
896 # and the client's shutdown call will fail. (Issue #4397.)
897 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000898
899 def _testShutdown(self):
900 self.serv_conn.send(MSG)
901 self.serv_conn.shutdown(2)
902
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000903 def testDetach(self):
904 # Testing detach()
905 fileno = self.cli_conn.fileno()
906 f = self.cli_conn.detach()
907 self.assertEqual(f, fileno)
908 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000909 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
910 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000911 # ...but we can create another socket using the (still open)
912 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000913 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000914 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000915 msg = sock.recv(1024)
916 self.assertEqual(msg, MSG)
917
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000918 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000919 self.serv_conn.send(MSG)
920
Victor Stinner45df8202010-04-28 22:31:17 +0000921@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922class BasicUDPTest(ThreadedUDPSocketTest):
923
924 def __init__(self, methodName='runTest'):
925 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
926
927 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000928 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000930 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
932 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000933 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934
Guido van Rossum1c938012002-06-12 21:17:20 +0000935 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000936 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000938 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000939
Guido van Rossum1c938012002-06-12 21:17:20 +0000940 def _testRecvFrom(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 Rossumd8faa362007-04-27 19:54:29 +0000943 def testRecvFromNegative(self):
944 # Negative lengths passed to recvfrom should give ValueError.
945 self.assertRaises(ValueError, self.serv.recvfrom, -1)
946
947 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000948 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000949
Victor Stinner45df8202010-04-28 22:31:17 +0000950@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000951class TCPCloserTest(ThreadedTCPSocketTest):
952
953 def testClose(self):
954 conn, addr = self.serv.accept()
955 conn.close()
956
957 sd = self.cli
958 read, write, err = select.select([sd], [], [], 1.0)
959 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000960 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000961
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000962 # Calling close() many times should be safe.
963 conn.close()
964 conn.close()
965
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000966 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000967 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000968 time.sleep(1.0)
969
Victor Stinner45df8202010-04-28 22:31:17 +0000970@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000971class BasicSocketPairTest(SocketPairTest):
972
973 def __init__(self, methodName='runTest'):
974 SocketPairTest.__init__(self, methodName=methodName)
975
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000976 def _check_defaults(self, sock):
977 self.assertIsInstance(sock, socket.socket)
978 if hasattr(socket, 'AF_UNIX'):
979 self.assertEqual(sock.family, socket.AF_UNIX)
980 else:
981 self.assertEqual(sock.family, socket.AF_INET)
982 self.assertEqual(sock.type, socket.SOCK_STREAM)
983 self.assertEqual(sock.proto, 0)
984
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000985 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000986 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000987
988 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000989 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000990
Dave Cole331708b2004-08-09 04:51:41 +0000991 def testRecv(self):
992 msg = self.serv.recv(1024)
993 self.assertEqual(msg, MSG)
994
995 def _testRecv(self):
996 self.cli.send(MSG)
997
998 def testSend(self):
999 self.serv.send(MSG)
1000
1001 def _testSend(self):
1002 msg = self.cli.recv(1024)
1003 self.assertEqual(msg, MSG)
1004
Victor Stinner45df8202010-04-28 22:31:17 +00001005@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001006class NonBlockingTCPTests(ThreadedTCPSocketTest):
1007
1008 def __init__(self, methodName='runTest'):
1009 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1010
1011 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001012 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001013 self.serv.setblocking(0)
1014 start = time.time()
1015 try:
1016 self.serv.accept()
1017 except socket.error:
1018 pass
1019 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001020 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001021
1022 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001023 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001024
Antoine Pitroub1c54962010-10-14 15:05:38 +00001025 if hasattr(socket, "SOCK_NONBLOCK"):
1026 def testInitNonBlocking(self):
Victor Stinnerfea0f4d2011-05-24 00:24:19 +02001027 v = support.linux_version()
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001028 if v < (2, 6, 28):
1029 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1030 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001031 # reinit server socket
1032 self.serv.close()
1033 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001034 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001035 self.port = support.bind_port(self.serv)
1036 self.serv.listen(1)
1037 # actual testing
1038 start = time.time()
1039 try:
1040 self.serv.accept()
1041 except socket.error:
1042 pass
1043 end = time.time()
1044 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1045
1046 def _testInitNonBlocking(self):
1047 pass
1048
Antoine Pitrou600232b2011-01-05 21:03:42 +00001049 def testInheritFlags(self):
1050 # Issue #7995: when calling accept() on a listening socket with a
1051 # timeout, the resulting socket should not be non-blocking.
1052 self.serv.settimeout(10)
1053 try:
1054 conn, addr = self.serv.accept()
1055 message = conn.recv(len(MSG))
1056 finally:
1057 conn.close()
1058 self.serv.settimeout(None)
1059
1060 def _testInheritFlags(self):
1061 time.sleep(0.1)
1062 self.cli.connect((HOST, self.port))
1063 time.sleep(0.5)
1064 self.cli.send(MSG)
1065
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001067 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001068 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001069 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070 conn, addr = self.serv.accept()
1071 except socket.error:
1072 pass
1073 else:
1074 self.fail("Error trying to do non-blocking accept.")
1075 read, write, err = select.select([self.serv], [], [])
1076 if self.serv in read:
1077 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001078 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001079 else:
1080 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001081
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001083 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001084 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001085
1086 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001087 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001088 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001089 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001090
1091 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001092 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001093 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001094
1095 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001096 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097 conn, addr = self.serv.accept()
1098 conn.setblocking(0)
1099 try:
1100 msg = conn.recv(len(MSG))
1101 except socket.error:
1102 pass
1103 else:
1104 self.fail("Error trying to do non-blocking recv.")
1105 read, write, err = select.select([conn], [], [])
1106 if conn in read:
1107 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001108 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001109 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001110 else:
1111 self.fail("Error during select call to non-blocking socket.")
1112
1113 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001114 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001115 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001116 self.cli.send(MSG)
1117
Victor Stinner45df8202010-04-28 22:31:17 +00001118@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001119class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001120 """Unit tests for the object returned by socket.makefile()
1121
Antoine Pitrou834bd812010-10-13 16:17:14 +00001122 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001123 the client connection. You can read from this file to
1124 get output from the server.
1125
Antoine Pitrou834bd812010-10-13 16:17:14 +00001126 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001127 server connection. You can write to this file to send output
1128 to the client.
1129 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001130
Guido van Rossume9f66142002-08-07 15:46:19 +00001131 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001132 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001133 errors = 'strict'
1134 newline = None
1135
1136 read_mode = 'rb'
1137 read_msg = MSG
1138 write_mode = 'wb'
1139 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001140
Guido van Rossum24e4af82002-06-12 19:18:08 +00001141 def __init__(self, methodName='runTest'):
1142 SocketConnectedTest.__init__(self, methodName=methodName)
1143
1144 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001145 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1146 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001147 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001148 self.read_file = self.cli_conn.makefile(
1149 self.read_mode, self.bufsize,
1150 encoding = self.encoding,
1151 errors = self.errors,
1152 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001153
1154 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001155 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001156 self.read_file.close()
1157 self.assertTrue(self.read_file.closed)
1158 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001159 SocketConnectedTest.tearDown(self)
1160
1161 def clientSetUp(self):
1162 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001163 self.write_file = self.serv_conn.makefile(
1164 self.write_mode, self.bufsize,
1165 encoding = self.encoding,
1166 errors = self.errors,
1167 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001168
1169 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001170 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001171 self.write_file.close()
1172 self.assertTrue(self.write_file.closed)
1173 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001174 SocketConnectedTest.clientTearDown(self)
1175
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001176 def testReadAfterTimeout(self):
1177 # Issue #7322: A file object must disallow further reads
1178 # after a timeout has occurred.
1179 self.cli_conn.settimeout(1)
1180 self.read_file.read(3)
1181 # First read raises a timeout
1182 self.assertRaises(socket.timeout, self.read_file.read, 1)
1183 # Second read is disallowed
1184 with self.assertRaises(IOError) as ctx:
1185 self.read_file.read(1)
1186 self.assertIn("cannot read from timed out object", str(ctx.exception))
1187
1188 def _testReadAfterTimeout(self):
1189 self.write_file.write(self.write_msg[0:3])
1190 self.write_file.flush()
1191 self.serv_finished.wait()
1192
Guido van Rossum24e4af82002-06-12 19:18:08 +00001193 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001194 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001195 first_seg = self.read_file.read(len(self.read_msg)-3)
1196 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001197 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001198 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001199
1200 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001201 self.write_file.write(self.write_msg)
1202 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001203
Guido van Rossum8c943832002-08-08 01:00:28 +00001204 def testFullRead(self):
1205 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001206 msg = self.read_file.read()
1207 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001208
1209 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001210 self.write_file.write(self.write_msg)
1211 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001212
Guido van Rossum24e4af82002-06-12 19:18:08 +00001213 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001214 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001215 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001216 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001217 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001218 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001219 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001220 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001221 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001222
1223 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001224 self.write_file.write(self.write_msg)
1225 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001226
1227 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001228 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001229 line = self.read_file.readline()
1230 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001231
1232 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001233 self.write_file.write(self.write_msg)
1234 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001235
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001236 def testCloseAfterMakefile(self):
1237 # The file returned by makefile should keep the socket open.
1238 self.cli_conn.close()
1239 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001240 msg = self.read_file.read()
1241 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001242
1243 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001244 self.write_file.write(self.write_msg)
1245 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001246
1247 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001248 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001249 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001250 if isinstance(self.read_msg, str):
1251 msg = msg.decode()
1252 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001253
1254 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001255 self.write_file.write(self.write_msg)
1256 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001257
Tim Peters116d83c2004-03-28 02:20:45 +00001258 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001259 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001260
1261 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001262 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001263
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001264 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001265 self.assertEqual(self.read_file.mode, self.read_mode)
1266 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001267
1268 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001269 self.assertEqual(self.write_file.mode, self.write_mode)
1270 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001271
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001272 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001273 self.read_file.close()
1274 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001275 self.cli_conn.close()
1276 self.assertRaises(socket.error, self.cli_conn.getsockname)
1277
1278 def _testRealClose(self):
1279 pass
1280
1281
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001282class FileObjectInterruptedTestCase(unittest.TestCase):
1283 """Test that the file object correctly handles EINTR internally."""
1284
1285 class MockSocket(object):
1286 def __init__(self, recv_funcs=()):
1287 # A generator that returns callables that we'll call for each
1288 # call to recv().
1289 self._recv_step = iter(recv_funcs)
1290
1291 def recv_into(self, buffer):
1292 data = next(self._recv_step)()
1293 assert len(buffer) >= len(data)
1294 buffer[:len(data)] = data
1295 return len(data)
1296
1297 def _decref_socketios(self):
1298 pass
1299
1300 def _textiowrap_for_test(self, buffering=-1):
1301 raw = socket.SocketIO(self, "r")
1302 if buffering < 0:
1303 buffering = io.DEFAULT_BUFFER_SIZE
1304 if buffering == 0:
1305 return raw
1306 buffer = io.BufferedReader(raw, buffering)
1307 text = io.TextIOWrapper(buffer, None, None)
1308 text.mode = "rb"
1309 return text
1310
1311 @staticmethod
1312 def _raise_eintr():
1313 raise socket.error(errno.EINTR)
1314
1315 def _textiowrap_mock_socket(self, mock, buffering=-1):
1316 raw = socket.SocketIO(mock, "r")
1317 if buffering < 0:
1318 buffering = io.DEFAULT_BUFFER_SIZE
1319 if buffering == 0:
1320 return raw
1321 buffer = io.BufferedReader(raw, buffering)
1322 text = io.TextIOWrapper(buffer, None, None)
1323 text.mode = "rb"
1324 return text
1325
1326 def _test_readline(self, size=-1, buffering=-1):
1327 mock_sock = self.MockSocket(recv_funcs=[
1328 lambda : b"This is the first line\nAnd the sec",
1329 self._raise_eintr,
1330 lambda : b"ond line is here\n",
1331 lambda : b"",
1332 lambda : b"", # XXX(gps): io library does an extra EOF read
1333 ])
1334 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001335 self.assertEqual(fo.readline(size), "This is the first line\n")
1336 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001337
1338 def _test_read(self, size=-1, buffering=-1):
1339 mock_sock = self.MockSocket(recv_funcs=[
1340 lambda : b"This is the first line\nAnd the sec",
1341 self._raise_eintr,
1342 lambda : b"ond line is here\n",
1343 lambda : b"",
1344 lambda : b"", # XXX(gps): io library does an extra EOF read
1345 ])
1346 expecting = (b"This is the first line\n"
1347 b"And the second line is here\n")
1348 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1349 if buffering == 0:
1350 data = b''
1351 else:
1352 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001353 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001354 while len(data) != len(expecting):
1355 part = fo.read(size)
1356 if not part:
1357 break
1358 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001359 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001360
1361 def test_default(self):
1362 self._test_readline()
1363 self._test_readline(size=100)
1364 self._test_read()
1365 self._test_read(size=100)
1366
1367 def test_with_1k_buffer(self):
1368 self._test_readline(buffering=1024)
1369 self._test_readline(size=100, buffering=1024)
1370 self._test_read(buffering=1024)
1371 self._test_read(size=100, buffering=1024)
1372
1373 def _test_readline_no_buffer(self, size=-1):
1374 mock_sock = self.MockSocket(recv_funcs=[
1375 lambda : b"a",
1376 lambda : b"\n",
1377 lambda : b"B",
1378 self._raise_eintr,
1379 lambda : b"b",
1380 lambda : b"",
1381 ])
1382 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001383 self.assertEqual(fo.readline(size), b"a\n")
1384 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001385
1386 def test_no_buffer(self):
1387 self._test_readline_no_buffer()
1388 self._test_readline_no_buffer(size=4)
1389 self._test_read(buffering=0)
1390 self._test_read(size=100, buffering=0)
1391
1392
Guido van Rossume9f66142002-08-07 15:46:19 +00001393class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1394
1395 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001396
Guido van Rossume9f66142002-08-07 15:46:19 +00001397 In this case (and in this case only), it should be possible to
1398 create a file object, read a line from it, create another file
1399 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001400 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001401 when reading multiple requests from the same socket."""
1402
1403 bufsize = 0 # Use unbuffered mode
1404
1405 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001406 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001407 line = self.read_file.readline() # first line
1408 self.assertEqual(line, b"A. " + self.write_msg) # first line
1409 self.read_file = self.cli_conn.makefile('rb', 0)
1410 line = self.read_file.readline() # second line
1411 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001412
1413 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001414 self.write_file.write(b"A. " + self.write_msg)
1415 self.write_file.write(b"B. " + self.write_msg)
1416 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001417
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001418 def testMakefileClose(self):
1419 # The file returned by makefile should keep the socket open...
1420 self.cli_conn.close()
1421 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001422 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001423 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001424 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001425 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1426
1427 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001428 self.write_file.write(self.write_msg)
1429 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001430
1431 def testMakefileCloseSocketDestroy(self):
1432 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001433 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001434 refcount_after = sys.getrefcount(self.cli_conn)
1435 self.assertEqual(refcount_before - 1, refcount_after)
1436
1437 def _testMakefileCloseSocketDestroy(self):
1438 pass
1439
Antoine Pitrou98b46702010-09-18 22:59:00 +00001440 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001441 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001442 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1443
1444 def testSmallReadNonBlocking(self):
1445 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001446 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1447 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001448 self.evt1.set()
1449 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001450 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001451 if first_seg is None:
1452 # Data not arrived (can happen under Windows), wait a bit
1453 time.sleep(0.5)
1454 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001455 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001456 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001457 self.assertEqual(n, 3)
1458 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001459 self.assertEqual(msg, self.read_msg)
1460 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1461 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001462
1463 def _testSmallReadNonBlocking(self):
1464 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001465 self.write_file.write(self.write_msg)
1466 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001467 self.evt2.set()
1468 # Avoid cloding the socket before the server test has finished,
1469 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1470 self.serv_finished.wait(5.0)
1471
1472 def testWriteNonBlocking(self):
1473 self.cli_finished.wait(5.0)
1474 # The client thread can't skip directly - the SkipTest exception
1475 # would appear as a failure.
1476 if self.serv_skipped:
1477 self.skipTest(self.serv_skipped)
1478
1479 def _testWriteNonBlocking(self):
1480 self.serv_skipped = None
1481 self.serv_conn.setblocking(False)
1482 # Try to saturate the socket buffer pipe with repeated large writes.
1483 BIG = b"x" * (1024 ** 2)
1484 LIMIT = 10
1485 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001486 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001487 self.assertGreater(n, 0)
1488 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001489 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001490 if n is None:
1491 # Succeeded
1492 break
1493 self.assertGreater(n, 0)
1494 else:
1495 # Let us know that this test didn't manage to establish
1496 # the expected conditions. This is not a failure in itself but,
1497 # if it happens repeatedly, the test should be fixed.
1498 self.serv_skipped = "failed to saturate the socket buffer"
1499
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001500
Guido van Rossum8c943832002-08-08 01:00:28 +00001501class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1502
1503 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1504
1505
1506class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1507
1508 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001509
Thomas Woutersb2137042007-02-01 18:02:27 +00001510
Antoine Pitrou834bd812010-10-13 16:17:14 +00001511class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1512 """Tests for socket.makefile() in text mode (rather than binary)"""
1513
1514 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001515 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001516 write_mode = 'wb'
1517 write_msg = MSG
1518 newline = ''
1519
1520
1521class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1522 """Tests for socket.makefile() in text mode (rather than binary)"""
1523
1524 read_mode = 'rb'
1525 read_msg = MSG
1526 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001527 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001528 newline = ''
1529
1530
1531class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1532 """Tests for socket.makefile() in text mode (rather than binary)"""
1533
1534 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001535 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001536 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001537 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001538 newline = ''
1539
1540
Guido van Rossumd8faa362007-04-27 19:54:29 +00001541class NetworkConnectionTest(object):
1542 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001543
Guido van Rossumd8faa362007-04-27 19:54:29 +00001544 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001545 # We're inherited below by BasicTCPTest2, which also inherits
1546 # BasicTCPTest, which defines self.port referenced below.
1547 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001548 self.serv_conn = self.cli
1549
1550class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1551 """Tests that NetworkConnection does not break existing TCP functionality.
1552 """
1553
1554class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001555
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001556 class MockSocket(socket.socket):
1557 def connect(self, *args):
1558 raise socket.timeout('timed out')
1559
1560 @contextlib.contextmanager
1561 def mocked_socket_module(self):
1562 """Return a socket which times out on connect"""
1563 old_socket = socket.socket
1564 socket.socket = self.MockSocket
1565 try:
1566 yield
1567 finally:
1568 socket.socket = old_socket
1569
1570 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001571 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001572 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001573 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001574 with self.assertRaises(socket.error) as cm:
1575 cli.connect((HOST, port))
1576 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1577
1578 def test_create_connection(self):
1579 # Issue #9792: errors raised by create_connection() should have
1580 # a proper errno attribute.
1581 port = support.find_unused_port()
1582 with self.assertRaises(socket.error) as cm:
1583 socket.create_connection((HOST, port))
1584 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1585
1586 def test_create_connection_timeout(self):
1587 # Issue #9792: create_connection() should not recast timeout errors
1588 # as generic socket errors.
1589 with self.mocked_socket_module():
1590 with self.assertRaises(socket.timeout):
1591 socket.create_connection((HOST, 1234))
1592
Guido van Rossumd8faa362007-04-27 19:54:29 +00001593
Victor Stinner45df8202010-04-28 22:31:17 +00001594@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001595class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1596
1597 def __init__(self, methodName='runTest'):
1598 SocketTCPTest.__init__(self, methodName=methodName)
1599 ThreadableTest.__init__(self)
1600
1601 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001602 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603
1604 def clientTearDown(self):
1605 self.cli.close()
1606 self.cli = None
1607 ThreadableTest.clientTearDown(self)
1608
1609 def _justAccept(self):
1610 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001611 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001612
1613 testFamily = _justAccept
1614 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001615 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001616 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001617 self.assertEqual(self.cli.family, 2)
1618
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001619 testSourceAddress = _justAccept
1620 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001621 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1622 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001623 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001624 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001625 # The port number being used is sufficient to show that the bind()
1626 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001627
Guido van Rossumd8faa362007-04-27 19:54:29 +00001628 testTimeoutDefault = _justAccept
1629 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001630 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001631 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001632 socket.setdefaulttimeout(42)
1633 try:
1634 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001635 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001636 finally:
1637 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001638 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001639
1640 testTimeoutNone = _justAccept
1641 def _testTimeoutNone(self):
1642 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001643 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001644 socket.setdefaulttimeout(30)
1645 try:
1646 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001647 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001648 finally:
1649 socket.setdefaulttimeout(None)
1650 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001651
1652 testTimeoutValueNamed = _justAccept
1653 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001654 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001655 self.assertEqual(self.cli.gettimeout(), 30)
1656
1657 testTimeoutValueNonamed = _justAccept
1658 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001659 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001660 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001661 self.assertEqual(self.cli.gettimeout(), 30)
1662
Victor Stinner45df8202010-04-28 22:31:17 +00001663@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001664class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1665
1666 def __init__(self, methodName='runTest'):
1667 SocketTCPTest.__init__(self, methodName=methodName)
1668 ThreadableTest.__init__(self)
1669
1670 def clientSetUp(self):
1671 pass
1672
1673 def clientTearDown(self):
1674 self.cli.close()
1675 self.cli = None
1676 ThreadableTest.clientTearDown(self)
1677
1678 def testInsideTimeout(self):
1679 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001680 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001681 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001682 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001683 testOutsideTimeout = testInsideTimeout
1684
1685 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001686 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001687 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001688 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001689
1690 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001691 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001692 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001693
1694
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001695class TCPTimeoutTest(SocketTCPTest):
1696
1697 def testTCPTimeout(self):
1698 def raise_timeout(*args, **kwargs):
1699 self.serv.settimeout(1.0)
1700 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001701 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001702 "Error generating a timeout exception (TCP)")
1703
1704 def testTimeoutZero(self):
1705 ok = False
1706 try:
1707 self.serv.settimeout(0.0)
1708 foo = self.serv.accept()
1709 except socket.timeout:
1710 self.fail("caught timeout instead of error (TCP)")
1711 except socket.error:
1712 ok = True
1713 except:
1714 self.fail("caught unexpected exception (TCP)")
1715 if not ok:
1716 self.fail("accept() returned success when we did not expect it")
1717
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001718 def testInterruptedTimeout(self):
1719 # XXX I don't know how to do this test on MSWindows or any other
1720 # plaform that doesn't support signal.alarm() or os.kill(), though
1721 # the bug should have existed on all platforms.
1722 if not hasattr(signal, "alarm"):
1723 return # can only test on *nix
1724 self.serv.settimeout(5.0) # must be longer than alarm
1725 class Alarm(Exception):
1726 pass
1727 def alarm_handler(signal, frame):
1728 raise Alarm
1729 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1730 try:
1731 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1732 try:
1733 foo = self.serv.accept()
1734 except socket.timeout:
1735 self.fail("caught timeout instead of Alarm")
1736 except Alarm:
1737 pass
1738 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001739 self.fail("caught other exception instead of Alarm:"
1740 " %s(%s):\n%s" %
1741 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001742 else:
1743 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001744 finally:
1745 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001746 except Alarm:
1747 self.fail("got Alarm in wrong place")
1748 finally:
1749 # no alarm can be pending. Safe to restore old handler.
1750 signal.signal(signal.SIGALRM, old_alarm)
1751
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001752class UDPTimeoutTest(SocketTCPTest):
1753
1754 def testUDPTimeout(self):
1755 def raise_timeout(*args, **kwargs):
1756 self.serv.settimeout(1.0)
1757 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001758 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001759 "Error generating a timeout exception (UDP)")
1760
1761 def testTimeoutZero(self):
1762 ok = False
1763 try:
1764 self.serv.settimeout(0.0)
1765 foo = self.serv.recv(1024)
1766 except socket.timeout:
1767 self.fail("caught timeout instead of error (UDP)")
1768 except socket.error:
1769 ok = True
1770 except:
1771 self.fail("caught unexpected exception (UDP)")
1772 if not ok:
1773 self.fail("recv() returned success when we did not expect it")
1774
1775class TestExceptions(unittest.TestCase):
1776
1777 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001778 self.assertTrue(issubclass(socket.error, Exception))
1779 self.assertTrue(issubclass(socket.herror, socket.error))
1780 self.assertTrue(issubclass(socket.gaierror, socket.error))
1781 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001782
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001783class TestLinuxAbstractNamespace(unittest.TestCase):
1784
1785 UNIX_PATH_MAX = 108
1786
1787 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001788 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001789 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1790 s1.bind(address)
1791 s1.listen(1)
1792 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1793 s2.connect(s1.getsockname())
1794 with s1.accept()[0] as s3:
1795 self.assertEqual(s1.getsockname(), address)
1796 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001797
1798 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001799 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001800 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1801 s.bind(address)
1802 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001803
1804 def testNameOverflow(self):
1805 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001806 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1807 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001808
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001809
Victor Stinner45df8202010-04-28 22:31:17 +00001810@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001811class BufferIOTest(SocketConnectedTest):
1812 """
1813 Test the buffer versions of socket.recv() and socket.send().
1814 """
1815 def __init__(self, methodName='runTest'):
1816 SocketConnectedTest.__init__(self, methodName=methodName)
1817
Antoine Pitrou25480782010-03-17 22:50:28 +00001818 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001819 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001820 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001821 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001822 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001823 self.assertEqual(msg, MSG)
1824
Antoine Pitrou25480782010-03-17 22:50:28 +00001825 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001826 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001827 self.serv_conn.send(buf)
1828
Antoine Pitrou25480782010-03-17 22:50:28 +00001829 def testRecvIntoBytearray(self):
1830 buf = bytearray(1024)
1831 nbytes = self.cli_conn.recv_into(buf)
1832 self.assertEqual(nbytes, len(MSG))
1833 msg = buf[:len(MSG)]
1834 self.assertEqual(msg, MSG)
1835
1836 _testRecvIntoBytearray = _testRecvIntoArray
1837
1838 def testRecvIntoMemoryview(self):
1839 buf = bytearray(1024)
1840 nbytes = self.cli_conn.recv_into(memoryview(buf))
1841 self.assertEqual(nbytes, len(MSG))
1842 msg = buf[:len(MSG)]
1843 self.assertEqual(msg, MSG)
1844
1845 _testRecvIntoMemoryview = _testRecvIntoArray
1846
1847 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001848 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001849 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001850 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001851 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001852 self.assertEqual(msg, MSG)
1853
Antoine Pitrou25480782010-03-17 22:50:28 +00001854 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001855 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001856 self.serv_conn.send(buf)
1857
Antoine Pitrou25480782010-03-17 22:50:28 +00001858 def testRecvFromIntoBytearray(self):
1859 buf = bytearray(1024)
1860 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1861 self.assertEqual(nbytes, len(MSG))
1862 msg = buf[:len(MSG)]
1863 self.assertEqual(msg, MSG)
1864
1865 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1866
1867 def testRecvFromIntoMemoryview(self):
1868 buf = bytearray(1024)
1869 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1870 self.assertEqual(nbytes, len(MSG))
1871 msg = buf[:len(MSG)]
1872 self.assertEqual(msg, MSG)
1873
1874 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1875
Christian Heimes043d6f62008-01-07 17:19:16 +00001876
1877TIPC_STYPE = 2000
1878TIPC_LOWER = 200
1879TIPC_UPPER = 210
1880
1881def isTipcAvailable():
1882 """Check if the TIPC module is loaded
1883
1884 The TIPC module is not loaded automatically on Ubuntu and probably
1885 other Linux distros.
1886 """
1887 if not hasattr(socket, "AF_TIPC"):
1888 return False
1889 if not os.path.isfile("/proc/modules"):
1890 return False
1891 with open("/proc/modules") as f:
1892 for line in f:
1893 if line.startswith("tipc "):
1894 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001895 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001896 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1897 return False
1898
1899class TIPCTest (unittest.TestCase):
1900 def testRDM(self):
1901 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1902 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1903
1904 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1905 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1906 TIPC_LOWER, TIPC_UPPER)
1907 srv.bind(srvaddr)
1908
1909 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1910 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1911 cli.sendto(MSG, sendaddr)
1912
1913 msg, recvaddr = srv.recvfrom(1024)
1914
1915 self.assertEqual(cli.getsockname(), recvaddr)
1916 self.assertEqual(msg, MSG)
1917
1918
1919class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1920 def __init__(self, methodName = 'runTest'):
1921 unittest.TestCase.__init__(self, methodName = methodName)
1922 ThreadableTest.__init__(self)
1923
1924 def setUp(self):
1925 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1926 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1927 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1928 TIPC_LOWER, TIPC_UPPER)
1929 self.srv.bind(srvaddr)
1930 self.srv.listen(5)
1931 self.serverExplicitReady()
1932 self.conn, self.connaddr = self.srv.accept()
1933
1934 def clientSetUp(self):
1935 # The is a hittable race between serverExplicitReady() and the
1936 # accept() call; sleep a little while to avoid it, otherwise
1937 # we could get an exception
1938 time.sleep(0.1)
1939 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1940 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1941 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1942 self.cli.connect(addr)
1943 self.cliaddr = self.cli.getsockname()
1944
1945 def testStream(self):
1946 msg = self.conn.recv(1024)
1947 self.assertEqual(msg, MSG)
1948 self.assertEqual(self.cliaddr, self.connaddr)
1949
1950 def _testStream(self):
1951 self.cli.send(MSG)
1952 self.cli.close()
1953
1954
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001955@unittest.skipUnless(thread, 'Threading required for this test.')
1956class ContextManagersTest(ThreadedTCPSocketTest):
1957
1958 def _testSocketClass(self):
1959 # base test
1960 with socket.socket() as sock:
1961 self.assertFalse(sock._closed)
1962 self.assertTrue(sock._closed)
1963 # close inside with block
1964 with socket.socket() as sock:
1965 sock.close()
1966 self.assertTrue(sock._closed)
1967 # exception inside with block
1968 with socket.socket() as sock:
1969 self.assertRaises(socket.error, sock.sendall, b'foo')
1970 self.assertTrue(sock._closed)
1971
1972 def testCreateConnectionBase(self):
1973 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001974 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001975 data = conn.recv(1024)
1976 conn.sendall(data)
1977
1978 def _testCreateConnectionBase(self):
1979 address = self.serv.getsockname()
1980 with socket.create_connection(address) as sock:
1981 self.assertFalse(sock._closed)
1982 sock.sendall(b'foo')
1983 self.assertEqual(sock.recv(1024), b'foo')
1984 self.assertTrue(sock._closed)
1985
1986 def testCreateConnectionClose(self):
1987 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001988 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001989 data = conn.recv(1024)
1990 conn.sendall(data)
1991
1992 def _testCreateConnectionClose(self):
1993 address = self.serv.getsockname()
1994 with socket.create_connection(address) as sock:
1995 sock.close()
1996 self.assertTrue(sock._closed)
1997 self.assertRaises(socket.error, sock.sendall, b'foo')
1998
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001999
Antoine Pitroub1c54962010-10-14 15:05:38 +00002000@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
2001 "SOCK_CLOEXEC not defined")
2002@unittest.skipUnless(fcntl, "module fcntl not available")
2003class CloexecConstantTest(unittest.TestCase):
2004 def test_SOCK_CLOEXEC(self):
Victor Stinnerfea0f4d2011-05-24 00:24:19 +02002005 v = support.linux_version()
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002006 if v < (2, 6, 28):
2007 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2008 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002009 with socket.socket(socket.AF_INET,
2010 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2011 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2012 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002013
2014
2015@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2016 "SOCK_NONBLOCK not defined")
2017class NonblockConstantTest(unittest.TestCase):
2018 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2019 if nonblock:
2020 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2021 self.assertEqual(s.gettimeout(), timeout)
2022 else:
2023 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2024 self.assertEqual(s.gettimeout(), None)
2025
2026 def test_SOCK_NONBLOCK(self):
Victor Stinnerfea0f4d2011-05-24 00:24:19 +02002027 v = support.linux_version()
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002028 if v < (2, 6, 28):
2029 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2030 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002031 # a lot of it seems silly and redundant, but I wanted to test that
2032 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002033 with socket.socket(socket.AF_INET,
2034 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2035 self.checkNonblock(s)
2036 s.setblocking(1)
2037 self.checkNonblock(s, False)
2038 s.setblocking(0)
2039 self.checkNonblock(s)
2040 s.settimeout(None)
2041 self.checkNonblock(s, False)
2042 s.settimeout(2.0)
2043 self.checkNonblock(s, timeout=2.0)
2044 s.setblocking(1)
2045 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002046 # defaulttimeout
2047 t = socket.getdefaulttimeout()
2048 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002049 with socket.socket() as s:
2050 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002051 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002052 with socket.socket() as s:
2053 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002054 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002055 with socket.socket() as s:
2056 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002057 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002058 with socket.socket() as s:
2059 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002060 socket.setdefaulttimeout(t)
2061
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002062
Guido van Rossumb995eb72002-07-31 16:08:40 +00002063def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002064 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002065 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002066
2067 tests.extend([
2068 NonBlockingTCPTests,
2069 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002070 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002071 UnbufferedFileObjectClassTestCase,
2072 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002073 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002074 UnicodeReadFileObjectClassTestCase,
2075 UnicodeWriteFileObjectClassTestCase,
2076 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002077 NetworkConnectionNoServer,
2078 NetworkConnectionAttributesTest,
2079 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002080 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002081 CloexecConstantTest,
2082 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002083 ])
Dave Cole331708b2004-08-09 04:51:41 +00002084 if hasattr(socket, "socketpair"):
2085 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002086 if sys.platform == 'linux2':
2087 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002088 if isTipcAvailable():
2089 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002090 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002091
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002092 thread_info = support.threading_setup()
2093 support.run_unittest(*tests)
2094 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002095
2096if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002097 test_main()