blob: e40b21e83cb44b90a2725fd83bfa328f99036cfc [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 Pitroub1c54962010-10-14 15:05:38 +000021try:
22 import fcntl
23except ImportError:
24 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000026def try_address(host, port=0, family=socket.AF_INET):
27 """Try to bind a socket on the given host:port and return True
28 if that has been possible."""
29 try:
30 sock = socket.socket(family, socket.SOCK_STREAM)
31 sock.bind((host, port))
32 except (socket.error, socket.gaierror):
33 return False
34 else:
35 sock.close()
36 return True
37
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000038def linux_version():
39 try:
40 # platform.release() is something like '2.6.33.7-desktop-2mnb'
41 version_string = platform.release().split('-')[0]
42 return tuple(map(int, version_string.split('.')))
43 except ValueError:
44 return 0, 0, 0
45
Benjamin Petersonee8712c2008-05-20 21:35:26 +000046HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000047MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000048SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Victor Stinner45df8202010-04-28 22:31:17 +000050try:
51 import _thread as thread
52 import threading
53except ImportError:
54 thread = None
55 threading = None
56
Guido van Rossum24e4af82002-06-12 19:18:08 +000057class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000058
Guido van Rossum24e4af82002-06-12 19:18:08 +000059 def setUp(self):
60 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000061 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000062 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000063
Guido van Rossum24e4af82002-06-12 19:18:08 +000064 def tearDown(self):
65 self.serv.close()
66 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000067
Guido van Rossum24e4af82002-06-12 19:18:08 +000068class SocketUDPTest(unittest.TestCase):
69
70 def setUp(self):
71 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000072 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000073
74 def tearDown(self):
75 self.serv.close()
76 self.serv = None
77
78class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000079 """Threadable Test class
80
81 The ThreadableTest class makes it easy to create a threaded
82 client/server pair from an existing unit test. To create a
83 new threaded class from an existing unit test, use multiple
84 inheritance:
85
86 class NewClass (OldClass, ThreadableTest):
87 pass
88
89 This class defines two new fixture functions with obvious
90 purposes for overriding:
91
92 clientSetUp ()
93 clientTearDown ()
94
95 Any new test functions within the class must then define
96 tests in pairs, where the test name is preceeded with a
97 '_' to indicate the client portion of the test. Ex:
98
99 def testFoo(self):
100 # Server portion
101
102 def _testFoo(self):
103 # Client portion
104
105 Any exceptions raised by the clients during their tests
106 are caught and transferred to the main thread to alert
107 the testing framework.
108
109 Note, the server setup function cannot call any blocking
110 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 the blocking call (such as in setting up a client/server
113 connection and performing the accept() in setUp().
114 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def __init__(self):
117 # Swap the true setup function
118 self.__setUp = self.setUp
119 self.__tearDown = self.tearDown
120 self.setUp = self._setUp
121 self.tearDown = self._tearDown
122
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 def serverExplicitReady(self):
124 """This method allows the server to explicitly indicate that
125 it wants the client thread to proceed. This is useful if the
126 server is about to execute a blocking routine that is
127 dependent upon the client thread during its setup routine."""
128 self.server_ready.set()
129
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000131 self.server_ready = threading.Event()
132 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000134 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000137 methodname = self.id()
138 i = methodname.rfind('.')
139 methodname = methodname[i+1:]
140 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000141 self.client_thread = thread.start_new_thread(
142 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000145 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.set()
147 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148
149 def _tearDown(self):
150 self.__tearDown()
151 self.done.wait()
152
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000153 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000154 exc = self.queue.get()
155 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000158 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000159 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200160 self.client_ready.set()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000161 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000162 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000163 try:
164 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000165 except BaseException as e:
166 self.queue.put(e)
167 finally:
168 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000169
170 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000171 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172
173 def clientTearDown(self):
174 self.done.set()
175 thread.exit()
176
177class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
178
179 def __init__(self, methodName='runTest'):
180 SocketTCPTest.__init__(self, methodName=methodName)
181 ThreadableTest.__init__(self)
182
183 def clientSetUp(self):
184 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
185
186 def clientTearDown(self):
187 self.cli.close()
188 self.cli = None
189 ThreadableTest.clientTearDown(self)
190
191class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
192
193 def __init__(self, methodName='runTest'):
194 SocketUDPTest.__init__(self, methodName=methodName)
195 ThreadableTest.__init__(self)
196
197 def clientSetUp(self):
198 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
199
Brian Curtin3beb38f2010-11-04 03:41:43 +0000200 def clientTearDown(self):
201 self.cli.close()
202 self.cli = None
203 ThreadableTest.clientTearDown(self)
204
Guido van Rossum24e4af82002-06-12 19:18:08 +0000205class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000206 """Socket tests for client-server connection.
207
208 self.cli_conn is a client socket connected to the server. The
209 setUp() method guarantees that it is connected to the server.
210 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211
212 def __init__(self, methodName='runTest'):
213 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
214
215 def setUp(self):
216 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000217 # Indicate explicitly we're ready for the client thread to
218 # proceed and then perform the blocking call to accept
219 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000220 conn, addr = self.serv.accept()
221 self.cli_conn = conn
222
223 def tearDown(self):
224 self.cli_conn.close()
225 self.cli_conn = None
226 ThreadedTCPSocketTest.tearDown(self)
227
228 def clientSetUp(self):
229 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000230 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 self.serv_conn = self.cli
232
233 def clientTearDown(self):
234 self.serv_conn.close()
235 self.serv_conn = None
236 ThreadedTCPSocketTest.clientTearDown(self)
237
Dave Cole331708b2004-08-09 04:51:41 +0000238class SocketPairTest(unittest.TestCase, ThreadableTest):
239
240 def __init__(self, methodName='runTest'):
241 unittest.TestCase.__init__(self, methodName=methodName)
242 ThreadableTest.__init__(self)
243
244 def setUp(self):
245 self.serv, self.cli = socket.socketpair()
246
247 def tearDown(self):
248 self.serv.close()
249 self.serv = None
250
251 def clientSetUp(self):
252 pass
253
254 def clientTearDown(self):
255 self.cli.close()
256 self.cli = None
257 ThreadableTest.clientTearDown(self)
258
Tim Peters494aaee2004-08-09 18:54:11 +0000259
Guido van Rossum24e4af82002-06-12 19:18:08 +0000260#######################################################################
261## Begin Tests
262
263class GeneralModuleTests(unittest.TestCase):
264
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000265 def test_repr(self):
266 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000267 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000269
Raymond Hettinger027bb632004-05-31 03:09:25 +0000270 def test_weakref(self):
271 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
272 p = proxy(s)
273 self.assertEqual(p.fileno(), s.fileno())
274 s.close()
275 s = None
276 try:
277 p.fileno()
278 except ReferenceError:
279 pass
280 else:
281 self.fail('Socket proxy still exists')
282
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000284 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000285 def raise_error(*args, **kwargs):
286 raise socket.error
287 def raise_herror(*args, **kwargs):
288 raise socket.herror
289 def raise_gaierror(*args, **kwargs):
290 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000291 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000293 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000295 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296 "Error raising socket exception.")
297
Ezio Melotti63e42302011-05-07 19:47:48 +0300298 def testSendtoErrors(self):
299 # Testing that sendto doens't masks failures. See #10169.
300 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
301 self.addCleanup(s.close)
302 s.bind(('', 0))
303 sockname = s.getsockname()
304 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300305 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300306 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300307 self.assertEqual(str(cm.exception),
308 "'str' does not support the buffer interface")
309 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300310 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300311 self.assertEqual(str(cm.exception),
312 "'complex' does not support the buffer interface")
313 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300314 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300315 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300316 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300317 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300318 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300319 self.assertEqual(str(cm.exception),
320 "'str' does not support the buffer interface")
321 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300322 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300323 self.assertEqual(str(cm.exception),
324 "'complex' does not support the buffer interface")
325 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300326 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300327 self.assertIn('not NoneType', str(cm.exception))
328 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300329 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300330 self.assertIn('an integer is required', str(cm.exception))
331 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300332 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300333 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300334 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300335 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300336 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300337 self.assertIn('(1 given)', str(cm.exception))
338 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300339 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300340 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300341
Guido van Rossum24e4af82002-06-12 19:18:08 +0000342 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000343 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000344 socket.AF_INET
345 socket.SOCK_STREAM
346 socket.SOCK_DGRAM
347 socket.SOCK_RAW
348 socket.SOCK_RDM
349 socket.SOCK_SEQPACKET
350 socket.SOL_SOCKET
351 socket.SO_REUSEADDR
352
Guido van Rossum654c11e2002-06-13 20:24:17 +0000353 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000354 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000355 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000356 try:
357 ip = socket.gethostbyname(hostname)
358 except socket.error:
359 # Probably name lookup wasn't set up right; skip this test
360 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000361 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000362 try:
363 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
364 except socket.error:
365 # Probably a similar problem as above; skip this test
366 return
Brett Cannon01668a12005-03-11 00:04:17 +0000367 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000368 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000369 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000370 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000371
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000372 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000373 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000374 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000375 try:
376 # On some versions, this loses a reference
377 orig = sys.getrefcount(__name__)
378 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000379 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000380 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000381 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000382
Guido van Rossum24e4af82002-06-12 19:18:08 +0000383 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000384 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000385 try:
386 # On some versions, this crashes the interpreter.
387 socket.getnameinfo(('x', 0, 0, 0), 0)
388 except socket.error:
389 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000390
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000391 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000392 # This just checks that htons etc. are their own inverse,
393 # when looking at the lower 16 or 32 bits.
394 sizes = {socket.htonl: 32, socket.ntohl: 32,
395 socket.htons: 16, socket.ntohs: 16}
396 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000397 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000398 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
399 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000400
Guido van Rossuma2627af2002-09-14 00:58:46 +0000401 swapped = func(mask)
402 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000403 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000404
Guido van Rossum018919a2007-01-15 00:07:32 +0000405 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000406 good_values = [ 1, 2, 3, 1, 2, 3 ]
407 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000408 for k in good_values:
409 socket.ntohl(k)
410 socket.ntohs(k)
411 socket.htonl(k)
412 socket.htons(k)
413 for k in bad_values:
414 self.assertRaises(OverflowError, socket.ntohl, k)
415 self.assertRaises(OverflowError, socket.ntohs, k)
416 self.assertRaises(OverflowError, socket.htonl, k)
417 self.assertRaises(OverflowError, socket.htons, k)
418
Barry Warsaw11b91a02004-06-28 00:50:43 +0000419 def testGetServBy(self):
420 eq = self.assertEqual
421 # Find one service that exists, then check all the related interfaces.
422 # I've ordered this by protocols that have both a tcp and udp
423 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000424 if (sys.platform.startswith('linux') or
425 sys.platform.startswith('freebsd') or
426 sys.platform.startswith('netbsd') or
427 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000428 # avoid the 'echo' service on this platform, as there is an
429 # assumption breaking non-standard port/protocol entry
430 services = ('daytime', 'qotd', 'domain')
431 else:
432 services = ('echo', 'daytime', 'domain')
433 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000434 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000435 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000436 break
437 except socket.error:
438 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000439 else:
440 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000441 # Try same call with optional protocol omitted
442 port2 = socket.getservbyname(service)
443 eq(port, port2)
444 # Try udp, but don't barf it it doesn't exist
445 try:
446 udpport = socket.getservbyname(service, 'udp')
447 except socket.error:
448 udpport = None
449 else:
450 eq(udpport, port)
451 # Now make sure the lookup by port returns the same service name
452 eq(socket.getservbyport(port2), service)
453 eq(socket.getservbyport(port, 'tcp'), service)
454 if udpport is not None:
455 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000456 # Make sure getservbyport does not accept out of range ports.
457 self.assertRaises(OverflowError, socket.getservbyport, -1)
458 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000459
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000460 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000461 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000462 # The default timeout should initially be None
463 self.assertEqual(socket.getdefaulttimeout(), None)
464 s = socket.socket()
465 self.assertEqual(s.gettimeout(), None)
466 s.close()
467
468 # Set the default timeout to 10, and see if it propagates
469 socket.setdefaulttimeout(10)
470 self.assertEqual(socket.getdefaulttimeout(), 10)
471 s = socket.socket()
472 self.assertEqual(s.gettimeout(), 10)
473 s.close()
474
475 # Reset the default timeout to None, and see if it propagates
476 socket.setdefaulttimeout(None)
477 self.assertEqual(socket.getdefaulttimeout(), None)
478 s = socket.socket()
479 self.assertEqual(s.gettimeout(), None)
480 s.close()
481
482 # Check that setting it to an invalid value raises ValueError
483 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
484
485 # Check that setting it to an invalid type raises TypeError
486 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
487
Benjamin Petersonf91df042009-02-13 02:50:59 +0000488 def testIPv4_inet_aton_fourbytes(self):
489 if not hasattr(socket, 'inet_aton'):
490 return # No inet_aton, nothing to check
491 # Test that issue1008086 and issue767150 are fixed.
492 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000493 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
494 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000495
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000496 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000497 if not hasattr(socket, 'inet_pton'):
498 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000499 from socket import inet_aton as f, inet_pton, AF_INET
500 g = lambda a: inet_pton(AF_INET, a)
501
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100502 assertInvalid = lambda func,a: self.assertRaises(
503 (socket.error, ValueError), func, a
504 )
505
Ezio Melottib3aedd42010-11-20 19:04:17 +0000506 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
507 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
508 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
509 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
510 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100511 assertInvalid(f, '0.0.0.')
512 assertInvalid(f, '300.0.0.0')
513 assertInvalid(f, 'a.0.0.0')
514 assertInvalid(f, '1.2.3.4.5')
515 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000516
Ezio Melottib3aedd42010-11-20 19:04:17 +0000517 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
518 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
519 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
520 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100521 assertInvalid(g, '0.0.0.')
522 assertInvalid(g, '300.0.0.0')
523 assertInvalid(g, 'a.0.0.0')
524 assertInvalid(g, '1.2.3.4.5')
525 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000526
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000527 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000528 if not hasattr(socket, 'inet_pton'):
529 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000530 try:
531 from socket import inet_pton, AF_INET6, has_ipv6
532 if not has_ipv6:
533 return
534 except ImportError:
535 return
536 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100537 assertInvalid = lambda a: self.assertRaises(
538 (socket.error, ValueError), f, a
539 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000540
Ezio Melottib3aedd42010-11-20 19:04:17 +0000541 self.assertEqual(b'\x00' * 16, f('::'))
542 self.assertEqual(b'\x00' * 16, f('0::0'))
543 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
544 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000545 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 +0000546 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
547 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100548 self.assertEqual(
549 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
550 f('ad42:abc::127:0:254:2')
551 )
552 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
553 assertInvalid('0x20::')
554 assertInvalid(':::')
555 assertInvalid('::0::')
556 assertInvalid('1::abc::')
557 assertInvalid('1::abc::def')
558 assertInvalid('1:2:3:4:5:6:')
559 assertInvalid('1:2:3:4:5:6')
560 assertInvalid('1:2:3:4:5:6:7:8:')
561 assertInvalid('1:2:3:4:5:6:7:8:0')
562
563 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
564 f('::254.42.23.64')
565 )
566 self.assertEqual(
567 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
568 f('42::a29b:254.42.23.64')
569 )
570 self.assertEqual(
571 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
572 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
573 )
574 assertInvalid('255.254.253.252')
575 assertInvalid('1::260.2.3.0')
576 assertInvalid('1::0.be.e.0')
577 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
578 assertInvalid('::1.2.3.4:0')
579 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +0000580
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000581 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000582 if not hasattr(socket, 'inet_ntop'):
583 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000584 from socket import inet_ntoa as f, inet_ntop, AF_INET
585 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100586 assertInvalid = lambda func,a: self.assertRaises(
587 (socket.error, ValueError), func, a
588 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000589
Ezio Melottib3aedd42010-11-20 19:04:17 +0000590 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
591 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
592 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
593 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100594 assertInvalid(f, b'\x00' * 3)
595 assertInvalid(f, b'\x00' * 5)
596 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +0000597
Ezio Melottib3aedd42010-11-20 19:04:17 +0000598 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
599 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
600 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100601 assertInvalid(g, b'\x00' * 3)
602 assertInvalid(g, b'\x00' * 5)
603 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000604
605 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000606 if not hasattr(socket, 'inet_ntop'):
607 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000608 try:
609 from socket import inet_ntop, AF_INET6, has_ipv6
610 if not has_ipv6:
611 return
612 except ImportError:
613 return
614 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100615 assertInvalid = lambda a: self.assertRaises(
616 (socket.error, ValueError), f, a
617 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000618
Ezio Melottib3aedd42010-11-20 19:04:17 +0000619 self.assertEqual('::', f(b'\x00' * 16))
620 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
621 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000622 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000623 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 +0000624 )
625
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100626 assertInvalid(b'\x12' * 15)
627 assertInvalid(b'\x12' * 17)
628 assertInvalid(b'\x12' * 4)
629
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000630 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000631
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000632 def testSockName(self):
633 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200634 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000635 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000636 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000637 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000638 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000639 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
640 # it reasonable to get the host's addr in addition to 0.0.0.0.
641 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000642 try:
643 my_ip_addr = socket.gethostbyname(socket.gethostname())
644 except socket.error:
645 # Probably name lookup wasn't set up right; skip this test
646 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000647 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000648 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649
650 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000651 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000652 # We know a socket should start without reuse==0
653 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000654 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000655 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000656 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000657
658 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000659 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000660 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000661 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000662 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
663 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000664 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000665
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000666 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000667 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000668 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
669 sock.settimeout(1)
670 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000671 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000672
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000673 def testNewAttributes(self):
674 # testing .family, .type and .protocol
675 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
676 self.assertEqual(sock.family, socket.AF_INET)
677 self.assertEqual(sock.type, socket.SOCK_STREAM)
678 self.assertEqual(sock.proto, 0)
679 sock.close()
680
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000681 def test_getsockaddrarg(self):
682 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200683 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000684 big_port = port + 65536
685 neg_port = port - 65536
686 sock = socket.socket()
687 try:
688 self.assertRaises(OverflowError, sock.bind, (host, big_port))
689 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
690 sock.bind((host, port))
691 finally:
692 sock.close()
693
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000694 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000695 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000696 self.assertTrue(hasattr(socket.socket, 'ioctl'))
697 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
698 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
699 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000700 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
701 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000702 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000703 self.assertRaises(ValueError, s.ioctl, -1, None)
704 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000705
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000706 def testGetaddrinfo(self):
707 try:
708 socket.getaddrinfo('localhost', 80)
709 except socket.gaierror as err:
710 if err.errno == socket.EAI_SERVICE:
711 # see http://bugs.python.org/issue1282647
712 self.skipTest("buggy libc version")
713 raise
714 # len of every sequence is supposed to be == 5
715 for info in socket.getaddrinfo(HOST, None):
716 self.assertEqual(len(info), 5)
717 # host can be a domain name, a string representation of an
718 # IPv4/v6 address or None
719 socket.getaddrinfo('localhost', 80)
720 socket.getaddrinfo('127.0.0.1', 80)
721 socket.getaddrinfo(None, 80)
722 if SUPPORTS_IPV6:
723 socket.getaddrinfo('::1', 80)
724 # port can be a string service name such as "http", a numeric
725 # port number or None
726 socket.getaddrinfo(HOST, "http")
727 socket.getaddrinfo(HOST, 80)
728 socket.getaddrinfo(HOST, None)
729 # test family and socktype filters
730 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
731 for family, _, _, _, _ in infos:
732 self.assertEqual(family, socket.AF_INET)
733 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
734 for _, socktype, _, _, _ in infos:
735 self.assertEqual(socktype, socket.SOCK_STREAM)
736 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000737 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000738 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
739 # a server willing to support both IPv4 and IPv6 will
740 # usually do this
741 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
742 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000743 # test keyword arguments
744 a = socket.getaddrinfo(HOST, None)
745 b = socket.getaddrinfo(host=HOST, port=None)
746 self.assertEqual(a, b)
747 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
748 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
749 self.assertEqual(a, b)
750 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
751 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
752 self.assertEqual(a, b)
753 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
754 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
755 self.assertEqual(a, b)
756 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
757 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
758 self.assertEqual(a, b)
759 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
760 socket.AI_PASSIVE)
761 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
762 type=socket.SOCK_STREAM, proto=0,
763 flags=socket.AI_PASSIVE)
764 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000765 # Issue #6697.
766 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000767
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000768 def test_getnameinfo(self):
769 # only IP addresses are allowed
770 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
771
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000772 @unittest.skipUnless(support.is_resource_enabled('network'),
773 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000774 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000775 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000776 # these should all be successful
777 socket.gethostbyname('испытание.python.org')
778 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000779 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
780 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
781 # have a reverse entry yet
782 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000783
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000784 def check_sendall_interrupted(self, with_timeout):
785 # socketpair() is not stricly required, but it makes things easier.
786 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
787 self.skipTest("signal.alarm and socket.socketpair required for this test")
788 # Our signal handlers clobber the C errno by calling a math function
789 # with an invalid domain value.
790 def ok_handler(*args):
791 self.assertRaises(ValueError, math.acosh, 0)
792 def raising_handler(*args):
793 self.assertRaises(ValueError, math.acosh, 0)
794 1 // 0
795 c, s = socket.socketpair()
796 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
797 try:
798 if with_timeout:
799 # Just above the one second minimum for signal.alarm
800 c.settimeout(1.5)
801 with self.assertRaises(ZeroDivisionError):
802 signal.alarm(1)
803 c.sendall(b"x" * (1024**2))
804 if with_timeout:
805 signal.signal(signal.SIGALRM, ok_handler)
806 signal.alarm(1)
807 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
808 finally:
809 signal.signal(signal.SIGALRM, old_alarm)
810 c.close()
811 s.close()
812
813 def test_sendall_interrupted(self):
814 self.check_sendall_interrupted(False)
815
816 def test_sendall_interrupted_with_timeout(self):
817 self.check_sendall_interrupted(True)
818
Antoine Pitroue033e062010-10-29 10:38:18 +0000819 def test_dealloc_warn(self):
820 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
821 r = repr(sock)
822 with self.assertWarns(ResourceWarning) as cm:
823 sock = None
824 support.gc_collect()
825 self.assertIn(r, str(cm.warning.args[0]))
826 # An open socket file object gets dereferenced after the socket
827 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
828 f = sock.makefile('rb')
829 r = repr(sock)
830 sock = None
831 support.gc_collect()
832 with self.assertWarns(ResourceWarning):
833 f = None
834 support.gc_collect()
835
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000836 def test_name_closed_socketio(self):
837 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
838 fp = sock.makefile("rb")
839 fp.close()
840 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
841
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +0200842 def test_unusable_closed_socketio(self):
843 with socket.socket() as sock:
844 fp = sock.makefile("rb", buffering=0)
845 self.assertTrue(fp.readable())
846 self.assertFalse(fp.writable())
847 self.assertFalse(fp.seekable())
848 fp.close()
849 self.assertRaises(ValueError, fp.readable)
850 self.assertRaises(ValueError, fp.writable)
851 self.assertRaises(ValueError, fp.seekable)
852
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200853 def testListenBacklog0(self):
854 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
855 srv.bind((HOST, 0))
856 # backlog = 0
857 srv.listen(0)
858 srv.close()
859
Charles-François Natali366999a2012-01-02 15:47:29 +0100860 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
861 def test_flowinfo(self):
862 self.assertRaises(OverflowError, socket.getnameinfo,
863 ('::1',0, 0xffffffff), 0)
864 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
865 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
866
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000867
Victor Stinner45df8202010-04-28 22:31:17 +0000868@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869class BasicTCPTest(SocketConnectedTest):
870
871 def __init__(self, methodName='runTest'):
872 SocketConnectedTest.__init__(self, methodName=methodName)
873
874 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000875 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000877 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878
879 def _testRecv(self):
880 self.serv_conn.send(MSG)
881
882 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000883 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884 seg1 = self.cli_conn.recv(len(MSG) - 3)
885 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000886 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000887 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888
889 def _testOverFlowRecv(self):
890 self.serv_conn.send(MSG)
891
892 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000893 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000894 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000895 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000896
897 def _testRecvFrom(self):
898 self.serv_conn.send(MSG)
899
900 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000901 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000902 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
903 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000904 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000905 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000906
907 def _testOverFlowRecvFrom(self):
908 self.serv_conn.send(MSG)
909
910 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000911 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000912 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000913 while 1:
914 read = self.cli_conn.recv(1024)
915 if not read:
916 break
Guido van Rossume531e292002-08-08 20:28:34 +0000917 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000918 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919
920 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000921 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922 self.serv_conn.sendall(big_chunk)
923
924 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000925 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000926 fd = self.cli_conn.fileno()
927 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000928 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000929 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000931 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932
933 def _testFromFd(self):
934 self.serv_conn.send(MSG)
935
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000936 def testDup(self):
937 # Testing dup()
938 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000939 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000940 msg = sock.recv(1024)
941 self.assertEqual(msg, MSG)
942
943 def _testDup(self):
944 self.serv_conn.send(MSG)
945
Guido van Rossum24e4af82002-06-12 19:18:08 +0000946 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000947 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000948 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000949 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000950 # wait for _testShutdown to finish: on OS X, when the server
951 # closes the connection the client also becomes disconnected,
952 # and the client's shutdown call will fail. (Issue #4397.)
953 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000954
955 def _testShutdown(self):
956 self.serv_conn.send(MSG)
957 self.serv_conn.shutdown(2)
958
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000959 def testDetach(self):
960 # Testing detach()
961 fileno = self.cli_conn.fileno()
962 f = self.cli_conn.detach()
963 self.assertEqual(f, fileno)
964 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +0200965 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000966 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
967 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000968 # ...but we can create another socket using the (still open)
969 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000970 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000971 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000972 msg = sock.recv(1024)
973 self.assertEqual(msg, MSG)
974
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000975 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000976 self.serv_conn.send(MSG)
977
Victor Stinner45df8202010-04-28 22:31:17 +0000978@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979class BasicUDPTest(ThreadedUDPSocketTest):
980
981 def __init__(self, methodName='runTest'):
982 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
983
984 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000985 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000987 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000988
989 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000990 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000991
Guido van Rossum1c938012002-06-12 21:17:20 +0000992 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000993 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000994 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000995 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000996
Guido van Rossum1c938012002-06-12 21:17:20 +0000997 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000998 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000999
Guido van Rossumd8faa362007-04-27 19:54:29 +00001000 def testRecvFromNegative(self):
1001 # Negative lengths passed to recvfrom should give ValueError.
1002 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1003
1004 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001005 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001006
Victor Stinner45df8202010-04-28 22:31:17 +00001007@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001008class TCPCloserTest(ThreadedTCPSocketTest):
1009
1010 def testClose(self):
1011 conn, addr = self.serv.accept()
1012 conn.close()
1013
1014 sd = self.cli
1015 read, write, err = select.select([sd], [], [], 1.0)
1016 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001017 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001018
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001019 # Calling close() many times should be safe.
1020 conn.close()
1021 conn.close()
1022
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001023 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001024 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001025 time.sleep(1.0)
1026
Victor Stinner45df8202010-04-28 22:31:17 +00001027@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00001028class BasicSocketPairTest(SocketPairTest):
1029
1030 def __init__(self, methodName='runTest'):
1031 SocketPairTest.__init__(self, methodName=methodName)
1032
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001033 def _check_defaults(self, sock):
1034 self.assertIsInstance(sock, socket.socket)
1035 if hasattr(socket, 'AF_UNIX'):
1036 self.assertEqual(sock.family, socket.AF_UNIX)
1037 else:
1038 self.assertEqual(sock.family, socket.AF_INET)
1039 self.assertEqual(sock.type, socket.SOCK_STREAM)
1040 self.assertEqual(sock.proto, 0)
1041
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001042 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001043 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001044
1045 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001046 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001047
Dave Cole331708b2004-08-09 04:51:41 +00001048 def testRecv(self):
1049 msg = self.serv.recv(1024)
1050 self.assertEqual(msg, MSG)
1051
1052 def _testRecv(self):
1053 self.cli.send(MSG)
1054
1055 def testSend(self):
1056 self.serv.send(MSG)
1057
1058 def _testSend(self):
1059 msg = self.cli.recv(1024)
1060 self.assertEqual(msg, MSG)
1061
Victor Stinner45df8202010-04-28 22:31:17 +00001062@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001063class NonBlockingTCPTests(ThreadedTCPSocketTest):
1064
1065 def __init__(self, methodName='runTest'):
1066 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1067
1068 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001069 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070 self.serv.setblocking(0)
1071 start = time.time()
1072 try:
1073 self.serv.accept()
1074 except socket.error:
1075 pass
1076 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001077 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001078
1079 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001080 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001081
Antoine Pitroub1c54962010-10-14 15:05:38 +00001082 if hasattr(socket, "SOCK_NONBLOCK"):
1083 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001084 v = linux_version()
1085 if v < (2, 6, 28):
1086 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1087 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001088 # reinit server socket
1089 self.serv.close()
1090 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001091 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001092 self.port = support.bind_port(self.serv)
1093 self.serv.listen(1)
1094 # actual testing
1095 start = time.time()
1096 try:
1097 self.serv.accept()
1098 except socket.error:
1099 pass
1100 end = time.time()
1101 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1102
1103 def _testInitNonBlocking(self):
1104 pass
1105
Antoine Pitrou600232b2011-01-05 21:03:42 +00001106 def testInheritFlags(self):
1107 # Issue #7995: when calling accept() on a listening socket with a
1108 # timeout, the resulting socket should not be non-blocking.
1109 self.serv.settimeout(10)
1110 try:
1111 conn, addr = self.serv.accept()
1112 message = conn.recv(len(MSG))
1113 finally:
1114 conn.close()
1115 self.serv.settimeout(None)
1116
1117 def _testInheritFlags(self):
1118 time.sleep(0.1)
1119 self.cli.connect((HOST, self.port))
1120 time.sleep(0.5)
1121 self.cli.send(MSG)
1122
Guido van Rossum24e4af82002-06-12 19:18:08 +00001123 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001124 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001125 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001126 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001127 conn, addr = self.serv.accept()
1128 except socket.error:
1129 pass
1130 else:
1131 self.fail("Error trying to do non-blocking accept.")
1132 read, write, err = select.select([self.serv], [], [])
1133 if self.serv in read:
1134 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001135 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001136 else:
1137 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001138
Guido van Rossum24e4af82002-06-12 19:18:08 +00001139 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001140 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001141 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001142
1143 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001144 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001145 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001146 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001147
1148 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001149 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001150 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001151
1152 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001153 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001154 conn, addr = self.serv.accept()
1155 conn.setblocking(0)
1156 try:
1157 msg = conn.recv(len(MSG))
1158 except socket.error:
1159 pass
1160 else:
1161 self.fail("Error trying to do non-blocking recv.")
1162 read, write, err = select.select([conn], [], [])
1163 if conn in read:
1164 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001165 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001166 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001167 else:
1168 self.fail("Error during select call to non-blocking socket.")
1169
1170 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001171 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001172 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001173 self.cli.send(MSG)
1174
Victor Stinner45df8202010-04-28 22:31:17 +00001175@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001176class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001177 """Unit tests for the object returned by socket.makefile()
1178
Antoine Pitrou834bd812010-10-13 16:17:14 +00001179 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001180 the client connection. You can read from this file to
1181 get output from the server.
1182
Antoine Pitrou834bd812010-10-13 16:17:14 +00001183 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001184 server connection. You can write to this file to send output
1185 to the client.
1186 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001187
Guido van Rossume9f66142002-08-07 15:46:19 +00001188 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001189 encoding = 'utf8'
1190 errors = 'strict'
1191 newline = None
1192
1193 read_mode = 'rb'
1194 read_msg = MSG
1195 write_mode = 'wb'
1196 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001197
Guido van Rossum24e4af82002-06-12 19:18:08 +00001198 def __init__(self, methodName='runTest'):
1199 SocketConnectedTest.__init__(self, methodName=methodName)
1200
1201 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001202 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1203 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001204 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001205 self.read_file = self.cli_conn.makefile(
1206 self.read_mode, self.bufsize,
1207 encoding = self.encoding,
1208 errors = self.errors,
1209 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001210
1211 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001212 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001213 self.read_file.close()
1214 self.assertTrue(self.read_file.closed)
1215 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001216 SocketConnectedTest.tearDown(self)
1217
1218 def clientSetUp(self):
1219 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001220 self.write_file = self.serv_conn.makefile(
1221 self.write_mode, self.bufsize,
1222 encoding = self.encoding,
1223 errors = self.errors,
1224 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001225
1226 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001227 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001228 self.write_file.close()
1229 self.assertTrue(self.write_file.closed)
1230 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001231 SocketConnectedTest.clientTearDown(self)
1232
Antoine Pitrou5d5381e2011-02-25 23:14:08 +00001233 def testReadAfterTimeout(self):
1234 # Issue #7322: A file object must disallow further reads
1235 # after a timeout has occurred.
1236 self.cli_conn.settimeout(1)
1237 self.read_file.read(3)
1238 # First read raises a timeout
1239 self.assertRaises(socket.timeout, self.read_file.read, 1)
1240 # Second read is disallowed
1241 with self.assertRaises(IOError) as ctx:
1242 self.read_file.read(1)
1243 self.assertIn("cannot read from timed out object", str(ctx.exception))
1244
1245 def _testReadAfterTimeout(self):
1246 self.write_file.write(self.write_msg[0:3])
1247 self.write_file.flush()
1248 self.serv_finished.wait()
1249
Guido van Rossum24e4af82002-06-12 19:18:08 +00001250 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001251 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001252 first_seg = self.read_file.read(len(self.read_msg)-3)
1253 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001254 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001255 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001256
1257 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001258 self.write_file.write(self.write_msg)
1259 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001260
Guido van Rossum8c943832002-08-08 01:00:28 +00001261 def testFullRead(self):
1262 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001263 msg = self.read_file.read()
1264 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001265
1266 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001267 self.write_file.write(self.write_msg)
1268 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001269
Guido van Rossum24e4af82002-06-12 19:18:08 +00001270 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001271 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001272 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001273 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001274 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001275 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001276 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001277 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001278 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001279
1280 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001281 self.write_file.write(self.write_msg)
1282 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001283
1284 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001285 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001286 line = self.read_file.readline()
1287 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001288
1289 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001290 self.write_file.write(self.write_msg)
1291 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001292
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001293 def testCloseAfterMakefile(self):
1294 # The file returned by makefile should keep the socket open.
1295 self.cli_conn.close()
1296 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001297 msg = self.read_file.read()
1298 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001299
1300 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001301 self.write_file.write(self.write_msg)
1302 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001303
1304 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001305 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001306 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001307 if isinstance(self.read_msg, str):
1308 msg = msg.decode()
1309 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001310
1311 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001312 self.write_file.write(self.write_msg)
1313 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001314
Tim Peters116d83c2004-03-28 02:20:45 +00001315 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001316 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001317
1318 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001319 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001320
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001321 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001322 self.assertEqual(self.read_file.mode, self.read_mode)
1323 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001324
1325 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001326 self.assertEqual(self.write_file.mode, self.write_mode)
1327 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001328
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001329 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001330 self.read_file.close()
1331 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001332 self.cli_conn.close()
1333 self.assertRaises(socket.error, self.cli_conn.getsockname)
1334
1335 def _testRealClose(self):
1336 pass
1337
1338
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001339class FileObjectInterruptedTestCase(unittest.TestCase):
1340 """Test that the file object correctly handles EINTR internally."""
1341
1342 class MockSocket(object):
1343 def __init__(self, recv_funcs=()):
1344 # A generator that returns callables that we'll call for each
1345 # call to recv().
1346 self._recv_step = iter(recv_funcs)
1347
1348 def recv_into(self, buffer):
1349 data = next(self._recv_step)()
1350 assert len(buffer) >= len(data)
1351 buffer[:len(data)] = data
1352 return len(data)
1353
1354 def _decref_socketios(self):
1355 pass
1356
1357 def _textiowrap_for_test(self, buffering=-1):
1358 raw = socket.SocketIO(self, "r")
1359 if buffering < 0:
1360 buffering = io.DEFAULT_BUFFER_SIZE
1361 if buffering == 0:
1362 return raw
1363 buffer = io.BufferedReader(raw, buffering)
1364 text = io.TextIOWrapper(buffer, None, None)
1365 text.mode = "rb"
1366 return text
1367
1368 @staticmethod
1369 def _raise_eintr():
1370 raise socket.error(errno.EINTR)
1371
1372 def _textiowrap_mock_socket(self, mock, buffering=-1):
1373 raw = socket.SocketIO(mock, "r")
1374 if buffering < 0:
1375 buffering = io.DEFAULT_BUFFER_SIZE
1376 if buffering == 0:
1377 return raw
1378 buffer = io.BufferedReader(raw, buffering)
1379 text = io.TextIOWrapper(buffer, None, None)
1380 text.mode = "rb"
1381 return text
1382
1383 def _test_readline(self, size=-1, buffering=-1):
1384 mock_sock = self.MockSocket(recv_funcs=[
1385 lambda : b"This is the first line\nAnd the sec",
1386 self._raise_eintr,
1387 lambda : b"ond line is here\n",
1388 lambda : b"",
1389 lambda : b"", # XXX(gps): io library does an extra EOF read
1390 ])
1391 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001392 self.assertEqual(fo.readline(size), "This is the first line\n")
1393 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001394
1395 def _test_read(self, size=-1, buffering=-1):
1396 mock_sock = self.MockSocket(recv_funcs=[
1397 lambda : b"This is the first line\nAnd the sec",
1398 self._raise_eintr,
1399 lambda : b"ond line is here\n",
1400 lambda : b"",
1401 lambda : b"", # XXX(gps): io library does an extra EOF read
1402 ])
1403 expecting = (b"This is the first line\n"
1404 b"And the second line is here\n")
1405 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1406 if buffering == 0:
1407 data = b''
1408 else:
1409 data = ''
1410 expecting = expecting.decode('utf8')
1411 while len(data) != len(expecting):
1412 part = fo.read(size)
1413 if not part:
1414 break
1415 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001416 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001417
1418 def test_default(self):
1419 self._test_readline()
1420 self._test_readline(size=100)
1421 self._test_read()
1422 self._test_read(size=100)
1423
1424 def test_with_1k_buffer(self):
1425 self._test_readline(buffering=1024)
1426 self._test_readline(size=100, buffering=1024)
1427 self._test_read(buffering=1024)
1428 self._test_read(size=100, buffering=1024)
1429
1430 def _test_readline_no_buffer(self, size=-1):
1431 mock_sock = self.MockSocket(recv_funcs=[
1432 lambda : b"a",
1433 lambda : b"\n",
1434 lambda : b"B",
1435 self._raise_eintr,
1436 lambda : b"b",
1437 lambda : b"",
1438 ])
1439 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001440 self.assertEqual(fo.readline(size), b"a\n")
1441 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001442
1443 def test_no_buffer(self):
1444 self._test_readline_no_buffer()
1445 self._test_readline_no_buffer(size=4)
1446 self._test_read(buffering=0)
1447 self._test_read(size=100, buffering=0)
1448
1449
Guido van Rossume9f66142002-08-07 15:46:19 +00001450class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1451
1452 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001453
Guido van Rossume9f66142002-08-07 15:46:19 +00001454 In this case (and in this case only), it should be possible to
1455 create a file object, read a line from it, create another file
1456 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001457 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001458 when reading multiple requests from the same socket."""
1459
1460 bufsize = 0 # Use unbuffered mode
1461
1462 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001463 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001464 line = self.read_file.readline() # first line
1465 self.assertEqual(line, b"A. " + self.write_msg) # first line
1466 self.read_file = self.cli_conn.makefile('rb', 0)
1467 line = self.read_file.readline() # second line
1468 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001469
1470 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001471 self.write_file.write(b"A. " + self.write_msg)
1472 self.write_file.write(b"B. " + self.write_msg)
1473 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001474
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001475 def testMakefileClose(self):
1476 # The file returned by makefile should keep the socket open...
1477 self.cli_conn.close()
1478 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001479 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001480 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001481 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001482 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1483
1484 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001485 self.write_file.write(self.write_msg)
1486 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001487
1488 def testMakefileCloseSocketDestroy(self):
1489 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001490 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001491 refcount_after = sys.getrefcount(self.cli_conn)
1492 self.assertEqual(refcount_before - 1, refcount_after)
1493
1494 def _testMakefileCloseSocketDestroy(self):
1495 pass
1496
Antoine Pitrou98b46702010-09-18 22:59:00 +00001497 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001498 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001499 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1500
1501 def testSmallReadNonBlocking(self):
1502 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001503 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1504 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001505 self.evt1.set()
1506 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001507 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001508 if first_seg is None:
1509 # Data not arrived (can happen under Windows), wait a bit
1510 time.sleep(0.5)
1511 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001512 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001513 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001514 self.assertEqual(n, 3)
1515 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001516 self.assertEqual(msg, self.read_msg)
1517 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1518 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001519
1520 def _testSmallReadNonBlocking(self):
1521 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001522 self.write_file.write(self.write_msg)
1523 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001524 self.evt2.set()
1525 # Avoid cloding the socket before the server test has finished,
1526 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1527 self.serv_finished.wait(5.0)
1528
1529 def testWriteNonBlocking(self):
1530 self.cli_finished.wait(5.0)
1531 # The client thread can't skip directly - the SkipTest exception
1532 # would appear as a failure.
1533 if self.serv_skipped:
1534 self.skipTest(self.serv_skipped)
1535
1536 def _testWriteNonBlocking(self):
1537 self.serv_skipped = None
1538 self.serv_conn.setblocking(False)
1539 # Try to saturate the socket buffer pipe with repeated large writes.
1540 BIG = b"x" * (1024 ** 2)
1541 LIMIT = 10
1542 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001543 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001544 self.assertGreater(n, 0)
1545 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001546 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001547 if n is None:
1548 # Succeeded
1549 break
1550 self.assertGreater(n, 0)
1551 else:
1552 # Let us know that this test didn't manage to establish
1553 # the expected conditions. This is not a failure in itself but,
1554 # if it happens repeatedly, the test should be fixed.
1555 self.serv_skipped = "failed to saturate the socket buffer"
1556
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001557
Guido van Rossum8c943832002-08-08 01:00:28 +00001558class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1559
1560 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1561
1562
1563class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1564
1565 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001566
Thomas Woutersb2137042007-02-01 18:02:27 +00001567
Antoine Pitrou834bd812010-10-13 16:17:14 +00001568class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1569 """Tests for socket.makefile() in text mode (rather than binary)"""
1570
1571 read_mode = 'r'
1572 read_msg = MSG.decode('utf8')
1573 write_mode = 'wb'
1574 write_msg = MSG
1575 newline = ''
1576
1577
1578class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1579 """Tests for socket.makefile() in text mode (rather than binary)"""
1580
1581 read_mode = 'rb'
1582 read_msg = MSG
1583 write_mode = 'w'
1584 write_msg = MSG.decode('utf8')
1585 newline = ''
1586
1587
1588class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1589 """Tests for socket.makefile() in text mode (rather than binary)"""
1590
1591 read_mode = 'r'
1592 read_msg = MSG.decode('utf8')
1593 write_mode = 'w'
1594 write_msg = MSG.decode('utf8')
1595 newline = ''
1596
1597
Guido van Rossumd8faa362007-04-27 19:54:29 +00001598class NetworkConnectionTest(object):
1599 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001600
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001602 # We're inherited below by BasicTCPTest2, which also inherits
1603 # BasicTCPTest, which defines self.port referenced below.
1604 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001605 self.serv_conn = self.cli
1606
1607class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1608 """Tests that NetworkConnection does not break existing TCP functionality.
1609 """
1610
1611class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001612
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001613 class MockSocket(socket.socket):
1614 def connect(self, *args):
1615 raise socket.timeout('timed out')
1616
1617 @contextlib.contextmanager
1618 def mocked_socket_module(self):
1619 """Return a socket which times out on connect"""
1620 old_socket = socket.socket
1621 socket.socket = self.MockSocket
1622 try:
1623 yield
1624 finally:
1625 socket.socket = old_socket
1626
1627 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001628 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001629 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001630 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001631 with self.assertRaises(socket.error) as cm:
1632 cli.connect((HOST, port))
1633 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1634
1635 def test_create_connection(self):
1636 # Issue #9792: errors raised by create_connection() should have
1637 # a proper errno attribute.
1638 port = support.find_unused_port()
1639 with self.assertRaises(socket.error) as cm:
1640 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04001641
1642 # Issue #16257: create_connection() calls getaddrinfo() against
1643 # 'localhost'. This may result in an IPV6 addr being returned
1644 # as well as an IPV4 one:
1645 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1646 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1647 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1648 #
1649 # create_connection() enumerates through all the addresses returned
1650 # and if it doesn't successfully bind to any of them, it propagates
1651 # the last exception it encountered.
1652 #
1653 # On Solaris, ENETUNREACH is returned in this circumstance instead
1654 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1655 # expected errnos.
1656 expected_errnos = [ errno.ECONNREFUSED, ]
1657 if hasattr(errno, 'ENETUNREACH'):
1658 expected_errnos.append(errno.ENETUNREACH)
1659
1660 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001661
1662 def test_create_connection_timeout(self):
1663 # Issue #9792: create_connection() should not recast timeout errors
1664 # as generic socket errors.
1665 with self.mocked_socket_module():
1666 with self.assertRaises(socket.timeout):
1667 socket.create_connection((HOST, 1234))
1668
Guido van Rossumd8faa362007-04-27 19:54:29 +00001669
Victor Stinner45df8202010-04-28 22:31:17 +00001670@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001671class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1672
1673 def __init__(self, methodName='runTest'):
1674 SocketTCPTest.__init__(self, methodName=methodName)
1675 ThreadableTest.__init__(self)
1676
1677 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001678 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001679
1680 def clientTearDown(self):
1681 self.cli.close()
1682 self.cli = None
1683 ThreadableTest.clientTearDown(self)
1684
1685 def _justAccept(self):
1686 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001687 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001688
1689 testFamily = _justAccept
1690 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001691 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001692 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001693 self.assertEqual(self.cli.family, 2)
1694
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001695 testSourceAddress = _justAccept
1696 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001697 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1698 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001699 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001700 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001701 # The port number being used is sufficient to show that the bind()
1702 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001703
Guido van Rossumd8faa362007-04-27 19:54:29 +00001704 testTimeoutDefault = _justAccept
1705 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001706 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001707 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001708 socket.setdefaulttimeout(42)
1709 try:
1710 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001711 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001712 finally:
1713 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001714 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001715
1716 testTimeoutNone = _justAccept
1717 def _testTimeoutNone(self):
1718 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001719 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001720 socket.setdefaulttimeout(30)
1721 try:
1722 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001723 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001724 finally:
1725 socket.setdefaulttimeout(None)
1726 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001727
1728 testTimeoutValueNamed = _justAccept
1729 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001730 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001731 self.assertEqual(self.cli.gettimeout(), 30)
1732
1733 testTimeoutValueNonamed = _justAccept
1734 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001735 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001736 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001737 self.assertEqual(self.cli.gettimeout(), 30)
1738
Victor Stinner45df8202010-04-28 22:31:17 +00001739@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001740class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1741
1742 def __init__(self, methodName='runTest'):
1743 SocketTCPTest.__init__(self, methodName=methodName)
1744 ThreadableTest.__init__(self)
1745
1746 def clientSetUp(self):
1747 pass
1748
1749 def clientTearDown(self):
1750 self.cli.close()
1751 self.cli = None
1752 ThreadableTest.clientTearDown(self)
1753
1754 def testInsideTimeout(self):
1755 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001756 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001757 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001758 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001759 testOutsideTimeout = testInsideTimeout
1760
1761 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001762 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001763 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001764 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001765
1766 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001767 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001768 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001769
1770
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001771class TCPTimeoutTest(SocketTCPTest):
1772
1773 def testTCPTimeout(self):
1774 def raise_timeout(*args, **kwargs):
1775 self.serv.settimeout(1.0)
1776 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001777 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001778 "Error generating a timeout exception (TCP)")
1779
1780 def testTimeoutZero(self):
1781 ok = False
1782 try:
1783 self.serv.settimeout(0.0)
1784 foo = self.serv.accept()
1785 except socket.timeout:
1786 self.fail("caught timeout instead of error (TCP)")
1787 except socket.error:
1788 ok = True
1789 except:
1790 self.fail("caught unexpected exception (TCP)")
1791 if not ok:
1792 self.fail("accept() returned success when we did not expect it")
1793
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001794 def testInterruptedTimeout(self):
1795 # XXX I don't know how to do this test on MSWindows or any other
1796 # plaform that doesn't support signal.alarm() or os.kill(), though
1797 # the bug should have existed on all platforms.
1798 if not hasattr(signal, "alarm"):
1799 return # can only test on *nix
1800 self.serv.settimeout(5.0) # must be longer than alarm
1801 class Alarm(Exception):
1802 pass
1803 def alarm_handler(signal, frame):
1804 raise Alarm
1805 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1806 try:
1807 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1808 try:
1809 foo = self.serv.accept()
1810 except socket.timeout:
1811 self.fail("caught timeout instead of Alarm")
1812 except Alarm:
1813 pass
1814 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001815 self.fail("caught other exception instead of Alarm:"
1816 " %s(%s):\n%s" %
1817 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001818 else:
1819 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001820 finally:
1821 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001822 except Alarm:
1823 self.fail("got Alarm in wrong place")
1824 finally:
1825 # no alarm can be pending. Safe to restore old handler.
1826 signal.signal(signal.SIGALRM, old_alarm)
1827
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02001828class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001829
1830 def testUDPTimeout(self):
1831 def raise_timeout(*args, **kwargs):
1832 self.serv.settimeout(1.0)
1833 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001834 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001835 "Error generating a timeout exception (UDP)")
1836
1837 def testTimeoutZero(self):
1838 ok = False
1839 try:
1840 self.serv.settimeout(0.0)
1841 foo = self.serv.recv(1024)
1842 except socket.timeout:
1843 self.fail("caught timeout instead of error (UDP)")
1844 except socket.error:
1845 ok = True
1846 except:
1847 self.fail("caught unexpected exception (UDP)")
1848 if not ok:
1849 self.fail("recv() returned success when we did not expect it")
1850
1851class TestExceptions(unittest.TestCase):
1852
1853 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001854 self.assertTrue(issubclass(socket.error, Exception))
1855 self.assertTrue(issubclass(socket.herror, socket.error))
1856 self.assertTrue(issubclass(socket.gaierror, socket.error))
1857 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001858
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001859class TestLinuxAbstractNamespace(unittest.TestCase):
1860
1861 UNIX_PATH_MAX = 108
1862
1863 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001864 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001865 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1866 s1.bind(address)
1867 s1.listen(1)
1868 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1869 s2.connect(s1.getsockname())
1870 with s1.accept()[0] as s3:
1871 self.assertEqual(s1.getsockname(), address)
1872 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001873
1874 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001875 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001876 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1877 s.bind(address)
1878 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001879
1880 def testNameOverflow(self):
1881 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001882 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1883 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001884
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001885
Victor Stinner45df8202010-04-28 22:31:17 +00001886@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001887class BufferIOTest(SocketConnectedTest):
1888 """
1889 Test the buffer versions of socket.recv() and socket.send().
1890 """
1891 def __init__(self, methodName='runTest'):
1892 SocketConnectedTest.__init__(self, methodName=methodName)
1893
Antoine Pitrou25480782010-03-17 22:50:28 +00001894 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001895 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001896 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001897 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001898 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001899 self.assertEqual(msg, MSG)
1900
Antoine Pitrou25480782010-03-17 22:50:28 +00001901 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001902 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001903 self.serv_conn.send(buf)
1904
Antoine Pitrou25480782010-03-17 22:50:28 +00001905 def testRecvIntoBytearray(self):
1906 buf = bytearray(1024)
1907 nbytes = self.cli_conn.recv_into(buf)
1908 self.assertEqual(nbytes, len(MSG))
1909 msg = buf[:len(MSG)]
1910 self.assertEqual(msg, MSG)
1911
1912 _testRecvIntoBytearray = _testRecvIntoArray
1913
1914 def testRecvIntoMemoryview(self):
1915 buf = bytearray(1024)
1916 nbytes = self.cli_conn.recv_into(memoryview(buf))
1917 self.assertEqual(nbytes, len(MSG))
1918 msg = buf[:len(MSG)]
1919 self.assertEqual(msg, MSG)
1920
1921 _testRecvIntoMemoryview = _testRecvIntoArray
1922
1923 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001924 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001925 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001926 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001927 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001928 self.assertEqual(msg, MSG)
1929
Antoine Pitrou25480782010-03-17 22:50:28 +00001930 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001931 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001932 self.serv_conn.send(buf)
1933
Antoine Pitrou25480782010-03-17 22:50:28 +00001934 def testRecvFromIntoBytearray(self):
1935 buf = bytearray(1024)
1936 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1937 self.assertEqual(nbytes, len(MSG))
1938 msg = buf[:len(MSG)]
1939 self.assertEqual(msg, MSG)
1940
1941 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1942
1943 def testRecvFromIntoMemoryview(self):
1944 buf = bytearray(1024)
1945 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1946 self.assertEqual(nbytes, len(MSG))
1947 msg = buf[:len(MSG)]
1948 self.assertEqual(msg, MSG)
1949
1950 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1951
Christian Heimes043d6f62008-01-07 17:19:16 +00001952
1953TIPC_STYPE = 2000
1954TIPC_LOWER = 200
1955TIPC_UPPER = 210
1956
1957def isTipcAvailable():
1958 """Check if the TIPC module is loaded
1959
1960 The TIPC module is not loaded automatically on Ubuntu and probably
1961 other Linux distros.
1962 """
1963 if not hasattr(socket, "AF_TIPC"):
1964 return False
1965 if not os.path.isfile("/proc/modules"):
1966 return False
1967 with open("/proc/modules") as f:
1968 for line in f:
1969 if line.startswith("tipc "):
1970 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001971 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001972 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1973 return False
1974
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001975class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00001976 def testRDM(self):
1977 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1978 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001979 self.addCleanup(srv.close)
1980 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001981
1982 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1983 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1984 TIPC_LOWER, TIPC_UPPER)
1985 srv.bind(srvaddr)
1986
1987 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1988 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1989 cli.sendto(MSG, sendaddr)
1990
1991 msg, recvaddr = srv.recvfrom(1024)
1992
1993 self.assertEqual(cli.getsockname(), recvaddr)
1994 self.assertEqual(msg, MSG)
1995
1996
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001997class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00001998 def __init__(self, methodName = 'runTest'):
1999 unittest.TestCase.__init__(self, methodName = methodName)
2000 ThreadableTest.__init__(self)
2001
2002 def setUp(self):
2003 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02002004 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00002005 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
2006 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
2007 TIPC_LOWER, TIPC_UPPER)
2008 self.srv.bind(srvaddr)
2009 self.srv.listen(5)
2010 self.serverExplicitReady()
2011 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02002012 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00002013
2014 def clientSetUp(self):
2015 # The is a hittable race between serverExplicitReady() and the
2016 # accept() call; sleep a little while to avoid it, otherwise
2017 # we could get an exception
2018 time.sleep(0.1)
2019 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02002020 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00002021 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
2022 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
2023 self.cli.connect(addr)
2024 self.cliaddr = self.cli.getsockname()
2025
2026 def testStream(self):
2027 msg = self.conn.recv(1024)
2028 self.assertEqual(msg, MSG)
2029 self.assertEqual(self.cliaddr, self.connaddr)
2030
2031 def _testStream(self):
2032 self.cli.send(MSG)
2033 self.cli.close()
2034
2035
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002036@unittest.skipUnless(thread, 'Threading required for this test.')
2037class ContextManagersTest(ThreadedTCPSocketTest):
2038
2039 def _testSocketClass(self):
2040 # base test
2041 with socket.socket() as sock:
2042 self.assertFalse(sock._closed)
2043 self.assertTrue(sock._closed)
2044 # close inside with block
2045 with socket.socket() as sock:
2046 sock.close()
2047 self.assertTrue(sock._closed)
2048 # exception inside with block
2049 with socket.socket() as sock:
2050 self.assertRaises(socket.error, sock.sendall, b'foo')
2051 self.assertTrue(sock._closed)
2052
2053 def testCreateConnectionBase(self):
2054 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002055 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002056 data = conn.recv(1024)
2057 conn.sendall(data)
2058
2059 def _testCreateConnectionBase(self):
2060 address = self.serv.getsockname()
2061 with socket.create_connection(address) as sock:
2062 self.assertFalse(sock._closed)
2063 sock.sendall(b'foo')
2064 self.assertEqual(sock.recv(1024), b'foo')
2065 self.assertTrue(sock._closed)
2066
2067 def testCreateConnectionClose(self):
2068 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002069 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002070 data = conn.recv(1024)
2071 conn.sendall(data)
2072
2073 def _testCreateConnectionClose(self):
2074 address = self.serv.getsockname()
2075 with socket.create_connection(address) as sock:
2076 sock.close()
2077 self.assertTrue(sock._closed)
2078 self.assertRaises(socket.error, sock.sendall, b'foo')
2079
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002080
Antoine Pitroub1c54962010-10-14 15:05:38 +00002081@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
2082 "SOCK_CLOEXEC not defined")
2083@unittest.skipUnless(fcntl, "module fcntl not available")
2084class CloexecConstantTest(unittest.TestCase):
2085 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002086 v = linux_version()
2087 if v < (2, 6, 28):
2088 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2089 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002090 with socket.socket(socket.AF_INET,
2091 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2092 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2093 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002094
2095
2096@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2097 "SOCK_NONBLOCK not defined")
2098class NonblockConstantTest(unittest.TestCase):
2099 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2100 if nonblock:
2101 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2102 self.assertEqual(s.gettimeout(), timeout)
2103 else:
2104 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2105 self.assertEqual(s.gettimeout(), None)
2106
2107 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002108 v = linux_version()
2109 if v < (2, 6, 28):
2110 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2111 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002112 # a lot of it seems silly and redundant, but I wanted to test that
2113 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002114 with socket.socket(socket.AF_INET,
2115 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2116 self.checkNonblock(s)
2117 s.setblocking(1)
2118 self.checkNonblock(s, False)
2119 s.setblocking(0)
2120 self.checkNonblock(s)
2121 s.settimeout(None)
2122 self.checkNonblock(s, False)
2123 s.settimeout(2.0)
2124 self.checkNonblock(s, timeout=2.0)
2125 s.setblocking(1)
2126 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002127 # defaulttimeout
2128 t = socket.getdefaulttimeout()
2129 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002130 with socket.socket() as s:
2131 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002132 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002133 with socket.socket() as s:
2134 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002135 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002136 with socket.socket() as s:
2137 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002138 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002139 with socket.socket() as s:
2140 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002141 socket.setdefaulttimeout(t)
2142
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002143
Guido van Rossumb995eb72002-07-31 16:08:40 +00002144def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002145 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002146 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002147
2148 tests.extend([
2149 NonBlockingTCPTests,
2150 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002151 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002152 UnbufferedFileObjectClassTestCase,
2153 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002154 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002155 UnicodeReadFileObjectClassTestCase,
2156 UnicodeWriteFileObjectClassTestCase,
2157 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002158 NetworkConnectionNoServer,
2159 NetworkConnectionAttributesTest,
2160 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002161 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002162 CloexecConstantTest,
2163 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002164 ])
Dave Cole331708b2004-08-09 04:51:41 +00002165 if hasattr(socket, "socketpair"):
2166 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002167 if sys.platform == 'linux2':
2168 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002169 if isTipcAvailable():
2170 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002171 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002172
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002173 thread_info = support.threading_setup()
2174 support.run_unittest(*tests)
2175 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002176
2177if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002178 test_main()