blob: d41930163a36eb407defd123b27f4d659f0318c8 [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
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000849
Victor Stinner45df8202010-04-28 22:31:17 +0000850@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000851class BasicTCPTest(SocketConnectedTest):
852
853 def __init__(self, methodName='runTest'):
854 SocketConnectedTest.__init__(self, methodName=methodName)
855
856 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000857 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000859 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860
861 def _testRecv(self):
862 self.serv_conn.send(MSG)
863
864 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000865 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 seg1 = self.cli_conn.recv(len(MSG) - 3)
867 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000868 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000869 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870
871 def _testOverFlowRecv(self):
872 self.serv_conn.send(MSG)
873
874 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000875 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000877 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878
879 def _testRecvFrom(self):
880 self.serv_conn.send(MSG)
881
882 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000883 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
885 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000886 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000887 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888
889 def _testOverFlowRecvFrom(self):
890 self.serv_conn.send(MSG)
891
892 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000893 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000894 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895 while 1:
896 read = self.cli_conn.recv(1024)
897 if not read:
898 break
Guido van Rossume531e292002-08-08 20:28:34 +0000899 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000900 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901
902 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000903 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000904 self.serv_conn.sendall(big_chunk)
905
906 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000907 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000908 fd = self.cli_conn.fileno()
909 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000910 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000911 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000912 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000913 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000914
915 def _testFromFd(self):
916 self.serv_conn.send(MSG)
917
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000918 def testDup(self):
919 # Testing dup()
920 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000921 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000922 msg = sock.recv(1024)
923 self.assertEqual(msg, MSG)
924
925 def _testDup(self):
926 self.serv_conn.send(MSG)
927
Guido van Rossum24e4af82002-06-12 19:18:08 +0000928 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000929 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000931 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000932 # wait for _testShutdown to finish: on OS X, when the server
933 # closes the connection the client also becomes disconnected,
934 # and the client's shutdown call will fail. (Issue #4397.)
935 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000936
937 def _testShutdown(self):
938 self.serv_conn.send(MSG)
939 self.serv_conn.shutdown(2)
940
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000941 def testDetach(self):
942 # Testing detach()
943 fileno = self.cli_conn.fileno()
944 f = self.cli_conn.detach()
945 self.assertEqual(f, fileno)
946 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000947 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
948 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000949 # ...but we can create another socket using the (still open)
950 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000951 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000952 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000953 msg = sock.recv(1024)
954 self.assertEqual(msg, MSG)
955
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000956 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000957 self.serv_conn.send(MSG)
958
Victor Stinner45df8202010-04-28 22:31:17 +0000959@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000960class BasicUDPTest(ThreadedUDPSocketTest):
961
962 def __init__(self, methodName='runTest'):
963 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
964
965 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000966 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000967 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000968 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000969
970 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000971 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000972
Guido van Rossum1c938012002-06-12 21:17:20 +0000973 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000974 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000975 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000976 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977
Guido van Rossum1c938012002-06-12 21:17:20 +0000978 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000979 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000980
Guido van Rossumd8faa362007-04-27 19:54:29 +0000981 def testRecvFromNegative(self):
982 # Negative lengths passed to recvfrom should give ValueError.
983 self.assertRaises(ValueError, self.serv.recvfrom, -1)
984
985 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000986 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000987
Victor Stinner45df8202010-04-28 22:31:17 +0000988@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000989class TCPCloserTest(ThreadedTCPSocketTest):
990
991 def testClose(self):
992 conn, addr = self.serv.accept()
993 conn.close()
994
995 sd = self.cli
996 read, write, err = select.select([sd], [], [], 1.0)
997 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000998 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000999
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001000 # Calling close() many times should be safe.
1001 conn.close()
1002 conn.close()
1003
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001004 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001005 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001006 time.sleep(1.0)
1007
Victor Stinner45df8202010-04-28 22:31:17 +00001008@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00001009class BasicSocketPairTest(SocketPairTest):
1010
1011 def __init__(self, methodName='runTest'):
1012 SocketPairTest.__init__(self, methodName=methodName)
1013
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001014 def _check_defaults(self, sock):
1015 self.assertIsInstance(sock, socket.socket)
1016 if hasattr(socket, 'AF_UNIX'):
1017 self.assertEqual(sock.family, socket.AF_UNIX)
1018 else:
1019 self.assertEqual(sock.family, socket.AF_INET)
1020 self.assertEqual(sock.type, socket.SOCK_STREAM)
1021 self.assertEqual(sock.proto, 0)
1022
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001023 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001024 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001025
1026 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001027 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001028
Dave Cole331708b2004-08-09 04:51:41 +00001029 def testRecv(self):
1030 msg = self.serv.recv(1024)
1031 self.assertEqual(msg, MSG)
1032
1033 def _testRecv(self):
1034 self.cli.send(MSG)
1035
1036 def testSend(self):
1037 self.serv.send(MSG)
1038
1039 def _testSend(self):
1040 msg = self.cli.recv(1024)
1041 self.assertEqual(msg, MSG)
1042
Victor Stinner45df8202010-04-28 22:31:17 +00001043@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001044class NonBlockingTCPTests(ThreadedTCPSocketTest):
1045
1046 def __init__(self, methodName='runTest'):
1047 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1048
1049 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001050 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001051 self.serv.setblocking(0)
1052 start = time.time()
1053 try:
1054 self.serv.accept()
1055 except socket.error:
1056 pass
1057 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001058 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059
1060 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001061 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001062
Antoine Pitroub1c54962010-10-14 15:05:38 +00001063 if hasattr(socket, "SOCK_NONBLOCK"):
1064 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001065 v = linux_version()
1066 if v < (2, 6, 28):
1067 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1068 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001069 # reinit server socket
1070 self.serv.close()
1071 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001072 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001073 self.port = support.bind_port(self.serv)
1074 self.serv.listen(1)
1075 # actual testing
1076 start = time.time()
1077 try:
1078 self.serv.accept()
1079 except socket.error:
1080 pass
1081 end = time.time()
1082 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1083
1084 def _testInitNonBlocking(self):
1085 pass
1086
Antoine Pitrou600232b2011-01-05 21:03:42 +00001087 def testInheritFlags(self):
1088 # Issue #7995: when calling accept() on a listening socket with a
1089 # timeout, the resulting socket should not be non-blocking.
1090 self.serv.settimeout(10)
1091 try:
1092 conn, addr = self.serv.accept()
1093 message = conn.recv(len(MSG))
1094 finally:
1095 conn.close()
1096 self.serv.settimeout(None)
1097
1098 def _testInheritFlags(self):
1099 time.sleep(0.1)
1100 self.cli.connect((HOST, self.port))
1101 time.sleep(0.5)
1102 self.cli.send(MSG)
1103
Guido van Rossum24e4af82002-06-12 19:18:08 +00001104 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001105 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001106 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001107 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001108 conn, addr = self.serv.accept()
1109 except socket.error:
1110 pass
1111 else:
1112 self.fail("Error trying to do non-blocking accept.")
1113 read, write, err = select.select([self.serv], [], [])
1114 if self.serv in read:
1115 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001116 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001117 else:
1118 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001119
Guido van Rossum24e4af82002-06-12 19:18:08 +00001120 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001121 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001122 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001123
1124 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001125 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001127 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001128
1129 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001130 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001131 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001132
1133 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001134 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001135 conn, addr = self.serv.accept()
1136 conn.setblocking(0)
1137 try:
1138 msg = conn.recv(len(MSG))
1139 except socket.error:
1140 pass
1141 else:
1142 self.fail("Error trying to do non-blocking recv.")
1143 read, write, err = select.select([conn], [], [])
1144 if conn in read:
1145 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001146 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001147 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001148 else:
1149 self.fail("Error during select call to non-blocking socket.")
1150
1151 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001152 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001153 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001154 self.cli.send(MSG)
1155
Victor Stinner45df8202010-04-28 22:31:17 +00001156@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001157class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001158 """Unit tests for the object returned by socket.makefile()
1159
Antoine Pitrou834bd812010-10-13 16:17:14 +00001160 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001161 the client connection. You can read from this file to
1162 get output from the server.
1163
Antoine Pitrou834bd812010-10-13 16:17:14 +00001164 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001165 server connection. You can write to this file to send output
1166 to the client.
1167 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001168
Guido van Rossume9f66142002-08-07 15:46:19 +00001169 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001170 encoding = 'utf8'
1171 errors = 'strict'
1172 newline = None
1173
1174 read_mode = 'rb'
1175 read_msg = MSG
1176 write_mode = 'wb'
1177 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001178
Guido van Rossum24e4af82002-06-12 19:18:08 +00001179 def __init__(self, methodName='runTest'):
1180 SocketConnectedTest.__init__(self, methodName=methodName)
1181
1182 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001183 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1184 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001185 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001186 self.read_file = self.cli_conn.makefile(
1187 self.read_mode, self.bufsize,
1188 encoding = self.encoding,
1189 errors = self.errors,
1190 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001191
1192 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001193 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001194 self.read_file.close()
1195 self.assertTrue(self.read_file.closed)
1196 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001197 SocketConnectedTest.tearDown(self)
1198
1199 def clientSetUp(self):
1200 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001201 self.write_file = self.serv_conn.makefile(
1202 self.write_mode, self.bufsize,
1203 encoding = self.encoding,
1204 errors = self.errors,
1205 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001206
1207 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001208 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001209 self.write_file.close()
1210 self.assertTrue(self.write_file.closed)
1211 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001212 SocketConnectedTest.clientTearDown(self)
1213
Antoine Pitrou5d5381e2011-02-25 23:14:08 +00001214 def testReadAfterTimeout(self):
1215 # Issue #7322: A file object must disallow further reads
1216 # after a timeout has occurred.
1217 self.cli_conn.settimeout(1)
1218 self.read_file.read(3)
1219 # First read raises a timeout
1220 self.assertRaises(socket.timeout, self.read_file.read, 1)
1221 # Second read is disallowed
1222 with self.assertRaises(IOError) as ctx:
1223 self.read_file.read(1)
1224 self.assertIn("cannot read from timed out object", str(ctx.exception))
1225
1226 def _testReadAfterTimeout(self):
1227 self.write_file.write(self.write_msg[0:3])
1228 self.write_file.flush()
1229 self.serv_finished.wait()
1230
Guido van Rossum24e4af82002-06-12 19:18:08 +00001231 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001232 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001233 first_seg = self.read_file.read(len(self.read_msg)-3)
1234 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001235 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001236 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001237
1238 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001239 self.write_file.write(self.write_msg)
1240 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001241
Guido van Rossum8c943832002-08-08 01:00:28 +00001242 def testFullRead(self):
1243 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001244 msg = self.read_file.read()
1245 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001246
1247 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001248 self.write_file.write(self.write_msg)
1249 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001250
Guido van Rossum24e4af82002-06-12 19:18:08 +00001251 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001252 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001253 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001254 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001255 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001256 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001257 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001258 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001259 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001260
1261 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001262 self.write_file.write(self.write_msg)
1263 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001264
1265 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001266 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001267 line = self.read_file.readline()
1268 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001269
1270 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001271 self.write_file.write(self.write_msg)
1272 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001273
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001274 def testCloseAfterMakefile(self):
1275 # The file returned by makefile should keep the socket open.
1276 self.cli_conn.close()
1277 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001278 msg = self.read_file.read()
1279 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001280
1281 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001282 self.write_file.write(self.write_msg)
1283 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001284
1285 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001286 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001287 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001288 if isinstance(self.read_msg, str):
1289 msg = msg.decode()
1290 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001291
1292 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001293 self.write_file.write(self.write_msg)
1294 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001295
Tim Peters116d83c2004-03-28 02:20:45 +00001296 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001297 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001298
1299 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001300 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001301
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001302 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001303 self.assertEqual(self.read_file.mode, self.read_mode)
1304 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001305
1306 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001307 self.assertEqual(self.write_file.mode, self.write_mode)
1308 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001309
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001310 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001311 self.read_file.close()
1312 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001313 self.cli_conn.close()
1314 self.assertRaises(socket.error, self.cli_conn.getsockname)
1315
1316 def _testRealClose(self):
1317 pass
1318
1319
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001320class FileObjectInterruptedTestCase(unittest.TestCase):
1321 """Test that the file object correctly handles EINTR internally."""
1322
1323 class MockSocket(object):
1324 def __init__(self, recv_funcs=()):
1325 # A generator that returns callables that we'll call for each
1326 # call to recv().
1327 self._recv_step = iter(recv_funcs)
1328
1329 def recv_into(self, buffer):
1330 data = next(self._recv_step)()
1331 assert len(buffer) >= len(data)
1332 buffer[:len(data)] = data
1333 return len(data)
1334
1335 def _decref_socketios(self):
1336 pass
1337
1338 def _textiowrap_for_test(self, buffering=-1):
1339 raw = socket.SocketIO(self, "r")
1340 if buffering < 0:
1341 buffering = io.DEFAULT_BUFFER_SIZE
1342 if buffering == 0:
1343 return raw
1344 buffer = io.BufferedReader(raw, buffering)
1345 text = io.TextIOWrapper(buffer, None, None)
1346 text.mode = "rb"
1347 return text
1348
1349 @staticmethod
1350 def _raise_eintr():
1351 raise socket.error(errno.EINTR)
1352
1353 def _textiowrap_mock_socket(self, mock, buffering=-1):
1354 raw = socket.SocketIO(mock, "r")
1355 if buffering < 0:
1356 buffering = io.DEFAULT_BUFFER_SIZE
1357 if buffering == 0:
1358 return raw
1359 buffer = io.BufferedReader(raw, buffering)
1360 text = io.TextIOWrapper(buffer, None, None)
1361 text.mode = "rb"
1362 return text
1363
1364 def _test_readline(self, size=-1, buffering=-1):
1365 mock_sock = self.MockSocket(recv_funcs=[
1366 lambda : b"This is the first line\nAnd the sec",
1367 self._raise_eintr,
1368 lambda : b"ond line is here\n",
1369 lambda : b"",
1370 lambda : b"", # XXX(gps): io library does an extra EOF read
1371 ])
1372 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001373 self.assertEqual(fo.readline(size), "This is the first line\n")
1374 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001375
1376 def _test_read(self, size=-1, buffering=-1):
1377 mock_sock = self.MockSocket(recv_funcs=[
1378 lambda : b"This is the first line\nAnd the sec",
1379 self._raise_eintr,
1380 lambda : b"ond line is here\n",
1381 lambda : b"",
1382 lambda : b"", # XXX(gps): io library does an extra EOF read
1383 ])
1384 expecting = (b"This is the first line\n"
1385 b"And the second line is here\n")
1386 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1387 if buffering == 0:
1388 data = b''
1389 else:
1390 data = ''
1391 expecting = expecting.decode('utf8')
1392 while len(data) != len(expecting):
1393 part = fo.read(size)
1394 if not part:
1395 break
1396 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001397 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001398
1399 def test_default(self):
1400 self._test_readline()
1401 self._test_readline(size=100)
1402 self._test_read()
1403 self._test_read(size=100)
1404
1405 def test_with_1k_buffer(self):
1406 self._test_readline(buffering=1024)
1407 self._test_readline(size=100, buffering=1024)
1408 self._test_read(buffering=1024)
1409 self._test_read(size=100, buffering=1024)
1410
1411 def _test_readline_no_buffer(self, size=-1):
1412 mock_sock = self.MockSocket(recv_funcs=[
1413 lambda : b"a",
1414 lambda : b"\n",
1415 lambda : b"B",
1416 self._raise_eintr,
1417 lambda : b"b",
1418 lambda : b"",
1419 ])
1420 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001421 self.assertEqual(fo.readline(size), b"a\n")
1422 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001423
1424 def test_no_buffer(self):
1425 self._test_readline_no_buffer()
1426 self._test_readline_no_buffer(size=4)
1427 self._test_read(buffering=0)
1428 self._test_read(size=100, buffering=0)
1429
1430
Guido van Rossume9f66142002-08-07 15:46:19 +00001431class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1432
1433 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001434
Guido van Rossume9f66142002-08-07 15:46:19 +00001435 In this case (and in this case only), it should be possible to
1436 create a file object, read a line from it, create another file
1437 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001438 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001439 when reading multiple requests from the same socket."""
1440
1441 bufsize = 0 # Use unbuffered mode
1442
1443 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001444 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001445 line = self.read_file.readline() # first line
1446 self.assertEqual(line, b"A. " + self.write_msg) # first line
1447 self.read_file = self.cli_conn.makefile('rb', 0)
1448 line = self.read_file.readline() # second line
1449 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001450
1451 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001452 self.write_file.write(b"A. " + self.write_msg)
1453 self.write_file.write(b"B. " + self.write_msg)
1454 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001455
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001456 def testMakefileClose(self):
1457 # The file returned by makefile should keep the socket open...
1458 self.cli_conn.close()
1459 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001460 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001461 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001462 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001463 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1464
1465 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001466 self.write_file.write(self.write_msg)
1467 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001468
1469 def testMakefileCloseSocketDestroy(self):
1470 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001471 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001472 refcount_after = sys.getrefcount(self.cli_conn)
1473 self.assertEqual(refcount_before - 1, refcount_after)
1474
1475 def _testMakefileCloseSocketDestroy(self):
1476 pass
1477
Antoine Pitrou98b46702010-09-18 22:59:00 +00001478 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001479 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001480 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1481
1482 def testSmallReadNonBlocking(self):
1483 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001484 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1485 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001486 self.evt1.set()
1487 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001488 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001489 if first_seg is None:
1490 # Data not arrived (can happen under Windows), wait a bit
1491 time.sleep(0.5)
1492 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001493 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001494 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001495 self.assertEqual(n, 3)
1496 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001497 self.assertEqual(msg, self.read_msg)
1498 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1499 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001500
1501 def _testSmallReadNonBlocking(self):
1502 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001503 self.write_file.write(self.write_msg)
1504 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001505 self.evt2.set()
1506 # Avoid cloding the socket before the server test has finished,
1507 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1508 self.serv_finished.wait(5.0)
1509
1510 def testWriteNonBlocking(self):
1511 self.cli_finished.wait(5.0)
1512 # The client thread can't skip directly - the SkipTest exception
1513 # would appear as a failure.
1514 if self.serv_skipped:
1515 self.skipTest(self.serv_skipped)
1516
1517 def _testWriteNonBlocking(self):
1518 self.serv_skipped = None
1519 self.serv_conn.setblocking(False)
1520 # Try to saturate the socket buffer pipe with repeated large writes.
1521 BIG = b"x" * (1024 ** 2)
1522 LIMIT = 10
1523 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001524 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001525 self.assertGreater(n, 0)
1526 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001527 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001528 if n is None:
1529 # Succeeded
1530 break
1531 self.assertGreater(n, 0)
1532 else:
1533 # Let us know that this test didn't manage to establish
1534 # the expected conditions. This is not a failure in itself but,
1535 # if it happens repeatedly, the test should be fixed.
1536 self.serv_skipped = "failed to saturate the socket buffer"
1537
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001538
Guido van Rossum8c943832002-08-08 01:00:28 +00001539class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1540
1541 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1542
1543
1544class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1545
1546 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001547
Thomas Woutersb2137042007-02-01 18:02:27 +00001548
Antoine Pitrou834bd812010-10-13 16:17:14 +00001549class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1550 """Tests for socket.makefile() in text mode (rather than binary)"""
1551
1552 read_mode = 'r'
1553 read_msg = MSG.decode('utf8')
1554 write_mode = 'wb'
1555 write_msg = MSG
1556 newline = ''
1557
1558
1559class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1560 """Tests for socket.makefile() in text mode (rather than binary)"""
1561
1562 read_mode = 'rb'
1563 read_msg = MSG
1564 write_mode = 'w'
1565 write_msg = MSG.decode('utf8')
1566 newline = ''
1567
1568
1569class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1570 """Tests for socket.makefile() in text mode (rather than binary)"""
1571
1572 read_mode = 'r'
1573 read_msg = MSG.decode('utf8')
1574 write_mode = 'w'
1575 write_msg = MSG.decode('utf8')
1576 newline = ''
1577
1578
Guido van Rossumd8faa362007-04-27 19:54:29 +00001579class NetworkConnectionTest(object):
1580 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001581
Guido van Rossumd8faa362007-04-27 19:54:29 +00001582 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001583 # We're inherited below by BasicTCPTest2, which also inherits
1584 # BasicTCPTest, which defines self.port referenced below.
1585 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001586 self.serv_conn = self.cli
1587
1588class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1589 """Tests that NetworkConnection does not break existing TCP functionality.
1590 """
1591
1592class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001593
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001594 class MockSocket(socket.socket):
1595 def connect(self, *args):
1596 raise socket.timeout('timed out')
1597
1598 @contextlib.contextmanager
1599 def mocked_socket_module(self):
1600 """Return a socket which times out on connect"""
1601 old_socket = socket.socket
1602 socket.socket = self.MockSocket
1603 try:
1604 yield
1605 finally:
1606 socket.socket = old_socket
1607
1608 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001609 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001610 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001611 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001612 with self.assertRaises(socket.error) as cm:
1613 cli.connect((HOST, port))
1614 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1615
1616 def test_create_connection(self):
1617 # Issue #9792: errors raised by create_connection() should have
1618 # a proper errno attribute.
1619 port = support.find_unused_port()
1620 with self.assertRaises(socket.error) as cm:
1621 socket.create_connection((HOST, port))
1622 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1623
1624 def test_create_connection_timeout(self):
1625 # Issue #9792: create_connection() should not recast timeout errors
1626 # as generic socket errors.
1627 with self.mocked_socket_module():
1628 with self.assertRaises(socket.timeout):
1629 socket.create_connection((HOST, 1234))
1630
Guido van Rossumd8faa362007-04-27 19:54:29 +00001631
Victor Stinner45df8202010-04-28 22:31:17 +00001632@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001633class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1634
1635 def __init__(self, methodName='runTest'):
1636 SocketTCPTest.__init__(self, methodName=methodName)
1637 ThreadableTest.__init__(self)
1638
1639 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001640 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641
1642 def clientTearDown(self):
1643 self.cli.close()
1644 self.cli = None
1645 ThreadableTest.clientTearDown(self)
1646
1647 def _justAccept(self):
1648 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001649 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001650
1651 testFamily = _justAccept
1652 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001653 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001654 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001655 self.assertEqual(self.cli.family, 2)
1656
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001657 testSourceAddress = _justAccept
1658 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001659 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1660 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001661 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001662 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001663 # The port number being used is sufficient to show that the bind()
1664 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001665
Guido van Rossumd8faa362007-04-27 19:54:29 +00001666 testTimeoutDefault = _justAccept
1667 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001668 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001669 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001670 socket.setdefaulttimeout(42)
1671 try:
1672 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001673 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001674 finally:
1675 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001676 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001677
1678 testTimeoutNone = _justAccept
1679 def _testTimeoutNone(self):
1680 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001681 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001682 socket.setdefaulttimeout(30)
1683 try:
1684 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001685 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001686 finally:
1687 socket.setdefaulttimeout(None)
1688 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001689
1690 testTimeoutValueNamed = _justAccept
1691 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001692 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001693 self.assertEqual(self.cli.gettimeout(), 30)
1694
1695 testTimeoutValueNonamed = _justAccept
1696 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001697 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001698 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001699 self.assertEqual(self.cli.gettimeout(), 30)
1700
Victor Stinner45df8202010-04-28 22:31:17 +00001701@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001702class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1703
1704 def __init__(self, methodName='runTest'):
1705 SocketTCPTest.__init__(self, methodName=methodName)
1706 ThreadableTest.__init__(self)
1707
1708 def clientSetUp(self):
1709 pass
1710
1711 def clientTearDown(self):
1712 self.cli.close()
1713 self.cli = None
1714 ThreadableTest.clientTearDown(self)
1715
1716 def testInsideTimeout(self):
1717 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001718 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001719 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001720 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001721 testOutsideTimeout = testInsideTimeout
1722
1723 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001724 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001725 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001726 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001727
1728 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001729 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001730 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001731
1732
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001733class TCPTimeoutTest(SocketTCPTest):
1734
1735 def testTCPTimeout(self):
1736 def raise_timeout(*args, **kwargs):
1737 self.serv.settimeout(1.0)
1738 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001739 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001740 "Error generating a timeout exception (TCP)")
1741
1742 def testTimeoutZero(self):
1743 ok = False
1744 try:
1745 self.serv.settimeout(0.0)
1746 foo = self.serv.accept()
1747 except socket.timeout:
1748 self.fail("caught timeout instead of error (TCP)")
1749 except socket.error:
1750 ok = True
1751 except:
1752 self.fail("caught unexpected exception (TCP)")
1753 if not ok:
1754 self.fail("accept() returned success when we did not expect it")
1755
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001756 def testInterruptedTimeout(self):
1757 # XXX I don't know how to do this test on MSWindows or any other
1758 # plaform that doesn't support signal.alarm() or os.kill(), though
1759 # the bug should have existed on all platforms.
1760 if not hasattr(signal, "alarm"):
1761 return # can only test on *nix
1762 self.serv.settimeout(5.0) # must be longer than alarm
1763 class Alarm(Exception):
1764 pass
1765 def alarm_handler(signal, frame):
1766 raise Alarm
1767 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1768 try:
1769 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1770 try:
1771 foo = self.serv.accept()
1772 except socket.timeout:
1773 self.fail("caught timeout instead of Alarm")
1774 except Alarm:
1775 pass
1776 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001777 self.fail("caught other exception instead of Alarm:"
1778 " %s(%s):\n%s" %
1779 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001780 else:
1781 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001782 finally:
1783 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001784 except Alarm:
1785 self.fail("got Alarm in wrong place")
1786 finally:
1787 # no alarm can be pending. Safe to restore old handler.
1788 signal.signal(signal.SIGALRM, old_alarm)
1789
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02001790class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001791
1792 def testUDPTimeout(self):
1793 def raise_timeout(*args, **kwargs):
1794 self.serv.settimeout(1.0)
1795 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001796 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001797 "Error generating a timeout exception (UDP)")
1798
1799 def testTimeoutZero(self):
1800 ok = False
1801 try:
1802 self.serv.settimeout(0.0)
1803 foo = self.serv.recv(1024)
1804 except socket.timeout:
1805 self.fail("caught timeout instead of error (UDP)")
1806 except socket.error:
1807 ok = True
1808 except:
1809 self.fail("caught unexpected exception (UDP)")
1810 if not ok:
1811 self.fail("recv() returned success when we did not expect it")
1812
1813class TestExceptions(unittest.TestCase):
1814
1815 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001816 self.assertTrue(issubclass(socket.error, Exception))
1817 self.assertTrue(issubclass(socket.herror, socket.error))
1818 self.assertTrue(issubclass(socket.gaierror, socket.error))
1819 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001820
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001821class TestLinuxAbstractNamespace(unittest.TestCase):
1822
1823 UNIX_PATH_MAX = 108
1824
1825 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001826 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001827 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1828 s1.bind(address)
1829 s1.listen(1)
1830 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1831 s2.connect(s1.getsockname())
1832 with s1.accept()[0] as s3:
1833 self.assertEqual(s1.getsockname(), address)
1834 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001835
1836 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001837 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001838 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1839 s.bind(address)
1840 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001841
1842 def testNameOverflow(self):
1843 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001844 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1845 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001846
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001847
Victor Stinner45df8202010-04-28 22:31:17 +00001848@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001849class BufferIOTest(SocketConnectedTest):
1850 """
1851 Test the buffer versions of socket.recv() and socket.send().
1852 """
1853 def __init__(self, methodName='runTest'):
1854 SocketConnectedTest.__init__(self, methodName=methodName)
1855
Antoine Pitrou25480782010-03-17 22:50:28 +00001856 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001857 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001858 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001859 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001860 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001861 self.assertEqual(msg, MSG)
1862
Antoine Pitrou25480782010-03-17 22:50:28 +00001863 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001864 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001865 self.serv_conn.send(buf)
1866
Antoine Pitrou25480782010-03-17 22:50:28 +00001867 def testRecvIntoBytearray(self):
1868 buf = bytearray(1024)
1869 nbytes = self.cli_conn.recv_into(buf)
1870 self.assertEqual(nbytes, len(MSG))
1871 msg = buf[:len(MSG)]
1872 self.assertEqual(msg, MSG)
1873
1874 _testRecvIntoBytearray = _testRecvIntoArray
1875
1876 def testRecvIntoMemoryview(self):
1877 buf = bytearray(1024)
1878 nbytes = self.cli_conn.recv_into(memoryview(buf))
1879 self.assertEqual(nbytes, len(MSG))
1880 msg = buf[:len(MSG)]
1881 self.assertEqual(msg, MSG)
1882
1883 _testRecvIntoMemoryview = _testRecvIntoArray
1884
1885 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001886 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001887 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001888 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001889 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001890 self.assertEqual(msg, MSG)
1891
Antoine Pitrou25480782010-03-17 22:50:28 +00001892 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001893 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001894 self.serv_conn.send(buf)
1895
Antoine Pitrou25480782010-03-17 22:50:28 +00001896 def testRecvFromIntoBytearray(self):
1897 buf = bytearray(1024)
1898 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1899 self.assertEqual(nbytes, len(MSG))
1900 msg = buf[:len(MSG)]
1901 self.assertEqual(msg, MSG)
1902
1903 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1904
1905 def testRecvFromIntoMemoryview(self):
1906 buf = bytearray(1024)
1907 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1908 self.assertEqual(nbytes, len(MSG))
1909 msg = buf[:len(MSG)]
1910 self.assertEqual(msg, MSG)
1911
1912 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1913
Christian Heimes043d6f62008-01-07 17:19:16 +00001914
1915TIPC_STYPE = 2000
1916TIPC_LOWER = 200
1917TIPC_UPPER = 210
1918
1919def isTipcAvailable():
1920 """Check if the TIPC module is loaded
1921
1922 The TIPC module is not loaded automatically on Ubuntu and probably
1923 other Linux distros.
1924 """
1925 if not hasattr(socket, "AF_TIPC"):
1926 return False
1927 if not os.path.isfile("/proc/modules"):
1928 return False
1929 with open("/proc/modules") as f:
1930 for line in f:
1931 if line.startswith("tipc "):
1932 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001933 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001934 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1935 return False
1936
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001937class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00001938 def testRDM(self):
1939 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1940 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001941 self.addCleanup(srv.close)
1942 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001943
1944 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1945 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1946 TIPC_LOWER, TIPC_UPPER)
1947 srv.bind(srvaddr)
1948
1949 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1950 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1951 cli.sendto(MSG, sendaddr)
1952
1953 msg, recvaddr = srv.recvfrom(1024)
1954
1955 self.assertEqual(cli.getsockname(), recvaddr)
1956 self.assertEqual(msg, MSG)
1957
1958
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001959class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00001960 def __init__(self, methodName = 'runTest'):
1961 unittest.TestCase.__init__(self, methodName = methodName)
1962 ThreadableTest.__init__(self)
1963
1964 def setUp(self):
1965 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001966 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001967 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1968 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1969 TIPC_LOWER, TIPC_UPPER)
1970 self.srv.bind(srvaddr)
1971 self.srv.listen(5)
1972 self.serverExplicitReady()
1973 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001974 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001975
1976 def clientSetUp(self):
1977 # The is a hittable race between serverExplicitReady() and the
1978 # accept() call; sleep a little while to avoid it, otherwise
1979 # we could get an exception
1980 time.sleep(0.1)
1981 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001982 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00001983 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1984 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1985 self.cli.connect(addr)
1986 self.cliaddr = self.cli.getsockname()
1987
1988 def testStream(self):
1989 msg = self.conn.recv(1024)
1990 self.assertEqual(msg, MSG)
1991 self.assertEqual(self.cliaddr, self.connaddr)
1992
1993 def _testStream(self):
1994 self.cli.send(MSG)
1995 self.cli.close()
1996
1997
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001998@unittest.skipUnless(thread, 'Threading required for this test.')
1999class ContextManagersTest(ThreadedTCPSocketTest):
2000
2001 def _testSocketClass(self):
2002 # base test
2003 with socket.socket() as sock:
2004 self.assertFalse(sock._closed)
2005 self.assertTrue(sock._closed)
2006 # close inside with block
2007 with socket.socket() as sock:
2008 sock.close()
2009 self.assertTrue(sock._closed)
2010 # exception inside with block
2011 with socket.socket() as sock:
2012 self.assertRaises(socket.error, sock.sendall, b'foo')
2013 self.assertTrue(sock._closed)
2014
2015 def testCreateConnectionBase(self):
2016 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002017 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002018 data = conn.recv(1024)
2019 conn.sendall(data)
2020
2021 def _testCreateConnectionBase(self):
2022 address = self.serv.getsockname()
2023 with socket.create_connection(address) as sock:
2024 self.assertFalse(sock._closed)
2025 sock.sendall(b'foo')
2026 self.assertEqual(sock.recv(1024), b'foo')
2027 self.assertTrue(sock._closed)
2028
2029 def testCreateConnectionClose(self):
2030 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002031 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002032 data = conn.recv(1024)
2033 conn.sendall(data)
2034
2035 def _testCreateConnectionClose(self):
2036 address = self.serv.getsockname()
2037 with socket.create_connection(address) as sock:
2038 sock.close()
2039 self.assertTrue(sock._closed)
2040 self.assertRaises(socket.error, sock.sendall, b'foo')
2041
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002042
Antoine Pitroub1c54962010-10-14 15:05:38 +00002043@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
2044 "SOCK_CLOEXEC not defined")
2045@unittest.skipUnless(fcntl, "module fcntl not available")
2046class CloexecConstantTest(unittest.TestCase):
2047 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002048 v = linux_version()
2049 if v < (2, 6, 28):
2050 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2051 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002052 with socket.socket(socket.AF_INET,
2053 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2054 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2055 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002056
2057
2058@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2059 "SOCK_NONBLOCK not defined")
2060class NonblockConstantTest(unittest.TestCase):
2061 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2062 if nonblock:
2063 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2064 self.assertEqual(s.gettimeout(), timeout)
2065 else:
2066 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2067 self.assertEqual(s.gettimeout(), None)
2068
2069 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002070 v = linux_version()
2071 if v < (2, 6, 28):
2072 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2073 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002074 # a lot of it seems silly and redundant, but I wanted to test that
2075 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002076 with socket.socket(socket.AF_INET,
2077 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2078 self.checkNonblock(s)
2079 s.setblocking(1)
2080 self.checkNonblock(s, False)
2081 s.setblocking(0)
2082 self.checkNonblock(s)
2083 s.settimeout(None)
2084 self.checkNonblock(s, False)
2085 s.settimeout(2.0)
2086 self.checkNonblock(s, timeout=2.0)
2087 s.setblocking(1)
2088 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002089 # defaulttimeout
2090 t = socket.getdefaulttimeout()
2091 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002092 with socket.socket() as s:
2093 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002094 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002095 with socket.socket() as s:
2096 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002097 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002098 with socket.socket() as s:
2099 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002100 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002101 with socket.socket() as s:
2102 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002103 socket.setdefaulttimeout(t)
2104
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002105
Guido van Rossumb995eb72002-07-31 16:08:40 +00002106def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002107 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002108 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002109
2110 tests.extend([
2111 NonBlockingTCPTests,
2112 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002113 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002114 UnbufferedFileObjectClassTestCase,
2115 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002116 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002117 UnicodeReadFileObjectClassTestCase,
2118 UnicodeWriteFileObjectClassTestCase,
2119 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002120 NetworkConnectionNoServer,
2121 NetworkConnectionAttributesTest,
2122 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002123 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002124 CloexecConstantTest,
2125 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002126 ])
Dave Cole331708b2004-08-09 04:51:41 +00002127 if hasattr(socket, "socketpair"):
2128 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002129 if sys.platform == 'linux2':
2130 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002131 if isTipcAvailable():
2132 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002133 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002134
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002135 thread_info = support.threading_setup()
2136 support.run_unittest(*tests)
2137 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002138
2139if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002140 test_main()