blob: cce0d1b6eb4f917ddcc6611ed820b7371bed9224 [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 Pitrou1be815a2011-05-10 19:16:29 +0200842 def testListenBacklog0(self):
843 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
844 srv.bind((HOST, 0))
845 # backlog = 0
846 srv.listen(0)
847 srv.close()
848
Charles-François Natali366999a2012-01-02 15:47:29 +0100849 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
850 def test_flowinfo(self):
851 self.assertRaises(OverflowError, socket.getnameinfo,
852 ('::1',0, 0xffffffff), 0)
853 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
854 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
855
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000856
Victor Stinner45df8202010-04-28 22:31:17 +0000857@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858class BasicTCPTest(SocketConnectedTest):
859
860 def __init__(self, methodName='runTest'):
861 SocketConnectedTest.__init__(self, methodName=methodName)
862
863 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000864 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000866 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867
868 def _testRecv(self):
869 self.serv_conn.send(MSG)
870
871 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000872 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000873 seg1 = self.cli_conn.recv(len(MSG) - 3)
874 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000875 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000876 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000877
878 def _testOverFlowRecv(self):
879 self.serv_conn.send(MSG)
880
881 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000882 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000883 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000884 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000885
886 def _testRecvFrom(self):
887 self.serv_conn.send(MSG)
888
889 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000890 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000891 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
892 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000893 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000894 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895
896 def _testOverFlowRecvFrom(self):
897 self.serv_conn.send(MSG)
898
899 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000900 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000901 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000902 while 1:
903 read = self.cli_conn.recv(1024)
904 if not read:
905 break
Guido van Rossume531e292002-08-08 20:28:34 +0000906 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000907 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000908
909 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000910 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000911 self.serv_conn.sendall(big_chunk)
912
913 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000914 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000915 fd = self.cli_conn.fileno()
916 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000917 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000918 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000920 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000921
922 def _testFromFd(self):
923 self.serv_conn.send(MSG)
924
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000925 def testDup(self):
926 # Testing dup()
927 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000928 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000929 msg = sock.recv(1024)
930 self.assertEqual(msg, MSG)
931
932 def _testDup(self):
933 self.serv_conn.send(MSG)
934
Guido van Rossum24e4af82002-06-12 19:18:08 +0000935 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000936 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000938 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000939 # wait for _testShutdown to finish: on OS X, when the server
940 # closes the connection the client also becomes disconnected,
941 # and the client's shutdown call will fail. (Issue #4397.)
942 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000943
944 def _testShutdown(self):
945 self.serv_conn.send(MSG)
946 self.serv_conn.shutdown(2)
947
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000948 def testDetach(self):
949 # Testing detach()
950 fileno = self.cli_conn.fileno()
951 f = self.cli_conn.detach()
952 self.assertEqual(f, fileno)
953 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +0200954 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000955 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
956 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000957 # ...but we can create another socket using the (still open)
958 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000959 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000960 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000961 msg = sock.recv(1024)
962 self.assertEqual(msg, MSG)
963
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000964 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000965 self.serv_conn.send(MSG)
966
Victor Stinner45df8202010-04-28 22:31:17 +0000967@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000968class BasicUDPTest(ThreadedUDPSocketTest):
969
970 def __init__(self, methodName='runTest'):
971 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
972
973 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000974 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000975 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000976 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977
978 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000979 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000980
Guido van Rossum1c938012002-06-12 21:17:20 +0000981 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000982 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000983 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000984 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000985
Guido van Rossum1c938012002-06-12 21:17:20 +0000986 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000987 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000988
Guido van Rossumd8faa362007-04-27 19:54:29 +0000989 def testRecvFromNegative(self):
990 # Negative lengths passed to recvfrom should give ValueError.
991 self.assertRaises(ValueError, self.serv.recvfrom, -1)
992
993 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000994 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000995
Victor Stinner45df8202010-04-28 22:31:17 +0000996@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000997class TCPCloserTest(ThreadedTCPSocketTest):
998
999 def testClose(self):
1000 conn, addr = self.serv.accept()
1001 conn.close()
1002
1003 sd = self.cli
1004 read, write, err = select.select([sd], [], [], 1.0)
1005 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001006 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001007
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001008 # Calling close() many times should be safe.
1009 conn.close()
1010 conn.close()
1011
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001012 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001013 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001014 time.sleep(1.0)
1015
Victor Stinner45df8202010-04-28 22:31:17 +00001016@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00001017class BasicSocketPairTest(SocketPairTest):
1018
1019 def __init__(self, methodName='runTest'):
1020 SocketPairTest.__init__(self, methodName=methodName)
1021
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001022 def _check_defaults(self, sock):
1023 self.assertIsInstance(sock, socket.socket)
1024 if hasattr(socket, 'AF_UNIX'):
1025 self.assertEqual(sock.family, socket.AF_UNIX)
1026 else:
1027 self.assertEqual(sock.family, socket.AF_INET)
1028 self.assertEqual(sock.type, socket.SOCK_STREAM)
1029 self.assertEqual(sock.proto, 0)
1030
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001031 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001032 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001033
1034 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001035 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001036
Dave Cole331708b2004-08-09 04:51:41 +00001037 def testRecv(self):
1038 msg = self.serv.recv(1024)
1039 self.assertEqual(msg, MSG)
1040
1041 def _testRecv(self):
1042 self.cli.send(MSG)
1043
1044 def testSend(self):
1045 self.serv.send(MSG)
1046
1047 def _testSend(self):
1048 msg = self.cli.recv(1024)
1049 self.assertEqual(msg, MSG)
1050
Victor Stinner45df8202010-04-28 22:31:17 +00001051@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001052class NonBlockingTCPTests(ThreadedTCPSocketTest):
1053
1054 def __init__(self, methodName='runTest'):
1055 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1056
1057 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001058 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059 self.serv.setblocking(0)
1060 start = time.time()
1061 try:
1062 self.serv.accept()
1063 except socket.error:
1064 pass
1065 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001066 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067
1068 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001069 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001070
Antoine Pitroub1c54962010-10-14 15:05:38 +00001071 if hasattr(socket, "SOCK_NONBLOCK"):
1072 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001073 v = linux_version()
1074 if v < (2, 6, 28):
1075 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1076 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001077 # reinit server socket
1078 self.serv.close()
1079 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001080 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001081 self.port = support.bind_port(self.serv)
1082 self.serv.listen(1)
1083 # actual testing
1084 start = time.time()
1085 try:
1086 self.serv.accept()
1087 except socket.error:
1088 pass
1089 end = time.time()
1090 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1091
1092 def _testInitNonBlocking(self):
1093 pass
1094
Antoine Pitrou600232b2011-01-05 21:03:42 +00001095 def testInheritFlags(self):
1096 # Issue #7995: when calling accept() on a listening socket with a
1097 # timeout, the resulting socket should not be non-blocking.
1098 self.serv.settimeout(10)
1099 try:
1100 conn, addr = self.serv.accept()
1101 message = conn.recv(len(MSG))
1102 finally:
1103 conn.close()
1104 self.serv.settimeout(None)
1105
1106 def _testInheritFlags(self):
1107 time.sleep(0.1)
1108 self.cli.connect((HOST, self.port))
1109 time.sleep(0.5)
1110 self.cli.send(MSG)
1111
Guido van Rossum24e4af82002-06-12 19:18:08 +00001112 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001113 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001114 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001115 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001116 conn, addr = self.serv.accept()
1117 except socket.error:
1118 pass
1119 else:
1120 self.fail("Error trying to do non-blocking accept.")
1121 read, write, err = select.select([self.serv], [], [])
1122 if self.serv in read:
1123 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001124 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001125 else:
1126 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001127
Guido van Rossum24e4af82002-06-12 19:18:08 +00001128 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001129 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001130 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001131
1132 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001133 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001134 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001135 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001136
1137 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001138 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001139 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001140
1141 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001142 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143 conn, addr = self.serv.accept()
1144 conn.setblocking(0)
1145 try:
1146 msg = conn.recv(len(MSG))
1147 except socket.error:
1148 pass
1149 else:
1150 self.fail("Error trying to do non-blocking recv.")
1151 read, write, err = select.select([conn], [], [])
1152 if conn in read:
1153 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001154 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001155 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001156 else:
1157 self.fail("Error during select call to non-blocking socket.")
1158
1159 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001160 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001161 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001162 self.cli.send(MSG)
1163
Victor Stinner45df8202010-04-28 22:31:17 +00001164@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001165class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001166 """Unit tests for the object returned by socket.makefile()
1167
Antoine Pitrou834bd812010-10-13 16:17:14 +00001168 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001169 the client connection. You can read from this file to
1170 get output from the server.
1171
Antoine Pitrou834bd812010-10-13 16:17:14 +00001172 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001173 server connection. You can write to this file to send output
1174 to the client.
1175 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001176
Guido van Rossume9f66142002-08-07 15:46:19 +00001177 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001178 encoding = 'utf8'
1179 errors = 'strict'
1180 newline = None
1181
1182 read_mode = 'rb'
1183 read_msg = MSG
1184 write_mode = 'wb'
1185 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001186
Guido van Rossum24e4af82002-06-12 19:18:08 +00001187 def __init__(self, methodName='runTest'):
1188 SocketConnectedTest.__init__(self, methodName=methodName)
1189
1190 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001191 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1192 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001193 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001194 self.read_file = self.cli_conn.makefile(
1195 self.read_mode, self.bufsize,
1196 encoding = self.encoding,
1197 errors = self.errors,
1198 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001199
1200 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001201 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001202 self.read_file.close()
1203 self.assertTrue(self.read_file.closed)
1204 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001205 SocketConnectedTest.tearDown(self)
1206
1207 def clientSetUp(self):
1208 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001209 self.write_file = self.serv_conn.makefile(
1210 self.write_mode, self.bufsize,
1211 encoding = self.encoding,
1212 errors = self.errors,
1213 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001214
1215 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001216 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001217 self.write_file.close()
1218 self.assertTrue(self.write_file.closed)
1219 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001220 SocketConnectedTest.clientTearDown(self)
1221
Antoine Pitrou5d5381e2011-02-25 23:14:08 +00001222 def testReadAfterTimeout(self):
1223 # Issue #7322: A file object must disallow further reads
1224 # after a timeout has occurred.
1225 self.cli_conn.settimeout(1)
1226 self.read_file.read(3)
1227 # First read raises a timeout
1228 self.assertRaises(socket.timeout, self.read_file.read, 1)
1229 # Second read is disallowed
1230 with self.assertRaises(IOError) as ctx:
1231 self.read_file.read(1)
1232 self.assertIn("cannot read from timed out object", str(ctx.exception))
1233
1234 def _testReadAfterTimeout(self):
1235 self.write_file.write(self.write_msg[0:3])
1236 self.write_file.flush()
1237 self.serv_finished.wait()
1238
Guido van Rossum24e4af82002-06-12 19:18:08 +00001239 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001240 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001241 first_seg = self.read_file.read(len(self.read_msg)-3)
1242 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001243 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001244 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001245
1246 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001247 self.write_file.write(self.write_msg)
1248 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001249
Guido van Rossum8c943832002-08-08 01:00:28 +00001250 def testFullRead(self):
1251 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001252 msg = self.read_file.read()
1253 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001254
1255 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001256 self.write_file.write(self.write_msg)
1257 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001258
Guido van Rossum24e4af82002-06-12 19:18:08 +00001259 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001260 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001261 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001262 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001263 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001264 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001265 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001266 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001267 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001268
1269 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001270 self.write_file.write(self.write_msg)
1271 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001272
1273 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001274 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001275 line = self.read_file.readline()
1276 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001277
1278 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001279 self.write_file.write(self.write_msg)
1280 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001281
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001282 def testCloseAfterMakefile(self):
1283 # The file returned by makefile should keep the socket open.
1284 self.cli_conn.close()
1285 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001286 msg = self.read_file.read()
1287 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001288
1289 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001290 self.write_file.write(self.write_msg)
1291 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001292
1293 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001294 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001295 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001296 if isinstance(self.read_msg, str):
1297 msg = msg.decode()
1298 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001299
1300 def _testMakefileAfterMakefileClose(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
Tim Peters116d83c2004-03-28 02:20:45 +00001304 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001305 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001306
1307 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001308 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001309
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001310 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001311 self.assertEqual(self.read_file.mode, self.read_mode)
1312 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001313
1314 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001315 self.assertEqual(self.write_file.mode, self.write_mode)
1316 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001317
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001318 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001319 self.read_file.close()
1320 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001321 self.cli_conn.close()
1322 self.assertRaises(socket.error, self.cli_conn.getsockname)
1323
1324 def _testRealClose(self):
1325 pass
1326
1327
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001328class FileObjectInterruptedTestCase(unittest.TestCase):
1329 """Test that the file object correctly handles EINTR internally."""
1330
1331 class MockSocket(object):
1332 def __init__(self, recv_funcs=()):
1333 # A generator that returns callables that we'll call for each
1334 # call to recv().
1335 self._recv_step = iter(recv_funcs)
1336
1337 def recv_into(self, buffer):
1338 data = next(self._recv_step)()
1339 assert len(buffer) >= len(data)
1340 buffer[:len(data)] = data
1341 return len(data)
1342
1343 def _decref_socketios(self):
1344 pass
1345
1346 def _textiowrap_for_test(self, buffering=-1):
1347 raw = socket.SocketIO(self, "r")
1348 if buffering < 0:
1349 buffering = io.DEFAULT_BUFFER_SIZE
1350 if buffering == 0:
1351 return raw
1352 buffer = io.BufferedReader(raw, buffering)
1353 text = io.TextIOWrapper(buffer, None, None)
1354 text.mode = "rb"
1355 return text
1356
1357 @staticmethod
1358 def _raise_eintr():
1359 raise socket.error(errno.EINTR)
1360
1361 def _textiowrap_mock_socket(self, mock, buffering=-1):
1362 raw = socket.SocketIO(mock, "r")
1363 if buffering < 0:
1364 buffering = io.DEFAULT_BUFFER_SIZE
1365 if buffering == 0:
1366 return raw
1367 buffer = io.BufferedReader(raw, buffering)
1368 text = io.TextIOWrapper(buffer, None, None)
1369 text.mode = "rb"
1370 return text
1371
1372 def _test_readline(self, size=-1, buffering=-1):
1373 mock_sock = self.MockSocket(recv_funcs=[
1374 lambda : b"This is the first line\nAnd the sec",
1375 self._raise_eintr,
1376 lambda : b"ond line is here\n",
1377 lambda : b"",
1378 lambda : b"", # XXX(gps): io library does an extra EOF read
1379 ])
1380 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001381 self.assertEqual(fo.readline(size), "This is the first line\n")
1382 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001383
1384 def _test_read(self, size=-1, buffering=-1):
1385 mock_sock = self.MockSocket(recv_funcs=[
1386 lambda : b"This is the first line\nAnd the sec",
1387 self._raise_eintr,
1388 lambda : b"ond line is here\n",
1389 lambda : b"",
1390 lambda : b"", # XXX(gps): io library does an extra EOF read
1391 ])
1392 expecting = (b"This is the first line\n"
1393 b"And the second line is here\n")
1394 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1395 if buffering == 0:
1396 data = b''
1397 else:
1398 data = ''
1399 expecting = expecting.decode('utf8')
1400 while len(data) != len(expecting):
1401 part = fo.read(size)
1402 if not part:
1403 break
1404 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001405 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001406
1407 def test_default(self):
1408 self._test_readline()
1409 self._test_readline(size=100)
1410 self._test_read()
1411 self._test_read(size=100)
1412
1413 def test_with_1k_buffer(self):
1414 self._test_readline(buffering=1024)
1415 self._test_readline(size=100, buffering=1024)
1416 self._test_read(buffering=1024)
1417 self._test_read(size=100, buffering=1024)
1418
1419 def _test_readline_no_buffer(self, size=-1):
1420 mock_sock = self.MockSocket(recv_funcs=[
1421 lambda : b"a",
1422 lambda : b"\n",
1423 lambda : b"B",
1424 self._raise_eintr,
1425 lambda : b"b",
1426 lambda : b"",
1427 ])
1428 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001429 self.assertEqual(fo.readline(size), b"a\n")
1430 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001431
1432 def test_no_buffer(self):
1433 self._test_readline_no_buffer()
1434 self._test_readline_no_buffer(size=4)
1435 self._test_read(buffering=0)
1436 self._test_read(size=100, buffering=0)
1437
1438
Guido van Rossume9f66142002-08-07 15:46:19 +00001439class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1440
1441 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001442
Guido van Rossume9f66142002-08-07 15:46:19 +00001443 In this case (and in this case only), it should be possible to
1444 create a file object, read a line from it, create another file
1445 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001446 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001447 when reading multiple requests from the same socket."""
1448
1449 bufsize = 0 # Use unbuffered mode
1450
1451 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001452 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001453 line = self.read_file.readline() # first line
1454 self.assertEqual(line, b"A. " + self.write_msg) # first line
1455 self.read_file = self.cli_conn.makefile('rb', 0)
1456 line = self.read_file.readline() # second line
1457 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001458
1459 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001460 self.write_file.write(b"A. " + self.write_msg)
1461 self.write_file.write(b"B. " + self.write_msg)
1462 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001463
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001464 def testMakefileClose(self):
1465 # The file returned by makefile should keep the socket open...
1466 self.cli_conn.close()
1467 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001468 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001469 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001470 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001471 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1472
1473 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001474 self.write_file.write(self.write_msg)
1475 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001476
1477 def testMakefileCloseSocketDestroy(self):
1478 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001479 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001480 refcount_after = sys.getrefcount(self.cli_conn)
1481 self.assertEqual(refcount_before - 1, refcount_after)
1482
1483 def _testMakefileCloseSocketDestroy(self):
1484 pass
1485
Antoine Pitrou98b46702010-09-18 22:59:00 +00001486 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001487 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001488 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1489
1490 def testSmallReadNonBlocking(self):
1491 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001492 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1493 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001494 self.evt1.set()
1495 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001496 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001497 if first_seg is None:
1498 # Data not arrived (can happen under Windows), wait a bit
1499 time.sleep(0.5)
1500 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001501 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001502 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001503 self.assertEqual(n, 3)
1504 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001505 self.assertEqual(msg, self.read_msg)
1506 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1507 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001508
1509 def _testSmallReadNonBlocking(self):
1510 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001511 self.write_file.write(self.write_msg)
1512 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001513 self.evt2.set()
1514 # Avoid cloding the socket before the server test has finished,
1515 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1516 self.serv_finished.wait(5.0)
1517
1518 def testWriteNonBlocking(self):
1519 self.cli_finished.wait(5.0)
1520 # The client thread can't skip directly - the SkipTest exception
1521 # would appear as a failure.
1522 if self.serv_skipped:
1523 self.skipTest(self.serv_skipped)
1524
1525 def _testWriteNonBlocking(self):
1526 self.serv_skipped = None
1527 self.serv_conn.setblocking(False)
1528 # Try to saturate the socket buffer pipe with repeated large writes.
1529 BIG = b"x" * (1024 ** 2)
1530 LIMIT = 10
1531 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001532 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001533 self.assertGreater(n, 0)
1534 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001535 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001536 if n is None:
1537 # Succeeded
1538 break
1539 self.assertGreater(n, 0)
1540 else:
1541 # Let us know that this test didn't manage to establish
1542 # the expected conditions. This is not a failure in itself but,
1543 # if it happens repeatedly, the test should be fixed.
1544 self.serv_skipped = "failed to saturate the socket buffer"
1545
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001546
Guido van Rossum8c943832002-08-08 01:00:28 +00001547class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1548
1549 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1550
1551
1552class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1553
1554 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001555
Thomas Woutersb2137042007-02-01 18:02:27 +00001556
Antoine Pitrou834bd812010-10-13 16:17:14 +00001557class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1558 """Tests for socket.makefile() in text mode (rather than binary)"""
1559
1560 read_mode = 'r'
1561 read_msg = MSG.decode('utf8')
1562 write_mode = 'wb'
1563 write_msg = MSG
1564 newline = ''
1565
1566
1567class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1568 """Tests for socket.makefile() in text mode (rather than binary)"""
1569
1570 read_mode = 'rb'
1571 read_msg = MSG
1572 write_mode = 'w'
1573 write_msg = MSG.decode('utf8')
1574 newline = ''
1575
1576
1577class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1578 """Tests for socket.makefile() in text mode (rather than binary)"""
1579
1580 read_mode = 'r'
1581 read_msg = MSG.decode('utf8')
1582 write_mode = 'w'
1583 write_msg = MSG.decode('utf8')
1584 newline = ''
1585
1586
Guido van Rossumd8faa362007-04-27 19:54:29 +00001587class NetworkConnectionTest(object):
1588 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001589
Guido van Rossumd8faa362007-04-27 19:54:29 +00001590 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001591 # We're inherited below by BasicTCPTest2, which also inherits
1592 # BasicTCPTest, which defines self.port referenced below.
1593 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001594 self.serv_conn = self.cli
1595
1596class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1597 """Tests that NetworkConnection does not break existing TCP functionality.
1598 """
1599
1600class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001601
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001602 class MockSocket(socket.socket):
1603 def connect(self, *args):
1604 raise socket.timeout('timed out')
1605
1606 @contextlib.contextmanager
1607 def mocked_socket_module(self):
1608 """Return a socket which times out on connect"""
1609 old_socket = socket.socket
1610 socket.socket = self.MockSocket
1611 try:
1612 yield
1613 finally:
1614 socket.socket = old_socket
1615
1616 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001617 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001618 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001619 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001620 with self.assertRaises(socket.error) as cm:
1621 cli.connect((HOST, port))
1622 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1623
1624 def test_create_connection(self):
1625 # Issue #9792: errors raised by create_connection() should have
1626 # a proper errno attribute.
1627 port = support.find_unused_port()
1628 with self.assertRaises(socket.error) as cm:
1629 socket.create_connection((HOST, port))
1630 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1631
1632 def test_create_connection_timeout(self):
1633 # Issue #9792: create_connection() should not recast timeout errors
1634 # as generic socket errors.
1635 with self.mocked_socket_module():
1636 with self.assertRaises(socket.timeout):
1637 socket.create_connection((HOST, 1234))
1638
Guido van Rossumd8faa362007-04-27 19:54:29 +00001639
Victor Stinner45df8202010-04-28 22:31:17 +00001640@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1642
1643 def __init__(self, methodName='runTest'):
1644 SocketTCPTest.__init__(self, methodName=methodName)
1645 ThreadableTest.__init__(self)
1646
1647 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001648 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001649
1650 def clientTearDown(self):
1651 self.cli.close()
1652 self.cli = None
1653 ThreadableTest.clientTearDown(self)
1654
1655 def _justAccept(self):
1656 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001657 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001658
1659 testFamily = _justAccept
1660 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001661 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001662 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001663 self.assertEqual(self.cli.family, 2)
1664
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001665 testSourceAddress = _justAccept
1666 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001667 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1668 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001669 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001670 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001671 # The port number being used is sufficient to show that the bind()
1672 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001673
Guido van Rossumd8faa362007-04-27 19:54:29 +00001674 testTimeoutDefault = _justAccept
1675 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001676 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001677 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001678 socket.setdefaulttimeout(42)
1679 try:
1680 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001681 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001682 finally:
1683 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001684 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001685
1686 testTimeoutNone = _justAccept
1687 def _testTimeoutNone(self):
1688 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001689 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001690 socket.setdefaulttimeout(30)
1691 try:
1692 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001693 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001694 finally:
1695 socket.setdefaulttimeout(None)
1696 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001697
1698 testTimeoutValueNamed = _justAccept
1699 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001700 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001701 self.assertEqual(self.cli.gettimeout(), 30)
1702
1703 testTimeoutValueNonamed = _justAccept
1704 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001705 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001706 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001707 self.assertEqual(self.cli.gettimeout(), 30)
1708
Victor Stinner45df8202010-04-28 22:31:17 +00001709@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001710class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1711
1712 def __init__(self, methodName='runTest'):
1713 SocketTCPTest.__init__(self, methodName=methodName)
1714 ThreadableTest.__init__(self)
1715
1716 def clientSetUp(self):
1717 pass
1718
1719 def clientTearDown(self):
1720 self.cli.close()
1721 self.cli = None
1722 ThreadableTest.clientTearDown(self)
1723
1724 def testInsideTimeout(self):
1725 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001726 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001727 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001728 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001729 testOutsideTimeout = testInsideTimeout
1730
1731 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001732 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001733 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001734 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001735
1736 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001737 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001738 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001739
1740
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001741class TCPTimeoutTest(SocketTCPTest):
1742
1743 def testTCPTimeout(self):
1744 def raise_timeout(*args, **kwargs):
1745 self.serv.settimeout(1.0)
1746 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001747 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001748 "Error generating a timeout exception (TCP)")
1749
1750 def testTimeoutZero(self):
1751 ok = False
1752 try:
1753 self.serv.settimeout(0.0)
1754 foo = self.serv.accept()
1755 except socket.timeout:
1756 self.fail("caught timeout instead of error (TCP)")
1757 except socket.error:
1758 ok = True
1759 except:
1760 self.fail("caught unexpected exception (TCP)")
1761 if not ok:
1762 self.fail("accept() returned success when we did not expect it")
1763
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001764 def testInterruptedTimeout(self):
1765 # XXX I don't know how to do this test on MSWindows or any other
1766 # plaform that doesn't support signal.alarm() or os.kill(), though
1767 # the bug should have existed on all platforms.
1768 if not hasattr(signal, "alarm"):
1769 return # can only test on *nix
1770 self.serv.settimeout(5.0) # must be longer than alarm
1771 class Alarm(Exception):
1772 pass
1773 def alarm_handler(signal, frame):
1774 raise Alarm
1775 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1776 try:
1777 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1778 try:
1779 foo = self.serv.accept()
1780 except socket.timeout:
1781 self.fail("caught timeout instead of Alarm")
1782 except Alarm:
1783 pass
1784 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001785 self.fail("caught other exception instead of Alarm:"
1786 " %s(%s):\n%s" %
1787 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001788 else:
1789 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001790 finally:
1791 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001792 except Alarm:
1793 self.fail("got Alarm in wrong place")
1794 finally:
1795 # no alarm can be pending. Safe to restore old handler.
1796 signal.signal(signal.SIGALRM, old_alarm)
1797
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02001798class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001799
1800 def testUDPTimeout(self):
1801 def raise_timeout(*args, **kwargs):
1802 self.serv.settimeout(1.0)
1803 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001804 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001805 "Error generating a timeout exception (UDP)")
1806
1807 def testTimeoutZero(self):
1808 ok = False
1809 try:
1810 self.serv.settimeout(0.0)
1811 foo = self.serv.recv(1024)
1812 except socket.timeout:
1813 self.fail("caught timeout instead of error (UDP)")
1814 except socket.error:
1815 ok = True
1816 except:
1817 self.fail("caught unexpected exception (UDP)")
1818 if not ok:
1819 self.fail("recv() returned success when we did not expect it")
1820
1821class TestExceptions(unittest.TestCase):
1822
1823 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001824 self.assertTrue(issubclass(socket.error, Exception))
1825 self.assertTrue(issubclass(socket.herror, socket.error))
1826 self.assertTrue(issubclass(socket.gaierror, socket.error))
1827 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001828
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829class TestLinuxAbstractNamespace(unittest.TestCase):
1830
1831 UNIX_PATH_MAX = 108
1832
1833 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001834 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001835 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1836 s1.bind(address)
1837 s1.listen(1)
1838 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1839 s2.connect(s1.getsockname())
1840 with s1.accept()[0] as s3:
1841 self.assertEqual(s1.getsockname(), address)
1842 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001843
1844 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001845 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001846 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1847 s.bind(address)
1848 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001849
1850 def testNameOverflow(self):
1851 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001852 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1853 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001854
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001855
Victor Stinner45df8202010-04-28 22:31:17 +00001856@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001857class BufferIOTest(SocketConnectedTest):
1858 """
1859 Test the buffer versions of socket.recv() and socket.send().
1860 """
1861 def __init__(self, methodName='runTest'):
1862 SocketConnectedTest.__init__(self, methodName=methodName)
1863
Antoine Pitrou25480782010-03-17 22:50:28 +00001864 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001865 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001866 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001867 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001868 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001869 self.assertEqual(msg, MSG)
1870
Antoine Pitrou25480782010-03-17 22:50:28 +00001871 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001872 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001873 self.serv_conn.send(buf)
1874
Antoine Pitrou25480782010-03-17 22:50:28 +00001875 def testRecvIntoBytearray(self):
1876 buf = bytearray(1024)
1877 nbytes = self.cli_conn.recv_into(buf)
1878 self.assertEqual(nbytes, len(MSG))
1879 msg = buf[:len(MSG)]
1880 self.assertEqual(msg, MSG)
1881
1882 _testRecvIntoBytearray = _testRecvIntoArray
1883
1884 def testRecvIntoMemoryview(self):
1885 buf = bytearray(1024)
1886 nbytes = self.cli_conn.recv_into(memoryview(buf))
1887 self.assertEqual(nbytes, len(MSG))
1888 msg = buf[:len(MSG)]
1889 self.assertEqual(msg, MSG)
1890
1891 _testRecvIntoMemoryview = _testRecvIntoArray
1892
1893 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001894 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001895 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001896 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001897 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001898 self.assertEqual(msg, MSG)
1899
Antoine Pitrou25480782010-03-17 22:50:28 +00001900 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001901 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001902 self.serv_conn.send(buf)
1903
Antoine Pitrou25480782010-03-17 22:50:28 +00001904 def testRecvFromIntoBytearray(self):
1905 buf = bytearray(1024)
1906 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1907 self.assertEqual(nbytes, len(MSG))
1908 msg = buf[:len(MSG)]
1909 self.assertEqual(msg, MSG)
1910
1911 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1912
1913 def testRecvFromIntoMemoryview(self):
1914 buf = bytearray(1024)
1915 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1916 self.assertEqual(nbytes, len(MSG))
1917 msg = buf[:len(MSG)]
1918 self.assertEqual(msg, MSG)
1919
1920 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1921
Christian Heimes043d6f62008-01-07 17:19:16 +00001922
1923TIPC_STYPE = 2000
1924TIPC_LOWER = 200
1925TIPC_UPPER = 210
1926
1927def isTipcAvailable():
1928 """Check if the TIPC module is loaded
1929
1930 The TIPC module is not loaded automatically on Ubuntu and probably
1931 other Linux distros.
1932 """
1933 if not hasattr(socket, "AF_TIPC"):
1934 return False
1935 if not os.path.isfile("/proc/modules"):
1936 return False
1937 with open("/proc/modules") as f:
1938 for line in f:
1939 if line.startswith("tipc "):
1940 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001941 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001942 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1943 return False
1944
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001945class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00001946 def testRDM(self):
1947 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1948 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001949 self.addCleanup(srv.close)
1950 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001951
1952 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1953 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1954 TIPC_LOWER, TIPC_UPPER)
1955 srv.bind(srvaddr)
1956
1957 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1958 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1959 cli.sendto(MSG, sendaddr)
1960
1961 msg, recvaddr = srv.recvfrom(1024)
1962
1963 self.assertEqual(cli.getsockname(), recvaddr)
1964 self.assertEqual(msg, MSG)
1965
1966
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001967class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00001968 def __init__(self, methodName = 'runTest'):
1969 unittest.TestCase.__init__(self, methodName = methodName)
1970 ThreadableTest.__init__(self)
1971
1972 def setUp(self):
1973 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001974 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001975 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1976 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1977 TIPC_LOWER, TIPC_UPPER)
1978 self.srv.bind(srvaddr)
1979 self.srv.listen(5)
1980 self.serverExplicitReady()
1981 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001982 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001983
1984 def clientSetUp(self):
1985 # The is a hittable race between serverExplicitReady() and the
1986 # accept() call; sleep a little while to avoid it, otherwise
1987 # we could get an exception
1988 time.sleep(0.1)
1989 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001990 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001991 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1992 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1993 self.cli.connect(addr)
1994 self.cliaddr = self.cli.getsockname()
1995
1996 def testStream(self):
1997 msg = self.conn.recv(1024)
1998 self.assertEqual(msg, MSG)
1999 self.assertEqual(self.cliaddr, self.connaddr)
2000
2001 def _testStream(self):
2002 self.cli.send(MSG)
2003 self.cli.close()
2004
2005
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002006@unittest.skipUnless(thread, 'Threading required for this test.')
2007class ContextManagersTest(ThreadedTCPSocketTest):
2008
2009 def _testSocketClass(self):
2010 # base test
2011 with socket.socket() as sock:
2012 self.assertFalse(sock._closed)
2013 self.assertTrue(sock._closed)
2014 # close inside with block
2015 with socket.socket() as sock:
2016 sock.close()
2017 self.assertTrue(sock._closed)
2018 # exception inside with block
2019 with socket.socket() as sock:
2020 self.assertRaises(socket.error, sock.sendall, b'foo')
2021 self.assertTrue(sock._closed)
2022
2023 def testCreateConnectionBase(self):
2024 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002025 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002026 data = conn.recv(1024)
2027 conn.sendall(data)
2028
2029 def _testCreateConnectionBase(self):
2030 address = self.serv.getsockname()
2031 with socket.create_connection(address) as sock:
2032 self.assertFalse(sock._closed)
2033 sock.sendall(b'foo')
2034 self.assertEqual(sock.recv(1024), b'foo')
2035 self.assertTrue(sock._closed)
2036
2037 def testCreateConnectionClose(self):
2038 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002039 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002040 data = conn.recv(1024)
2041 conn.sendall(data)
2042
2043 def _testCreateConnectionClose(self):
2044 address = self.serv.getsockname()
2045 with socket.create_connection(address) as sock:
2046 sock.close()
2047 self.assertTrue(sock._closed)
2048 self.assertRaises(socket.error, sock.sendall, b'foo')
2049
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002050
Antoine Pitroub1c54962010-10-14 15:05:38 +00002051@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
2052 "SOCK_CLOEXEC not defined")
2053@unittest.skipUnless(fcntl, "module fcntl not available")
2054class CloexecConstantTest(unittest.TestCase):
2055 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002056 v = linux_version()
2057 if v < (2, 6, 28):
2058 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2059 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002060 with socket.socket(socket.AF_INET,
2061 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2062 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2063 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002064
2065
2066@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2067 "SOCK_NONBLOCK not defined")
2068class NonblockConstantTest(unittest.TestCase):
2069 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2070 if nonblock:
2071 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2072 self.assertEqual(s.gettimeout(), timeout)
2073 else:
2074 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2075 self.assertEqual(s.gettimeout(), None)
2076
2077 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002078 v = linux_version()
2079 if v < (2, 6, 28):
2080 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2081 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002082 # a lot of it seems silly and redundant, but I wanted to test that
2083 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002084 with socket.socket(socket.AF_INET,
2085 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2086 self.checkNonblock(s)
2087 s.setblocking(1)
2088 self.checkNonblock(s, False)
2089 s.setblocking(0)
2090 self.checkNonblock(s)
2091 s.settimeout(None)
2092 self.checkNonblock(s, False)
2093 s.settimeout(2.0)
2094 self.checkNonblock(s, timeout=2.0)
2095 s.setblocking(1)
2096 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002097 # defaulttimeout
2098 t = socket.getdefaulttimeout()
2099 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002100 with socket.socket() as s:
2101 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002102 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002103 with socket.socket() as s:
2104 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002105 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002106 with socket.socket() as s:
2107 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002108 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002109 with socket.socket() as s:
2110 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002111 socket.setdefaulttimeout(t)
2112
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002113
Guido van Rossumb995eb72002-07-31 16:08:40 +00002114def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002115 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002116 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002117
2118 tests.extend([
2119 NonBlockingTCPTests,
2120 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002121 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002122 UnbufferedFileObjectClassTestCase,
2123 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002124 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002125 UnicodeReadFileObjectClassTestCase,
2126 UnicodeWriteFileObjectClassTestCase,
2127 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002128 NetworkConnectionNoServer,
2129 NetworkConnectionAttributesTest,
2130 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002131 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002132 CloexecConstantTest,
2133 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002134 ])
Dave Cole331708b2004-08-09 04:51:41 +00002135 if hasattr(socket, "socketpair"):
2136 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002137 if sys.platform == 'linux2':
2138 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002139 if isTipcAvailable():
2140 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002141 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002142
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002143 thread_info = support.threading_setup()
2144 support.run_unittest(*tests)
2145 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002146
2147if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002148 test_main()