blob: d77b7dc9ed648f8fd0134b520458c1a8745d0c13 [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 Pitroue43f9d02010-08-08 23:24:50 +0000954 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
955 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000956 # ...but we can create another socket using the (still open)
957 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000958 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000959 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000960 msg = sock.recv(1024)
961 self.assertEqual(msg, MSG)
962
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000963 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000964 self.serv_conn.send(MSG)
965
Victor Stinner45df8202010-04-28 22:31:17 +0000966@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000967class BasicUDPTest(ThreadedUDPSocketTest):
968
969 def __init__(self, methodName='runTest'):
970 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
971
972 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000973 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000974 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000975 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000976
977 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000978 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979
Guido van Rossum1c938012002-06-12 21:17:20 +0000980 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000981 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000982 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000983 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000984
Guido van Rossum1c938012002-06-12 21:17:20 +0000985 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000986 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000987
Guido van Rossumd8faa362007-04-27 19:54:29 +0000988 def testRecvFromNegative(self):
989 # Negative lengths passed to recvfrom should give ValueError.
990 self.assertRaises(ValueError, self.serv.recvfrom, -1)
991
992 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000993 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000994
Victor Stinner45df8202010-04-28 22:31:17 +0000995@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000996class TCPCloserTest(ThreadedTCPSocketTest):
997
998 def testClose(self):
999 conn, addr = self.serv.accept()
1000 conn.close()
1001
1002 sd = self.cli
1003 read, write, err = select.select([sd], [], [], 1.0)
1004 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001005 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001006
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001007 # Calling close() many times should be safe.
1008 conn.close()
1009 conn.close()
1010
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001011 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001012 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001013 time.sleep(1.0)
1014
Victor Stinner45df8202010-04-28 22:31:17 +00001015@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00001016class BasicSocketPairTest(SocketPairTest):
1017
1018 def __init__(self, methodName='runTest'):
1019 SocketPairTest.__init__(self, methodName=methodName)
1020
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001021 def _check_defaults(self, sock):
1022 self.assertIsInstance(sock, socket.socket)
1023 if hasattr(socket, 'AF_UNIX'):
1024 self.assertEqual(sock.family, socket.AF_UNIX)
1025 else:
1026 self.assertEqual(sock.family, socket.AF_INET)
1027 self.assertEqual(sock.type, socket.SOCK_STREAM)
1028 self.assertEqual(sock.proto, 0)
1029
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001030 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001031 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001032
1033 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001034 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001035
Dave Cole331708b2004-08-09 04:51:41 +00001036 def testRecv(self):
1037 msg = self.serv.recv(1024)
1038 self.assertEqual(msg, MSG)
1039
1040 def _testRecv(self):
1041 self.cli.send(MSG)
1042
1043 def testSend(self):
1044 self.serv.send(MSG)
1045
1046 def _testSend(self):
1047 msg = self.cli.recv(1024)
1048 self.assertEqual(msg, MSG)
1049
Victor Stinner45df8202010-04-28 22:31:17 +00001050@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001051class NonBlockingTCPTests(ThreadedTCPSocketTest):
1052
1053 def __init__(self, methodName='runTest'):
1054 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1055
1056 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001057 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058 self.serv.setblocking(0)
1059 start = time.time()
1060 try:
1061 self.serv.accept()
1062 except socket.error:
1063 pass
1064 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001065 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066
1067 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001068 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001069
Antoine Pitroub1c54962010-10-14 15:05:38 +00001070 if hasattr(socket, "SOCK_NONBLOCK"):
1071 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001072 v = linux_version()
1073 if v < (2, 6, 28):
1074 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1075 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001076 # reinit server socket
1077 self.serv.close()
1078 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001079 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001080 self.port = support.bind_port(self.serv)
1081 self.serv.listen(1)
1082 # actual testing
1083 start = time.time()
1084 try:
1085 self.serv.accept()
1086 except socket.error:
1087 pass
1088 end = time.time()
1089 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1090
1091 def _testInitNonBlocking(self):
1092 pass
1093
Antoine Pitrou600232b2011-01-05 21:03:42 +00001094 def testInheritFlags(self):
1095 # Issue #7995: when calling accept() on a listening socket with a
1096 # timeout, the resulting socket should not be non-blocking.
1097 self.serv.settimeout(10)
1098 try:
1099 conn, addr = self.serv.accept()
1100 message = conn.recv(len(MSG))
1101 finally:
1102 conn.close()
1103 self.serv.settimeout(None)
1104
1105 def _testInheritFlags(self):
1106 time.sleep(0.1)
1107 self.cli.connect((HOST, self.port))
1108 time.sleep(0.5)
1109 self.cli.send(MSG)
1110
Guido van Rossum24e4af82002-06-12 19:18:08 +00001111 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001112 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001113 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001114 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001115 conn, addr = self.serv.accept()
1116 except socket.error:
1117 pass
1118 else:
1119 self.fail("Error trying to do non-blocking accept.")
1120 read, write, err = select.select([self.serv], [], [])
1121 if self.serv in read:
1122 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001123 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001124 else:
1125 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001126
Guido van Rossum24e4af82002-06-12 19:18:08 +00001127 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001128 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001129 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001130
1131 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001132 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001133 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001134 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001135
1136 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001137 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001138 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001139
1140 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001141 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001142 conn, addr = self.serv.accept()
1143 conn.setblocking(0)
1144 try:
1145 msg = conn.recv(len(MSG))
1146 except socket.error:
1147 pass
1148 else:
1149 self.fail("Error trying to do non-blocking recv.")
1150 read, write, err = select.select([conn], [], [])
1151 if conn in read:
1152 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001153 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001154 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155 else:
1156 self.fail("Error during select call to non-blocking socket.")
1157
1158 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001159 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001160 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001161 self.cli.send(MSG)
1162
Victor Stinner45df8202010-04-28 22:31:17 +00001163@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001164class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001165 """Unit tests for the object returned by socket.makefile()
1166
Antoine Pitrou834bd812010-10-13 16:17:14 +00001167 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001168 the client connection. You can read from this file to
1169 get output from the server.
1170
Antoine Pitrou834bd812010-10-13 16:17:14 +00001171 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001172 server connection. You can write to this file to send output
1173 to the client.
1174 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001175
Guido van Rossume9f66142002-08-07 15:46:19 +00001176 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001177 encoding = 'utf8'
1178 errors = 'strict'
1179 newline = None
1180
1181 read_mode = 'rb'
1182 read_msg = MSG
1183 write_mode = 'wb'
1184 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001185
Guido van Rossum24e4af82002-06-12 19:18:08 +00001186 def __init__(self, methodName='runTest'):
1187 SocketConnectedTest.__init__(self, methodName=methodName)
1188
1189 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001190 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1191 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001192 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001193 self.read_file = self.cli_conn.makefile(
1194 self.read_mode, self.bufsize,
1195 encoding = self.encoding,
1196 errors = self.errors,
1197 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001198
1199 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001200 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001201 self.read_file.close()
1202 self.assertTrue(self.read_file.closed)
1203 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001204 SocketConnectedTest.tearDown(self)
1205
1206 def clientSetUp(self):
1207 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001208 self.write_file = self.serv_conn.makefile(
1209 self.write_mode, self.bufsize,
1210 encoding = self.encoding,
1211 errors = self.errors,
1212 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001213
1214 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001215 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001216 self.write_file.close()
1217 self.assertTrue(self.write_file.closed)
1218 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001219 SocketConnectedTest.clientTearDown(self)
1220
Antoine Pitrou5d5381e2011-02-25 23:14:08 +00001221 def testReadAfterTimeout(self):
1222 # Issue #7322: A file object must disallow further reads
1223 # after a timeout has occurred.
1224 self.cli_conn.settimeout(1)
1225 self.read_file.read(3)
1226 # First read raises a timeout
1227 self.assertRaises(socket.timeout, self.read_file.read, 1)
1228 # Second read is disallowed
1229 with self.assertRaises(IOError) as ctx:
1230 self.read_file.read(1)
1231 self.assertIn("cannot read from timed out object", str(ctx.exception))
1232
1233 def _testReadAfterTimeout(self):
1234 self.write_file.write(self.write_msg[0:3])
1235 self.write_file.flush()
1236 self.serv_finished.wait()
1237
Guido van Rossum24e4af82002-06-12 19:18:08 +00001238 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001239 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001240 first_seg = self.read_file.read(len(self.read_msg)-3)
1241 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001242 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001243 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001244
1245 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001246 self.write_file.write(self.write_msg)
1247 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001248
Guido van Rossum8c943832002-08-08 01:00:28 +00001249 def testFullRead(self):
1250 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001251 msg = self.read_file.read()
1252 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001253
1254 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001255 self.write_file.write(self.write_msg)
1256 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001257
Guido van Rossum24e4af82002-06-12 19:18:08 +00001258 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001259 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001260 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001261 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001262 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001263 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001264 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001265 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001266 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001267
1268 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001269 self.write_file.write(self.write_msg)
1270 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001271
1272 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001273 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001274 line = self.read_file.readline()
1275 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001276
1277 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001278 self.write_file.write(self.write_msg)
1279 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001280
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001281 def testCloseAfterMakefile(self):
1282 # The file returned by makefile should keep the socket open.
1283 self.cli_conn.close()
1284 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001285 msg = self.read_file.read()
1286 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001287
1288 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001289 self.write_file.write(self.write_msg)
1290 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001291
1292 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001293 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001294 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001295 if isinstance(self.read_msg, str):
1296 msg = msg.decode()
1297 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001298
1299 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001300 self.write_file.write(self.write_msg)
1301 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001302
Tim Peters116d83c2004-03-28 02:20:45 +00001303 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001304 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001305
1306 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001307 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001308
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001309 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001310 self.assertEqual(self.read_file.mode, self.read_mode)
1311 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001312
1313 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001314 self.assertEqual(self.write_file.mode, self.write_mode)
1315 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001316
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001317 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001318 self.read_file.close()
1319 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001320 self.cli_conn.close()
1321 self.assertRaises(socket.error, self.cli_conn.getsockname)
1322
1323 def _testRealClose(self):
1324 pass
1325
1326
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001327class FileObjectInterruptedTestCase(unittest.TestCase):
1328 """Test that the file object correctly handles EINTR internally."""
1329
1330 class MockSocket(object):
1331 def __init__(self, recv_funcs=()):
1332 # A generator that returns callables that we'll call for each
1333 # call to recv().
1334 self._recv_step = iter(recv_funcs)
1335
1336 def recv_into(self, buffer):
1337 data = next(self._recv_step)()
1338 assert len(buffer) >= len(data)
1339 buffer[:len(data)] = data
1340 return len(data)
1341
1342 def _decref_socketios(self):
1343 pass
1344
1345 def _textiowrap_for_test(self, buffering=-1):
1346 raw = socket.SocketIO(self, "r")
1347 if buffering < 0:
1348 buffering = io.DEFAULT_BUFFER_SIZE
1349 if buffering == 0:
1350 return raw
1351 buffer = io.BufferedReader(raw, buffering)
1352 text = io.TextIOWrapper(buffer, None, None)
1353 text.mode = "rb"
1354 return text
1355
1356 @staticmethod
1357 def _raise_eintr():
1358 raise socket.error(errno.EINTR)
1359
1360 def _textiowrap_mock_socket(self, mock, buffering=-1):
1361 raw = socket.SocketIO(mock, "r")
1362 if buffering < 0:
1363 buffering = io.DEFAULT_BUFFER_SIZE
1364 if buffering == 0:
1365 return raw
1366 buffer = io.BufferedReader(raw, buffering)
1367 text = io.TextIOWrapper(buffer, None, None)
1368 text.mode = "rb"
1369 return text
1370
1371 def _test_readline(self, size=-1, buffering=-1):
1372 mock_sock = self.MockSocket(recv_funcs=[
1373 lambda : b"This is the first line\nAnd the sec",
1374 self._raise_eintr,
1375 lambda : b"ond line is here\n",
1376 lambda : b"",
1377 lambda : b"", # XXX(gps): io library does an extra EOF read
1378 ])
1379 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001380 self.assertEqual(fo.readline(size), "This is the first line\n")
1381 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001382
1383 def _test_read(self, size=-1, buffering=-1):
1384 mock_sock = self.MockSocket(recv_funcs=[
1385 lambda : b"This is the first line\nAnd the sec",
1386 self._raise_eintr,
1387 lambda : b"ond line is here\n",
1388 lambda : b"",
1389 lambda : b"", # XXX(gps): io library does an extra EOF read
1390 ])
1391 expecting = (b"This is the first line\n"
1392 b"And the second line is here\n")
1393 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1394 if buffering == 0:
1395 data = b''
1396 else:
1397 data = ''
1398 expecting = expecting.decode('utf8')
1399 while len(data) != len(expecting):
1400 part = fo.read(size)
1401 if not part:
1402 break
1403 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001404 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001405
1406 def test_default(self):
1407 self._test_readline()
1408 self._test_readline(size=100)
1409 self._test_read()
1410 self._test_read(size=100)
1411
1412 def test_with_1k_buffer(self):
1413 self._test_readline(buffering=1024)
1414 self._test_readline(size=100, buffering=1024)
1415 self._test_read(buffering=1024)
1416 self._test_read(size=100, buffering=1024)
1417
1418 def _test_readline_no_buffer(self, size=-1):
1419 mock_sock = self.MockSocket(recv_funcs=[
1420 lambda : b"a",
1421 lambda : b"\n",
1422 lambda : b"B",
1423 self._raise_eintr,
1424 lambda : b"b",
1425 lambda : b"",
1426 ])
1427 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001428 self.assertEqual(fo.readline(size), b"a\n")
1429 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001430
1431 def test_no_buffer(self):
1432 self._test_readline_no_buffer()
1433 self._test_readline_no_buffer(size=4)
1434 self._test_read(buffering=0)
1435 self._test_read(size=100, buffering=0)
1436
1437
Guido van Rossume9f66142002-08-07 15:46:19 +00001438class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1439
1440 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001441
Guido van Rossume9f66142002-08-07 15:46:19 +00001442 In this case (and in this case only), it should be possible to
1443 create a file object, read a line from it, create another file
1444 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001445 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001446 when reading multiple requests from the same socket."""
1447
1448 bufsize = 0 # Use unbuffered mode
1449
1450 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001451 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001452 line = self.read_file.readline() # first line
1453 self.assertEqual(line, b"A. " + self.write_msg) # first line
1454 self.read_file = self.cli_conn.makefile('rb', 0)
1455 line = self.read_file.readline() # second line
1456 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001457
1458 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001459 self.write_file.write(b"A. " + self.write_msg)
1460 self.write_file.write(b"B. " + self.write_msg)
1461 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001462
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001463 def testMakefileClose(self):
1464 # The file returned by makefile should keep the socket open...
1465 self.cli_conn.close()
1466 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001467 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001468 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001469 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001470 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1471
1472 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001473 self.write_file.write(self.write_msg)
1474 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001475
1476 def testMakefileCloseSocketDestroy(self):
1477 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001478 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001479 refcount_after = sys.getrefcount(self.cli_conn)
1480 self.assertEqual(refcount_before - 1, refcount_after)
1481
1482 def _testMakefileCloseSocketDestroy(self):
1483 pass
1484
Antoine Pitrou98b46702010-09-18 22:59:00 +00001485 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001486 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001487 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1488
1489 def testSmallReadNonBlocking(self):
1490 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001491 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1492 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001493 self.evt1.set()
1494 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001495 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001496 if first_seg is None:
1497 # Data not arrived (can happen under Windows), wait a bit
1498 time.sleep(0.5)
1499 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001500 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001501 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001502 self.assertEqual(n, 3)
1503 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001504 self.assertEqual(msg, self.read_msg)
1505 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1506 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001507
1508 def _testSmallReadNonBlocking(self):
1509 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001510 self.write_file.write(self.write_msg)
1511 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001512 self.evt2.set()
1513 # Avoid cloding the socket before the server test has finished,
1514 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1515 self.serv_finished.wait(5.0)
1516
1517 def testWriteNonBlocking(self):
1518 self.cli_finished.wait(5.0)
1519 # The client thread can't skip directly - the SkipTest exception
1520 # would appear as a failure.
1521 if self.serv_skipped:
1522 self.skipTest(self.serv_skipped)
1523
1524 def _testWriteNonBlocking(self):
1525 self.serv_skipped = None
1526 self.serv_conn.setblocking(False)
1527 # Try to saturate the socket buffer pipe with repeated large writes.
1528 BIG = b"x" * (1024 ** 2)
1529 LIMIT = 10
1530 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001531 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001532 self.assertGreater(n, 0)
1533 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001534 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001535 if n is None:
1536 # Succeeded
1537 break
1538 self.assertGreater(n, 0)
1539 else:
1540 # Let us know that this test didn't manage to establish
1541 # the expected conditions. This is not a failure in itself but,
1542 # if it happens repeatedly, the test should be fixed.
1543 self.serv_skipped = "failed to saturate the socket buffer"
1544
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001545
Guido van Rossum8c943832002-08-08 01:00:28 +00001546class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1547
1548 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1549
1550
1551class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1552
1553 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001554
Thomas Woutersb2137042007-02-01 18:02:27 +00001555
Antoine Pitrou834bd812010-10-13 16:17:14 +00001556class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1557 """Tests for socket.makefile() in text mode (rather than binary)"""
1558
1559 read_mode = 'r'
1560 read_msg = MSG.decode('utf8')
1561 write_mode = 'wb'
1562 write_msg = MSG
1563 newline = ''
1564
1565
1566class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1567 """Tests for socket.makefile() in text mode (rather than binary)"""
1568
1569 read_mode = 'rb'
1570 read_msg = MSG
1571 write_mode = 'w'
1572 write_msg = MSG.decode('utf8')
1573 newline = ''
1574
1575
1576class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1577 """Tests for socket.makefile() in text mode (rather than binary)"""
1578
1579 read_mode = 'r'
1580 read_msg = MSG.decode('utf8')
1581 write_mode = 'w'
1582 write_msg = MSG.decode('utf8')
1583 newline = ''
1584
1585
Guido van Rossumd8faa362007-04-27 19:54:29 +00001586class NetworkConnectionTest(object):
1587 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001588
Guido van Rossumd8faa362007-04-27 19:54:29 +00001589 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001590 # We're inherited below by BasicTCPTest2, which also inherits
1591 # BasicTCPTest, which defines self.port referenced below.
1592 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001593 self.serv_conn = self.cli
1594
1595class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1596 """Tests that NetworkConnection does not break existing TCP functionality.
1597 """
1598
1599class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001600
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001601 class MockSocket(socket.socket):
1602 def connect(self, *args):
1603 raise socket.timeout('timed out')
1604
1605 @contextlib.contextmanager
1606 def mocked_socket_module(self):
1607 """Return a socket which times out on connect"""
1608 old_socket = socket.socket
1609 socket.socket = self.MockSocket
1610 try:
1611 yield
1612 finally:
1613 socket.socket = old_socket
1614
1615 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001616 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001617 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001618 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001619 with self.assertRaises(socket.error) as cm:
1620 cli.connect((HOST, port))
1621 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1622
1623 def test_create_connection(self):
1624 # Issue #9792: errors raised by create_connection() should have
1625 # a proper errno attribute.
1626 port = support.find_unused_port()
1627 with self.assertRaises(socket.error) as cm:
1628 socket.create_connection((HOST, port))
1629 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1630
1631 def test_create_connection_timeout(self):
1632 # Issue #9792: create_connection() should not recast timeout errors
1633 # as generic socket errors.
1634 with self.mocked_socket_module():
1635 with self.assertRaises(socket.timeout):
1636 socket.create_connection((HOST, 1234))
1637
Guido van Rossumd8faa362007-04-27 19:54:29 +00001638
Victor Stinner45df8202010-04-28 22:31:17 +00001639@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001640class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1641
1642 def __init__(self, methodName='runTest'):
1643 SocketTCPTest.__init__(self, methodName=methodName)
1644 ThreadableTest.__init__(self)
1645
1646 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001647 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001648
1649 def clientTearDown(self):
1650 self.cli.close()
1651 self.cli = None
1652 ThreadableTest.clientTearDown(self)
1653
1654 def _justAccept(self):
1655 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001656 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001657
1658 testFamily = _justAccept
1659 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001660 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001661 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001662 self.assertEqual(self.cli.family, 2)
1663
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001664 testSourceAddress = _justAccept
1665 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001666 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1667 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001668 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001669 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001670 # The port number being used is sufficient to show that the bind()
1671 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001672
Guido van Rossumd8faa362007-04-27 19:54:29 +00001673 testTimeoutDefault = _justAccept
1674 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001675 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001676 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001677 socket.setdefaulttimeout(42)
1678 try:
1679 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001680 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001681 finally:
1682 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001683 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001684
1685 testTimeoutNone = _justAccept
1686 def _testTimeoutNone(self):
1687 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001688 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001689 socket.setdefaulttimeout(30)
1690 try:
1691 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001692 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001693 finally:
1694 socket.setdefaulttimeout(None)
1695 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001696
1697 testTimeoutValueNamed = _justAccept
1698 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001699 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001700 self.assertEqual(self.cli.gettimeout(), 30)
1701
1702 testTimeoutValueNonamed = _justAccept
1703 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001704 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001705 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001706 self.assertEqual(self.cli.gettimeout(), 30)
1707
Victor Stinner45df8202010-04-28 22:31:17 +00001708@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001709class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1710
1711 def __init__(self, methodName='runTest'):
1712 SocketTCPTest.__init__(self, methodName=methodName)
1713 ThreadableTest.__init__(self)
1714
1715 def clientSetUp(self):
1716 pass
1717
1718 def clientTearDown(self):
1719 self.cli.close()
1720 self.cli = None
1721 ThreadableTest.clientTearDown(self)
1722
1723 def testInsideTimeout(self):
1724 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001725 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001726 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001727 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001728 testOutsideTimeout = testInsideTimeout
1729
1730 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001731 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001732 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001733 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001734
1735 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001736 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001737 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001738
1739
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001740class TCPTimeoutTest(SocketTCPTest):
1741
1742 def testTCPTimeout(self):
1743 def raise_timeout(*args, **kwargs):
1744 self.serv.settimeout(1.0)
1745 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001746 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001747 "Error generating a timeout exception (TCP)")
1748
1749 def testTimeoutZero(self):
1750 ok = False
1751 try:
1752 self.serv.settimeout(0.0)
1753 foo = self.serv.accept()
1754 except socket.timeout:
1755 self.fail("caught timeout instead of error (TCP)")
1756 except socket.error:
1757 ok = True
1758 except:
1759 self.fail("caught unexpected exception (TCP)")
1760 if not ok:
1761 self.fail("accept() returned success when we did not expect it")
1762
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001763 def testInterruptedTimeout(self):
1764 # XXX I don't know how to do this test on MSWindows or any other
1765 # plaform that doesn't support signal.alarm() or os.kill(), though
1766 # the bug should have existed on all platforms.
1767 if not hasattr(signal, "alarm"):
1768 return # can only test on *nix
1769 self.serv.settimeout(5.0) # must be longer than alarm
1770 class Alarm(Exception):
1771 pass
1772 def alarm_handler(signal, frame):
1773 raise Alarm
1774 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1775 try:
1776 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1777 try:
1778 foo = self.serv.accept()
1779 except socket.timeout:
1780 self.fail("caught timeout instead of Alarm")
1781 except Alarm:
1782 pass
1783 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001784 self.fail("caught other exception instead of Alarm:"
1785 " %s(%s):\n%s" %
1786 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001787 else:
1788 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001789 finally:
1790 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001791 except Alarm:
1792 self.fail("got Alarm in wrong place")
1793 finally:
1794 # no alarm can be pending. Safe to restore old handler.
1795 signal.signal(signal.SIGALRM, old_alarm)
1796
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02001797class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001798
1799 def testUDPTimeout(self):
1800 def raise_timeout(*args, **kwargs):
1801 self.serv.settimeout(1.0)
1802 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001803 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001804 "Error generating a timeout exception (UDP)")
1805
1806 def testTimeoutZero(self):
1807 ok = False
1808 try:
1809 self.serv.settimeout(0.0)
1810 foo = self.serv.recv(1024)
1811 except socket.timeout:
1812 self.fail("caught timeout instead of error (UDP)")
1813 except socket.error:
1814 ok = True
1815 except:
1816 self.fail("caught unexpected exception (UDP)")
1817 if not ok:
1818 self.fail("recv() returned success when we did not expect it")
1819
1820class TestExceptions(unittest.TestCase):
1821
1822 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001823 self.assertTrue(issubclass(socket.error, Exception))
1824 self.assertTrue(issubclass(socket.herror, socket.error))
1825 self.assertTrue(issubclass(socket.gaierror, socket.error))
1826 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001827
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001828class TestLinuxAbstractNamespace(unittest.TestCase):
1829
1830 UNIX_PATH_MAX = 108
1831
1832 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001833 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001834 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1835 s1.bind(address)
1836 s1.listen(1)
1837 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1838 s2.connect(s1.getsockname())
1839 with s1.accept()[0] as s3:
1840 self.assertEqual(s1.getsockname(), address)
1841 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001842
1843 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001844 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001845 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1846 s.bind(address)
1847 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001848
1849 def testNameOverflow(self):
1850 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001851 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1852 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001853
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001854
Victor Stinner45df8202010-04-28 22:31:17 +00001855@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001856class BufferIOTest(SocketConnectedTest):
1857 """
1858 Test the buffer versions of socket.recv() and socket.send().
1859 """
1860 def __init__(self, methodName='runTest'):
1861 SocketConnectedTest.__init__(self, methodName=methodName)
1862
Antoine Pitrou25480782010-03-17 22:50:28 +00001863 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001864 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001865 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001866 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001867 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001868 self.assertEqual(msg, MSG)
1869
Antoine Pitrou25480782010-03-17 22:50:28 +00001870 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001871 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001872 self.serv_conn.send(buf)
1873
Antoine Pitrou25480782010-03-17 22:50:28 +00001874 def testRecvIntoBytearray(self):
1875 buf = bytearray(1024)
1876 nbytes = self.cli_conn.recv_into(buf)
1877 self.assertEqual(nbytes, len(MSG))
1878 msg = buf[:len(MSG)]
1879 self.assertEqual(msg, MSG)
1880
1881 _testRecvIntoBytearray = _testRecvIntoArray
1882
1883 def testRecvIntoMemoryview(self):
1884 buf = bytearray(1024)
1885 nbytes = self.cli_conn.recv_into(memoryview(buf))
1886 self.assertEqual(nbytes, len(MSG))
1887 msg = buf[:len(MSG)]
1888 self.assertEqual(msg, MSG)
1889
1890 _testRecvIntoMemoryview = _testRecvIntoArray
1891
1892 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001893 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001894 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001895 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001896 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001897 self.assertEqual(msg, MSG)
1898
Antoine Pitrou25480782010-03-17 22:50:28 +00001899 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001900 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001901 self.serv_conn.send(buf)
1902
Antoine Pitrou25480782010-03-17 22:50:28 +00001903 def testRecvFromIntoBytearray(self):
1904 buf = bytearray(1024)
1905 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1906 self.assertEqual(nbytes, len(MSG))
1907 msg = buf[:len(MSG)]
1908 self.assertEqual(msg, MSG)
1909
1910 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1911
1912 def testRecvFromIntoMemoryview(self):
1913 buf = bytearray(1024)
1914 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1915 self.assertEqual(nbytes, len(MSG))
1916 msg = buf[:len(MSG)]
1917 self.assertEqual(msg, MSG)
1918
1919 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1920
Christian Heimes043d6f62008-01-07 17:19:16 +00001921
1922TIPC_STYPE = 2000
1923TIPC_LOWER = 200
1924TIPC_UPPER = 210
1925
1926def isTipcAvailable():
1927 """Check if the TIPC module is loaded
1928
1929 The TIPC module is not loaded automatically on Ubuntu and probably
1930 other Linux distros.
1931 """
1932 if not hasattr(socket, "AF_TIPC"):
1933 return False
1934 if not os.path.isfile("/proc/modules"):
1935 return False
1936 with open("/proc/modules") as f:
1937 for line in f:
1938 if line.startswith("tipc "):
1939 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001940 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001941 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1942 return False
1943
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001944class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00001945 def testRDM(self):
1946 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1947 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001948 self.addCleanup(srv.close)
1949 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001950
1951 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1952 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1953 TIPC_LOWER, TIPC_UPPER)
1954 srv.bind(srvaddr)
1955
1956 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1957 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1958 cli.sendto(MSG, sendaddr)
1959
1960 msg, recvaddr = srv.recvfrom(1024)
1961
1962 self.assertEqual(cli.getsockname(), recvaddr)
1963 self.assertEqual(msg, MSG)
1964
1965
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001966class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00001967 def __init__(self, methodName = 'runTest'):
1968 unittest.TestCase.__init__(self, methodName = methodName)
1969 ThreadableTest.__init__(self)
1970
1971 def setUp(self):
1972 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001973 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001974 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1975 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1976 TIPC_LOWER, TIPC_UPPER)
1977 self.srv.bind(srvaddr)
1978 self.srv.listen(5)
1979 self.serverExplicitReady()
1980 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001981 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001982
1983 def clientSetUp(self):
1984 # The is a hittable race between serverExplicitReady() and the
1985 # accept() call; sleep a little while to avoid it, otherwise
1986 # we could get an exception
1987 time.sleep(0.1)
1988 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001989 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001990 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1991 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1992 self.cli.connect(addr)
1993 self.cliaddr = self.cli.getsockname()
1994
1995 def testStream(self):
1996 msg = self.conn.recv(1024)
1997 self.assertEqual(msg, MSG)
1998 self.assertEqual(self.cliaddr, self.connaddr)
1999
2000 def _testStream(self):
2001 self.cli.send(MSG)
2002 self.cli.close()
2003
2004
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002005@unittest.skipUnless(thread, 'Threading required for this test.')
2006class ContextManagersTest(ThreadedTCPSocketTest):
2007
2008 def _testSocketClass(self):
2009 # base test
2010 with socket.socket() as sock:
2011 self.assertFalse(sock._closed)
2012 self.assertTrue(sock._closed)
2013 # close inside with block
2014 with socket.socket() as sock:
2015 sock.close()
2016 self.assertTrue(sock._closed)
2017 # exception inside with block
2018 with socket.socket() as sock:
2019 self.assertRaises(socket.error, sock.sendall, b'foo')
2020 self.assertTrue(sock._closed)
2021
2022 def testCreateConnectionBase(self):
2023 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002024 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002025 data = conn.recv(1024)
2026 conn.sendall(data)
2027
2028 def _testCreateConnectionBase(self):
2029 address = self.serv.getsockname()
2030 with socket.create_connection(address) as sock:
2031 self.assertFalse(sock._closed)
2032 sock.sendall(b'foo')
2033 self.assertEqual(sock.recv(1024), b'foo')
2034 self.assertTrue(sock._closed)
2035
2036 def testCreateConnectionClose(self):
2037 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002038 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002039 data = conn.recv(1024)
2040 conn.sendall(data)
2041
2042 def _testCreateConnectionClose(self):
2043 address = self.serv.getsockname()
2044 with socket.create_connection(address) as sock:
2045 sock.close()
2046 self.assertTrue(sock._closed)
2047 self.assertRaises(socket.error, sock.sendall, b'foo')
2048
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002049
Antoine Pitroub1c54962010-10-14 15:05:38 +00002050@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
2051 "SOCK_CLOEXEC not defined")
2052@unittest.skipUnless(fcntl, "module fcntl not available")
2053class CloexecConstantTest(unittest.TestCase):
2054 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002055 v = linux_version()
2056 if v < (2, 6, 28):
2057 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2058 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002059 with socket.socket(socket.AF_INET,
2060 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2061 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2062 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002063
2064
2065@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2066 "SOCK_NONBLOCK not defined")
2067class NonblockConstantTest(unittest.TestCase):
2068 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2069 if nonblock:
2070 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2071 self.assertEqual(s.gettimeout(), timeout)
2072 else:
2073 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2074 self.assertEqual(s.gettimeout(), None)
2075
2076 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002077 v = linux_version()
2078 if v < (2, 6, 28):
2079 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2080 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002081 # a lot of it seems silly and redundant, but I wanted to test that
2082 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002083 with socket.socket(socket.AF_INET,
2084 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2085 self.checkNonblock(s)
2086 s.setblocking(1)
2087 self.checkNonblock(s, False)
2088 s.setblocking(0)
2089 self.checkNonblock(s)
2090 s.settimeout(None)
2091 self.checkNonblock(s, False)
2092 s.settimeout(2.0)
2093 self.checkNonblock(s, timeout=2.0)
2094 s.setblocking(1)
2095 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002096 # defaulttimeout
2097 t = socket.getdefaulttimeout()
2098 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002099 with socket.socket() as s:
2100 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002101 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002102 with socket.socket() as s:
2103 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002104 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002105 with socket.socket() as s:
2106 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002107 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002108 with socket.socket() as s:
2109 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002110 socket.setdefaulttimeout(t)
2111
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002112
Guido van Rossumb995eb72002-07-31 16:08:40 +00002113def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002114 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002115 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002116
2117 tests.extend([
2118 NonBlockingTCPTests,
2119 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002120 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002121 UnbufferedFileObjectClassTestCase,
2122 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002123 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002124 UnicodeReadFileObjectClassTestCase,
2125 UnicodeWriteFileObjectClassTestCase,
2126 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002127 NetworkConnectionNoServer,
2128 NetworkConnectionAttributesTest,
2129 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002130 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002131 CloexecConstantTest,
2132 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002133 ])
Dave Cole331708b2004-08-09 04:51:41 +00002134 if hasattr(socket, "socketpair"):
2135 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002136 if sys.platform == 'linux2':
2137 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002138 if isTipcAvailable():
2139 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002140 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002141
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002142 thread_info = support.threading_setup()
2143 support.run_unittest(*tests)
2144 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002145
2146if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002147 test_main()