blob: 5573421728b7acd8204091a45d1087989676b742 [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
Serhiy Storchaka441d30f2013-01-19 12:26:26 +020010import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000011import time
12import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000013import queue
Jack Jansen522e7692002-09-06 21:57:50 +000014import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000015import os
16import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000017import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000018import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000019from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000020import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000021import math
Antoine Pitroub1c54962010-10-14 15:05:38 +000022try:
23 import fcntl
24except ImportError:
25 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000026
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000027def try_address(host, port=0, family=socket.AF_INET):
28 """Try to bind a socket on the given host:port and return True
29 if that has been possible."""
30 try:
31 sock = socket.socket(family, socket.SOCK_STREAM)
32 sock.bind((host, port))
33 except (socket.error, socket.gaierror):
34 return False
35 else:
36 sock.close()
37 return True
38
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000039def linux_version():
40 try:
41 # platform.release() is something like '2.6.33.7-desktop-2mnb'
42 version_string = platform.release().split('-')[0]
43 return tuple(map(int, version_string.split('.')))
44 except ValueError:
45 return 0, 0, 0
46
Benjamin Petersonee8712c2008-05-20 21:35:26 +000047HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000048MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000049SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000050
Victor Stinner45df8202010-04-28 22:31:17 +000051try:
52 import _thread as thread
53 import threading
54except ImportError:
55 thread = None
56 threading = None
57
Guido van Rossum24e4af82002-06-12 19:18:08 +000058class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000059
Guido van Rossum24e4af82002-06-12 19:18:08 +000060 def setUp(self):
61 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000062 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000063 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000064
Guido van Rossum24e4af82002-06-12 19:18:08 +000065 def tearDown(self):
66 self.serv.close()
67 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000068
Guido van Rossum24e4af82002-06-12 19:18:08 +000069class SocketUDPTest(unittest.TestCase):
70
71 def setUp(self):
72 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000073 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000074
75 def tearDown(self):
76 self.serv.close()
77 self.serv = None
78
79class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000080 """Threadable Test class
81
82 The ThreadableTest class makes it easy to create a threaded
83 client/server pair from an existing unit test. To create a
84 new threaded class from an existing unit test, use multiple
85 inheritance:
86
87 class NewClass (OldClass, ThreadableTest):
88 pass
89
90 This class defines two new fixture functions with obvious
91 purposes for overriding:
92
93 clientSetUp ()
94 clientTearDown ()
95
96 Any new test functions within the class must then define
97 tests in pairs, where the test name is preceeded with a
98 '_' to indicate the client portion of the test. Ex:
99
100 def testFoo(self):
101 # Server portion
102
103 def _testFoo(self):
104 # Client portion
105
106 Any exceptions raised by the clients during their tests
107 are caught and transferred to the main thread to alert
108 the testing framework.
109
110 Note, the server setup function cannot call any blocking
111 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000112 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000113 the blocking call (such as in setting up a client/server
114 connection and performing the accept() in setUp().
115 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000116
117 def __init__(self):
118 # Swap the true setup function
119 self.__setUp = self.setUp
120 self.__tearDown = self.tearDown
121 self.setUp = self._setUp
122 self.tearDown = self._tearDown
123
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000124 def serverExplicitReady(self):
125 """This method allows the server to explicitly indicate that
126 it wants the client thread to proceed. This is useful if the
127 server is about to execute a blocking routine that is
128 dependent upon the client thread during its setup routine."""
129 self.server_ready.set()
130
Guido van Rossum24e4af82002-06-12 19:18:08 +0000131 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000132 self.server_ready = threading.Event()
133 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000134 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000135 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000138 methodname = self.id()
139 i = methodname.rfind('.')
140 methodname = methodname[i+1:]
141 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000142 self.client_thread = thread.start_new_thread(
143 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000144
145 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000146 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000147 self.server_ready.set()
148 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149
150 def _tearDown(self):
151 self.__tearDown()
152 self.done.wait()
153
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000154 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000155 exc = self.queue.get()
156 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000157
158 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000159 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200161 self.client_ready.set()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000162 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000163 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000164 try:
165 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000166 except BaseException as e:
167 self.queue.put(e)
168 finally:
169 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000170
171 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000172 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000173
174 def clientTearDown(self):
175 self.done.set()
176 thread.exit()
177
178class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
179
180 def __init__(self, methodName='runTest'):
181 SocketTCPTest.__init__(self, methodName=methodName)
182 ThreadableTest.__init__(self)
183
184 def clientSetUp(self):
185 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
186
187 def clientTearDown(self):
188 self.cli.close()
189 self.cli = None
190 ThreadableTest.clientTearDown(self)
191
192class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
193
194 def __init__(self, methodName='runTest'):
195 SocketUDPTest.__init__(self, methodName=methodName)
196 ThreadableTest.__init__(self)
197
198 def clientSetUp(self):
199 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
200
Brian Curtin3beb38f2010-11-04 03:41:43 +0000201 def clientTearDown(self):
202 self.cli.close()
203 self.cli = None
204 ThreadableTest.clientTearDown(self)
205
Guido van Rossum24e4af82002-06-12 19:18:08 +0000206class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000207 """Socket tests for client-server connection.
208
209 self.cli_conn is a client socket connected to the server. The
210 setUp() method guarantees that it is connected to the server.
211 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000212
213 def __init__(self, methodName='runTest'):
214 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
215
216 def setUp(self):
217 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000218 # Indicate explicitly we're ready for the client thread to
219 # proceed and then perform the blocking call to accept
220 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000221 conn, addr = self.serv.accept()
222 self.cli_conn = conn
223
224 def tearDown(self):
225 self.cli_conn.close()
226 self.cli_conn = None
227 ThreadedTCPSocketTest.tearDown(self)
228
229 def clientSetUp(self):
230 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000231 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232 self.serv_conn = self.cli
233
234 def clientTearDown(self):
235 self.serv_conn.close()
236 self.serv_conn = None
237 ThreadedTCPSocketTest.clientTearDown(self)
238
Dave Cole331708b2004-08-09 04:51:41 +0000239class SocketPairTest(unittest.TestCase, ThreadableTest):
240
241 def __init__(self, methodName='runTest'):
242 unittest.TestCase.__init__(self, methodName=methodName)
243 ThreadableTest.__init__(self)
244
245 def setUp(self):
246 self.serv, self.cli = socket.socketpair()
247
248 def tearDown(self):
249 self.serv.close()
250 self.serv = None
251
252 def clientSetUp(self):
253 pass
254
255 def clientTearDown(self):
256 self.cli.close()
257 self.cli = None
258 ThreadableTest.clientTearDown(self)
259
Tim Peters494aaee2004-08-09 18:54:11 +0000260
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261#######################################################################
262## Begin Tests
263
264class GeneralModuleTests(unittest.TestCase):
265
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000266 def test_repr(self):
267 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000268 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000269 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000270
Raymond Hettinger027bb632004-05-31 03:09:25 +0000271 def test_weakref(self):
272 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
273 p = proxy(s)
274 self.assertEqual(p.fileno(), s.fileno())
275 s.close()
276 s = None
277 try:
278 p.fileno()
279 except ReferenceError:
280 pass
281 else:
282 self.fail('Socket proxy still exists')
283
Guido van Rossum24e4af82002-06-12 19:18:08 +0000284 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000285 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286 def raise_error(*args, **kwargs):
287 raise socket.error
288 def raise_herror(*args, **kwargs):
289 raise socket.herror
290 def raise_gaierror(*args, **kwargs):
291 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000292 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000293 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000294 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000295 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000296 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000297 "Error raising socket exception.")
298
Ezio Melotti63e42302011-05-07 19:47:48 +0300299 def testSendtoErrors(self):
300 # Testing that sendto doens't masks failures. See #10169.
301 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
302 self.addCleanup(s.close)
303 s.bind(('', 0))
304 sockname = s.getsockname()
305 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300306 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300307 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300308 self.assertEqual(str(cm.exception),
309 "'str' does not support the buffer interface")
310 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300311 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300312 self.assertEqual(str(cm.exception),
313 "'complex' does not support the buffer interface")
314 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300315 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300316 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300317 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300318 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300319 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300320 self.assertEqual(str(cm.exception),
321 "'str' does not support the buffer interface")
322 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300323 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300324 self.assertEqual(str(cm.exception),
325 "'complex' does not support the buffer interface")
326 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300327 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300328 self.assertIn('not NoneType', str(cm.exception))
329 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300330 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300331 self.assertIn('an integer is required', str(cm.exception))
332 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300333 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300334 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300335 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300336 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300337 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300338 self.assertIn('(1 given)', str(cm.exception))
339 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300340 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300341 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300342
Guido van Rossum24e4af82002-06-12 19:18:08 +0000343 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000344 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000345 socket.AF_INET
346 socket.SOCK_STREAM
347 socket.SOCK_DGRAM
348 socket.SOCK_RAW
349 socket.SOCK_RDM
350 socket.SOCK_SEQPACKET
351 socket.SOL_SOCKET
352 socket.SO_REUSEADDR
353
Guido van Rossum654c11e2002-06-13 20:24:17 +0000354 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000355 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000356 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000357 try:
358 ip = socket.gethostbyname(hostname)
359 except socket.error:
360 # Probably name lookup wasn't set up right; skip this test
361 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000362 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000363 try:
364 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
365 except socket.error:
366 # Probably a similar problem as above; skip this test
367 return
Brett Cannon01668a12005-03-11 00:04:17 +0000368 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000369 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000370 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000371 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000372
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000373 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000374 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000375 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376 try:
377 # On some versions, this loses a reference
378 orig = sys.getrefcount(__name__)
379 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000380 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000381 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000382 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000383
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000385 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000386 try:
387 # On some versions, this crashes the interpreter.
388 socket.getnameinfo(('x', 0, 0, 0), 0)
389 except socket.error:
390 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000391
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000392 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000393 # This just checks that htons etc. are their own inverse,
394 # when looking at the lower 16 or 32 bits.
395 sizes = {socket.htonl: 32, socket.ntohl: 32,
396 socket.htons: 16, socket.ntohs: 16}
397 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000398 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000399 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
400 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000401
Guido van Rossuma2627af2002-09-14 00:58:46 +0000402 swapped = func(mask)
403 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000404 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000405
Guido van Rossum018919a2007-01-15 00:07:32 +0000406 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000407 good_values = [ 1, 2, 3, 1, 2, 3 ]
408 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000409 for k in good_values:
410 socket.ntohl(k)
411 socket.ntohs(k)
412 socket.htonl(k)
413 socket.htons(k)
414 for k in bad_values:
415 self.assertRaises(OverflowError, socket.ntohl, k)
416 self.assertRaises(OverflowError, socket.ntohs, k)
417 self.assertRaises(OverflowError, socket.htonl, k)
418 self.assertRaises(OverflowError, socket.htons, k)
419
Barry Warsaw11b91a02004-06-28 00:50:43 +0000420 def testGetServBy(self):
421 eq = self.assertEqual
422 # Find one service that exists, then check all the related interfaces.
423 # I've ordered this by protocols that have both a tcp and udp
424 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000425 if (sys.platform.startswith('linux') or
426 sys.platform.startswith('freebsd') or
427 sys.platform.startswith('netbsd') or
428 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000429 # avoid the 'echo' service on this platform, as there is an
430 # assumption breaking non-standard port/protocol entry
431 services = ('daytime', 'qotd', 'domain')
432 else:
433 services = ('echo', 'daytime', 'domain')
434 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000435 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000436 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000437 break
438 except socket.error:
439 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000440 else:
441 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000442 # Try same call with optional protocol omitted
443 port2 = socket.getservbyname(service)
444 eq(port, port2)
445 # Try udp, but don't barf it it doesn't exist
446 try:
447 udpport = socket.getservbyname(service, 'udp')
448 except socket.error:
449 udpport = None
450 else:
451 eq(udpport, port)
452 # Now make sure the lookup by port returns the same service name
453 eq(socket.getservbyport(port2), service)
454 eq(socket.getservbyport(port, 'tcp'), service)
455 if udpport is not None:
456 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000457 # Make sure getservbyport does not accept out of range ports.
458 self.assertRaises(OverflowError, socket.getservbyport, -1)
459 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000460
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000461 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000462 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000463 # The default timeout should initially be None
464 self.assertEqual(socket.getdefaulttimeout(), None)
465 s = socket.socket()
466 self.assertEqual(s.gettimeout(), None)
467 s.close()
468
469 # Set the default timeout to 10, and see if it propagates
470 socket.setdefaulttimeout(10)
471 self.assertEqual(socket.getdefaulttimeout(), 10)
472 s = socket.socket()
473 self.assertEqual(s.gettimeout(), 10)
474 s.close()
475
476 # Reset the default timeout to None, and see if it propagates
477 socket.setdefaulttimeout(None)
478 self.assertEqual(socket.getdefaulttimeout(), None)
479 s = socket.socket()
480 self.assertEqual(s.gettimeout(), None)
481 s.close()
482
483 # Check that setting it to an invalid value raises ValueError
484 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
485
486 # Check that setting it to an invalid type raises TypeError
487 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
488
Benjamin Petersonf91df042009-02-13 02:50:59 +0000489 def testIPv4_inet_aton_fourbytes(self):
490 if not hasattr(socket, 'inet_aton'):
491 return # No inet_aton, nothing to check
492 # Test that issue1008086 and issue767150 are fixed.
493 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000494 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
495 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000496
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000497 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000498 if not hasattr(socket, 'inet_pton'):
499 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000500 from socket import inet_aton as f, inet_pton, AF_INET
501 g = lambda a: inet_pton(AF_INET, a)
502
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100503 assertInvalid = lambda func,a: self.assertRaises(
504 (socket.error, ValueError), func, a
505 )
506
Ezio Melottib3aedd42010-11-20 19:04:17 +0000507 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
508 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
509 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
510 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
511 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100512 assertInvalid(f, '0.0.0.')
513 assertInvalid(f, '300.0.0.0')
514 assertInvalid(f, 'a.0.0.0')
515 assertInvalid(f, '1.2.3.4.5')
516 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000517
Ezio Melottib3aedd42010-11-20 19:04:17 +0000518 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
519 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
520 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
521 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100522 assertInvalid(g, '0.0.0.')
523 assertInvalid(g, '300.0.0.0')
524 assertInvalid(g, 'a.0.0.0')
525 assertInvalid(g, '1.2.3.4.5')
526 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000527
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000528 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000529 if not hasattr(socket, 'inet_pton'):
530 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000531 try:
532 from socket import inet_pton, AF_INET6, has_ipv6
533 if not has_ipv6:
534 return
535 except ImportError:
536 return
537 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100538 assertInvalid = lambda a: self.assertRaises(
539 (socket.error, ValueError), f, a
540 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000541
Ezio Melottib3aedd42010-11-20 19:04:17 +0000542 self.assertEqual(b'\x00' * 16, f('::'))
543 self.assertEqual(b'\x00' * 16, f('0::0'))
544 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
545 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000546 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 +0000547 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
548 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100549 self.assertEqual(
550 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
551 f('ad42:abc::127:0:254:2')
552 )
553 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
554 assertInvalid('0x20::')
555 assertInvalid(':::')
556 assertInvalid('::0::')
557 assertInvalid('1::abc::')
558 assertInvalid('1::abc::def')
559 assertInvalid('1:2:3:4:5:6:')
560 assertInvalid('1:2:3:4:5:6')
561 assertInvalid('1:2:3:4:5:6:7:8:')
562 assertInvalid('1:2:3:4:5:6:7:8:0')
563
564 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
565 f('::254.42.23.64')
566 )
567 self.assertEqual(
568 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
569 f('42::a29b:254.42.23.64')
570 )
571 self.assertEqual(
572 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
573 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
574 )
575 assertInvalid('255.254.253.252')
576 assertInvalid('1::260.2.3.0')
577 assertInvalid('1::0.be.e.0')
578 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
579 assertInvalid('::1.2.3.4:0')
580 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +0000581
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000582 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000583 if not hasattr(socket, 'inet_ntop'):
584 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000585 from socket import inet_ntoa as f, inet_ntop, AF_INET
586 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100587 assertInvalid = lambda func,a: self.assertRaises(
588 (socket.error, ValueError), func, a
589 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000590
Ezio Melottib3aedd42010-11-20 19:04:17 +0000591 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
592 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
593 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
594 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100595 assertInvalid(f, b'\x00' * 3)
596 assertInvalid(f, b'\x00' * 5)
597 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +0000598
Ezio Melottib3aedd42010-11-20 19:04:17 +0000599 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
600 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
601 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100602 assertInvalid(g, b'\x00' * 3)
603 assertInvalid(g, b'\x00' * 5)
604 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000605
606 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000607 if not hasattr(socket, 'inet_ntop'):
608 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000609 try:
610 from socket import inet_ntop, AF_INET6, has_ipv6
611 if not has_ipv6:
612 return
613 except ImportError:
614 return
615 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100616 assertInvalid = lambda a: self.assertRaises(
617 (socket.error, ValueError), f, a
618 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000619
Ezio Melottib3aedd42010-11-20 19:04:17 +0000620 self.assertEqual('::', f(b'\x00' * 16))
621 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
622 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000623 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000624 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 +0000625 )
626
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100627 assertInvalid(b'\x12' * 15)
628 assertInvalid(b'\x12' * 17)
629 assertInvalid(b'\x12' * 4)
630
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000631 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000632
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000633 def testSockName(self):
634 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200635 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000636 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000637 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000638 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000639 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000640 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
641 # it reasonable to get the host's addr in addition to 0.0.0.0.
642 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000643 try:
644 my_ip_addr = socket.gethostbyname(socket.gethostname())
645 except socket.error:
646 # Probably name lookup wasn't set up right; skip this test
647 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000648 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000649 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650
651 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000652 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653 # We know a socket should start without reuse==0
654 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000655 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000656 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000657 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000658
659 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000660 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000662 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
664 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000665 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000666
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000667 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000668 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000669 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
670 sock.settimeout(1)
671 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000672 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000673
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000674 def testNewAttributes(self):
675 # testing .family, .type and .protocol
676 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
677 self.assertEqual(sock.family, socket.AF_INET)
678 self.assertEqual(sock.type, socket.SOCK_STREAM)
679 self.assertEqual(sock.proto, 0)
680 sock.close()
681
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000682 def test_getsockaddrarg(self):
683 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200684 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000685 big_port = port + 65536
686 neg_port = port - 65536
687 sock = socket.socket()
688 try:
689 self.assertRaises(OverflowError, sock.bind, (host, big_port))
690 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
691 sock.bind((host, port))
692 finally:
693 sock.close()
694
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000695 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000696 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000697 self.assertTrue(hasattr(socket.socket, 'ioctl'))
698 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
699 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
700 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000701 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
702 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000703 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000704 self.assertRaises(ValueError, s.ioctl, -1, None)
705 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000706
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000707 def testGetaddrinfo(self):
708 try:
709 socket.getaddrinfo('localhost', 80)
710 except socket.gaierror as err:
711 if err.errno == socket.EAI_SERVICE:
712 # see http://bugs.python.org/issue1282647
713 self.skipTest("buggy libc version")
714 raise
715 # len of every sequence is supposed to be == 5
716 for info in socket.getaddrinfo(HOST, None):
717 self.assertEqual(len(info), 5)
718 # host can be a domain name, a string representation of an
719 # IPv4/v6 address or None
720 socket.getaddrinfo('localhost', 80)
721 socket.getaddrinfo('127.0.0.1', 80)
722 socket.getaddrinfo(None, 80)
723 if SUPPORTS_IPV6:
724 socket.getaddrinfo('::1', 80)
725 # port can be a string service name such as "http", a numeric
726 # port number or None
727 socket.getaddrinfo(HOST, "http")
728 socket.getaddrinfo(HOST, 80)
729 socket.getaddrinfo(HOST, None)
730 # test family and socktype filters
731 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
732 for family, _, _, _, _ in infos:
733 self.assertEqual(family, socket.AF_INET)
734 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
735 for _, socktype, _, _, _ in infos:
736 self.assertEqual(socktype, socket.SOCK_STREAM)
737 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000738 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000739 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
740 # a server willing to support both IPv4 and IPv6 will
741 # usually do this
742 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
743 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000744 # test keyword arguments
745 a = socket.getaddrinfo(HOST, None)
746 b = socket.getaddrinfo(host=HOST, port=None)
747 self.assertEqual(a, b)
748 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
749 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
750 self.assertEqual(a, b)
751 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
752 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
753 self.assertEqual(a, b)
754 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
755 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
756 self.assertEqual(a, b)
757 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
758 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
759 self.assertEqual(a, b)
760 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
761 socket.AI_PASSIVE)
762 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
763 type=socket.SOCK_STREAM, proto=0,
764 flags=socket.AI_PASSIVE)
765 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000766 # Issue #6697.
767 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000768
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000769 def test_getnameinfo(self):
770 # only IP addresses are allowed
771 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
772
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000773 @unittest.skipUnless(support.is_resource_enabled('network'),
774 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000775 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000776 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000777 # these should all be successful
778 socket.gethostbyname('испытание.python.org')
779 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000780 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
781 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
782 # have a reverse entry yet
783 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000784
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000785 def check_sendall_interrupted(self, with_timeout):
786 # socketpair() is not stricly required, but it makes things easier.
787 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
788 self.skipTest("signal.alarm and socket.socketpair required for this test")
789 # Our signal handlers clobber the C errno by calling a math function
790 # with an invalid domain value.
791 def ok_handler(*args):
792 self.assertRaises(ValueError, math.acosh, 0)
793 def raising_handler(*args):
794 self.assertRaises(ValueError, math.acosh, 0)
795 1 // 0
796 c, s = socket.socketpair()
797 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
798 try:
799 if with_timeout:
800 # Just above the one second minimum for signal.alarm
801 c.settimeout(1.5)
802 with self.assertRaises(ZeroDivisionError):
803 signal.alarm(1)
804 c.sendall(b"x" * (1024**2))
805 if with_timeout:
806 signal.signal(signal.SIGALRM, ok_handler)
807 signal.alarm(1)
808 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
809 finally:
810 signal.signal(signal.SIGALRM, old_alarm)
811 c.close()
812 s.close()
813
814 def test_sendall_interrupted(self):
815 self.check_sendall_interrupted(False)
816
817 def test_sendall_interrupted_with_timeout(self):
818 self.check_sendall_interrupted(True)
819
Antoine Pitroue033e062010-10-29 10:38:18 +0000820 def test_dealloc_warn(self):
821 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
822 r = repr(sock)
823 with self.assertWarns(ResourceWarning) as cm:
824 sock = None
825 support.gc_collect()
826 self.assertIn(r, str(cm.warning.args[0]))
827 # An open socket file object gets dereferenced after the socket
828 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
829 f = sock.makefile('rb')
830 r = repr(sock)
831 sock = None
832 support.gc_collect()
833 with self.assertWarns(ResourceWarning):
834 f = None
835 support.gc_collect()
836
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000837 def test_name_closed_socketio(self):
838 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
839 fp = sock.makefile("rb")
840 fp.close()
841 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
842
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +0200843 def test_unusable_closed_socketio(self):
844 with socket.socket() as sock:
845 fp = sock.makefile("rb", buffering=0)
846 self.assertTrue(fp.readable())
847 self.assertFalse(fp.writable())
848 self.assertFalse(fp.seekable())
849 fp.close()
850 self.assertRaises(ValueError, fp.readable)
851 self.assertRaises(ValueError, fp.writable)
852 self.assertRaises(ValueError, fp.seekable)
853
Serhiy Storchaka441d30f2013-01-19 12:26:26 +0200854 def test_listen_backlog(self):
855 for backlog in 0, -1:
856 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
857 srv.bind((HOST, 0))
858 srv.listen(backlog)
859 srv.close()
860
861 # Issue 15989
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200862 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
863 srv.bind((HOST, 0))
Serhiy Storchaka441d30f2013-01-19 12:26:26 +0200864 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200865 srv.close()
866
Charles-François Natali366999a2012-01-02 15:47:29 +0100867 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
868 def test_flowinfo(self):
869 self.assertRaises(OverflowError, socket.getnameinfo,
870 ('::1',0, 0xffffffff), 0)
871 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
872 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
873
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000874
Victor Stinner45df8202010-04-28 22:31:17 +0000875@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876class BasicTCPTest(SocketConnectedTest):
877
878 def __init__(self, methodName='runTest'):
879 SocketConnectedTest.__init__(self, methodName=methodName)
880
881 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000882 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000883 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000884 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000885
886 def _testRecv(self):
887 self.serv_conn.send(MSG)
888
889 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000890 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000891 seg1 = self.cli_conn.recv(len(MSG) - 3)
892 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000893 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000894 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895
896 def _testOverFlowRecv(self):
897 self.serv_conn.send(MSG)
898
899 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000900 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000902 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000903
904 def _testRecvFrom(self):
905 self.serv_conn.send(MSG)
906
907 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000908 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000909 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
910 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000911 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000912 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000913
914 def _testOverFlowRecvFrom(self):
915 self.serv_conn.send(MSG)
916
917 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000918 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000919 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920 while 1:
921 read = self.cli_conn.recv(1024)
922 if not read:
923 break
Guido van Rossume531e292002-08-08 20:28:34 +0000924 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000925 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000926
927 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000928 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929 self.serv_conn.sendall(big_chunk)
930
931 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000932 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933 fd = self.cli_conn.fileno()
934 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000935 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000936 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000938 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000939
940 def _testFromFd(self):
941 self.serv_conn.send(MSG)
942
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000943 def testDup(self):
944 # Testing dup()
945 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000946 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000947 msg = sock.recv(1024)
948 self.assertEqual(msg, MSG)
949
950 def _testDup(self):
951 self.serv_conn.send(MSG)
952
Guido van Rossum24e4af82002-06-12 19:18:08 +0000953 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000954 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000955 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000956 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000957 # wait for _testShutdown to finish: on OS X, when the server
958 # closes the connection the client also becomes disconnected,
959 # and the client's shutdown call will fail. (Issue #4397.)
960 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961
962 def _testShutdown(self):
963 self.serv_conn.send(MSG)
Serhiy Storchaka441d30f2013-01-19 12:26:26 +0200964 # Issue 15989
965 self.assertRaises(OverflowError, self.serv_conn.shutdown,
966 _testcapi.INT_MAX + 1)
967 self.assertRaises(OverflowError, self.serv_conn.shutdown,
968 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000969 self.serv_conn.shutdown(2)
970
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000971 def testDetach(self):
972 # Testing detach()
973 fileno = self.cli_conn.fileno()
974 f = self.cli_conn.detach()
975 self.assertEqual(f, fileno)
976 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +0200977 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000978 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
979 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000980 # ...but we can create another socket using the (still open)
981 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000982 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000983 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000984 msg = sock.recv(1024)
985 self.assertEqual(msg, MSG)
986
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000987 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000988 self.serv_conn.send(MSG)
989
Victor Stinner45df8202010-04-28 22:31:17 +0000990@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000991class BasicUDPTest(ThreadedUDPSocketTest):
992
993 def __init__(self, methodName='runTest'):
994 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
995
996 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000997 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000998 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000999 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001000
1001 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001002 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001003
Guido van Rossum1c938012002-06-12 21:17:20 +00001004 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001005 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001006 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001007 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001008
Guido van Rossum1c938012002-06-12 21:17:20 +00001009 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001010 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001011
Guido van Rossumd8faa362007-04-27 19:54:29 +00001012 def testRecvFromNegative(self):
1013 # Negative lengths passed to recvfrom should give ValueError.
1014 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1015
1016 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001017 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001018
Victor Stinner45df8202010-04-28 22:31:17 +00001019@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001020class TCPCloserTest(ThreadedTCPSocketTest):
1021
1022 def testClose(self):
1023 conn, addr = self.serv.accept()
1024 conn.close()
1025
1026 sd = self.cli
1027 read, write, err = select.select([sd], [], [], 1.0)
1028 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001029 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001030
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001031 # Calling close() many times should be safe.
1032 conn.close()
1033 conn.close()
1034
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001035 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001036 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001037 time.sleep(1.0)
1038
Victor Stinner45df8202010-04-28 22:31:17 +00001039@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00001040class BasicSocketPairTest(SocketPairTest):
1041
1042 def __init__(self, methodName='runTest'):
1043 SocketPairTest.__init__(self, methodName=methodName)
1044
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001045 def _check_defaults(self, sock):
1046 self.assertIsInstance(sock, socket.socket)
1047 if hasattr(socket, 'AF_UNIX'):
1048 self.assertEqual(sock.family, socket.AF_UNIX)
1049 else:
1050 self.assertEqual(sock.family, socket.AF_INET)
1051 self.assertEqual(sock.type, socket.SOCK_STREAM)
1052 self.assertEqual(sock.proto, 0)
1053
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001054 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001055 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001056
1057 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00001058 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001059
Dave Cole331708b2004-08-09 04:51:41 +00001060 def testRecv(self):
1061 msg = self.serv.recv(1024)
1062 self.assertEqual(msg, MSG)
1063
1064 def _testRecv(self):
1065 self.cli.send(MSG)
1066
1067 def testSend(self):
1068 self.serv.send(MSG)
1069
1070 def _testSend(self):
1071 msg = self.cli.recv(1024)
1072 self.assertEqual(msg, MSG)
1073
Victor Stinner45df8202010-04-28 22:31:17 +00001074@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001075class NonBlockingTCPTests(ThreadedTCPSocketTest):
1076
1077 def __init__(self, methodName='runTest'):
1078 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1079
1080 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001081 # Testing whether set blocking works
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001082 self.serv.setblocking(True)
1083 self.assertIsNone(self.serv.gettimeout())
1084 self.serv.setblocking(False)
1085 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001086 start = time.time()
1087 try:
1088 self.serv.accept()
1089 except socket.error:
1090 pass
1091 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001092 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Serhiy Storchaka441d30f2013-01-19 12:26:26 +02001093 # Issue 15989
1094 if _testcapi.UINT_MAX < _testcapi.ULONG_MAX:
1095 self.serv.setblocking(_testcapi.UINT_MAX + 1)
1096 self.assertIsNone(self.serv.gettimeout())
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097
1098 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001099 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001100
Antoine Pitroub1c54962010-10-14 15:05:38 +00001101 if hasattr(socket, "SOCK_NONBLOCK"):
1102 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001103 v = linux_version()
1104 if v < (2, 6, 28):
1105 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1106 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001107 # reinit server socket
1108 self.serv.close()
1109 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001110 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001111 self.port = support.bind_port(self.serv)
1112 self.serv.listen(1)
1113 # actual testing
1114 start = time.time()
1115 try:
1116 self.serv.accept()
1117 except socket.error:
1118 pass
1119 end = time.time()
1120 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1121
1122 def _testInitNonBlocking(self):
1123 pass
1124
Antoine Pitrou600232b2011-01-05 21:03:42 +00001125 def testInheritFlags(self):
1126 # Issue #7995: when calling accept() on a listening socket with a
1127 # timeout, the resulting socket should not be non-blocking.
1128 self.serv.settimeout(10)
1129 try:
1130 conn, addr = self.serv.accept()
1131 message = conn.recv(len(MSG))
1132 finally:
1133 conn.close()
1134 self.serv.settimeout(None)
1135
1136 def _testInheritFlags(self):
1137 time.sleep(0.1)
1138 self.cli.connect((HOST, self.port))
1139 time.sleep(0.5)
1140 self.cli.send(MSG)
1141
Guido van Rossum24e4af82002-06-12 19:18:08 +00001142 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001143 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001144 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001145 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001146 conn, addr = self.serv.accept()
1147 except socket.error:
1148 pass
1149 else:
1150 self.fail("Error trying to do non-blocking accept.")
1151 read, write, err = select.select([self.serv], [], [])
1152 if self.serv in read:
1153 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001154 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155 else:
1156 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001157
Guido van Rossum24e4af82002-06-12 19:18:08 +00001158 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001159 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001160 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001161
1162 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001163 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001164 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001165 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001166
1167 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001168 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001169 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001170
1171 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001172 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001173 conn, addr = self.serv.accept()
1174 conn.setblocking(0)
1175 try:
1176 msg = conn.recv(len(MSG))
1177 except socket.error:
1178 pass
1179 else:
1180 self.fail("Error trying to do non-blocking recv.")
1181 read, write, err = select.select([conn], [], [])
1182 if conn in read:
1183 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001184 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001185 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001186 else:
1187 self.fail("Error during select call to non-blocking socket.")
1188
1189 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001190 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001191 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001192 self.cli.send(MSG)
1193
Victor Stinner45df8202010-04-28 22:31:17 +00001194@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001195class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001196 """Unit tests for the object returned by socket.makefile()
1197
Antoine Pitrou834bd812010-10-13 16:17:14 +00001198 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001199 the client connection. You can read from this file to
1200 get output from the server.
1201
Antoine Pitrou834bd812010-10-13 16:17:14 +00001202 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001203 server connection. You can write to this file to send output
1204 to the client.
1205 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001206
Guido van Rossume9f66142002-08-07 15:46:19 +00001207 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001208 encoding = 'utf8'
1209 errors = 'strict'
1210 newline = None
1211
1212 read_mode = 'rb'
1213 read_msg = MSG
1214 write_mode = 'wb'
1215 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001216
Guido van Rossum24e4af82002-06-12 19:18:08 +00001217 def __init__(self, methodName='runTest'):
1218 SocketConnectedTest.__init__(self, methodName=methodName)
1219
1220 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001221 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1222 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001223 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001224 self.read_file = self.cli_conn.makefile(
1225 self.read_mode, self.bufsize,
1226 encoding = self.encoding,
1227 errors = self.errors,
1228 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001229
1230 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001231 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001232 self.read_file.close()
1233 self.assertTrue(self.read_file.closed)
1234 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001235 SocketConnectedTest.tearDown(self)
1236
1237 def clientSetUp(self):
1238 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001239 self.write_file = self.serv_conn.makefile(
1240 self.write_mode, self.bufsize,
1241 encoding = self.encoding,
1242 errors = self.errors,
1243 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001244
1245 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001246 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001247 self.write_file.close()
1248 self.assertTrue(self.write_file.closed)
1249 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001250 SocketConnectedTest.clientTearDown(self)
1251
Antoine Pitrou5d5381e2011-02-25 23:14:08 +00001252 def testReadAfterTimeout(self):
1253 # Issue #7322: A file object must disallow further reads
1254 # after a timeout has occurred.
1255 self.cli_conn.settimeout(1)
1256 self.read_file.read(3)
1257 # First read raises a timeout
1258 self.assertRaises(socket.timeout, self.read_file.read, 1)
1259 # Second read is disallowed
1260 with self.assertRaises(IOError) as ctx:
1261 self.read_file.read(1)
1262 self.assertIn("cannot read from timed out object", str(ctx.exception))
1263
1264 def _testReadAfterTimeout(self):
1265 self.write_file.write(self.write_msg[0:3])
1266 self.write_file.flush()
1267 self.serv_finished.wait()
1268
Guido van Rossum24e4af82002-06-12 19:18:08 +00001269 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001270 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001271 first_seg = self.read_file.read(len(self.read_msg)-3)
1272 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001273 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001274 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001275
1276 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001277 self.write_file.write(self.write_msg)
1278 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001279
Guido van Rossum8c943832002-08-08 01:00:28 +00001280 def testFullRead(self):
1281 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001282 msg = self.read_file.read()
1283 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001284
1285 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001286 self.write_file.write(self.write_msg)
1287 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001288
Guido van Rossum24e4af82002-06-12 19:18:08 +00001289 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001290 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001291 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001292 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001293 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001294 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001295 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001296 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001297 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001298
1299 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001300 self.write_file.write(self.write_msg)
1301 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001302
1303 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001304 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001305 line = self.read_file.readline()
1306 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001307
1308 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001309 self.write_file.write(self.write_msg)
1310 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001311
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001312 def testCloseAfterMakefile(self):
1313 # The file returned by makefile should keep the socket open.
1314 self.cli_conn.close()
1315 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001316 msg = self.read_file.read()
1317 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001318
1319 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001320 self.write_file.write(self.write_msg)
1321 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001322
1323 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001324 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001325 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001326 if isinstance(self.read_msg, str):
1327 msg = msg.decode()
1328 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001329
1330 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001331 self.write_file.write(self.write_msg)
1332 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001333
Tim Peters116d83c2004-03-28 02:20:45 +00001334 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001335 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001336
1337 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001338 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001339
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001340 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001341 self.assertEqual(self.read_file.mode, self.read_mode)
1342 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001343
1344 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001345 self.assertEqual(self.write_file.mode, self.write_mode)
1346 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001347
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001348 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001349 self.read_file.close()
1350 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001351 self.cli_conn.close()
1352 self.assertRaises(socket.error, self.cli_conn.getsockname)
1353
1354 def _testRealClose(self):
1355 pass
1356
1357
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001358class FileObjectInterruptedTestCase(unittest.TestCase):
1359 """Test that the file object correctly handles EINTR internally."""
1360
1361 class MockSocket(object):
1362 def __init__(self, recv_funcs=()):
1363 # A generator that returns callables that we'll call for each
1364 # call to recv().
1365 self._recv_step = iter(recv_funcs)
1366
1367 def recv_into(self, buffer):
1368 data = next(self._recv_step)()
1369 assert len(buffer) >= len(data)
1370 buffer[:len(data)] = data
1371 return len(data)
1372
1373 def _decref_socketios(self):
1374 pass
1375
1376 def _textiowrap_for_test(self, buffering=-1):
1377 raw = socket.SocketIO(self, "r")
1378 if buffering < 0:
1379 buffering = io.DEFAULT_BUFFER_SIZE
1380 if buffering == 0:
1381 return raw
1382 buffer = io.BufferedReader(raw, buffering)
1383 text = io.TextIOWrapper(buffer, None, None)
1384 text.mode = "rb"
1385 return text
1386
1387 @staticmethod
1388 def _raise_eintr():
1389 raise socket.error(errno.EINTR)
1390
1391 def _textiowrap_mock_socket(self, mock, buffering=-1):
1392 raw = socket.SocketIO(mock, "r")
1393 if buffering < 0:
1394 buffering = io.DEFAULT_BUFFER_SIZE
1395 if buffering == 0:
1396 return raw
1397 buffer = io.BufferedReader(raw, buffering)
1398 text = io.TextIOWrapper(buffer, None, None)
1399 text.mode = "rb"
1400 return text
1401
1402 def _test_readline(self, size=-1, buffering=-1):
1403 mock_sock = self.MockSocket(recv_funcs=[
1404 lambda : b"This is the first line\nAnd the sec",
1405 self._raise_eintr,
1406 lambda : b"ond line is here\n",
1407 lambda : b"",
1408 lambda : b"", # XXX(gps): io library does an extra EOF read
1409 ])
1410 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001411 self.assertEqual(fo.readline(size), "This is the first line\n")
1412 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001413
1414 def _test_read(self, size=-1, buffering=-1):
1415 mock_sock = self.MockSocket(recv_funcs=[
1416 lambda : b"This is the first line\nAnd the sec",
1417 self._raise_eintr,
1418 lambda : b"ond line is here\n",
1419 lambda : b"",
1420 lambda : b"", # XXX(gps): io library does an extra EOF read
1421 ])
1422 expecting = (b"This is the first line\n"
1423 b"And the second line is here\n")
1424 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1425 if buffering == 0:
1426 data = b''
1427 else:
1428 data = ''
1429 expecting = expecting.decode('utf8')
1430 while len(data) != len(expecting):
1431 part = fo.read(size)
1432 if not part:
1433 break
1434 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001435 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001436
1437 def test_default(self):
1438 self._test_readline()
1439 self._test_readline(size=100)
1440 self._test_read()
1441 self._test_read(size=100)
1442
1443 def test_with_1k_buffer(self):
1444 self._test_readline(buffering=1024)
1445 self._test_readline(size=100, buffering=1024)
1446 self._test_read(buffering=1024)
1447 self._test_read(size=100, buffering=1024)
1448
1449 def _test_readline_no_buffer(self, size=-1):
1450 mock_sock = self.MockSocket(recv_funcs=[
1451 lambda : b"a",
1452 lambda : b"\n",
1453 lambda : b"B",
1454 self._raise_eintr,
1455 lambda : b"b",
1456 lambda : b"",
1457 ])
1458 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001459 self.assertEqual(fo.readline(size), b"a\n")
1460 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001461
1462 def test_no_buffer(self):
1463 self._test_readline_no_buffer()
1464 self._test_readline_no_buffer(size=4)
1465 self._test_read(buffering=0)
1466 self._test_read(size=100, buffering=0)
1467
1468
Guido van Rossume9f66142002-08-07 15:46:19 +00001469class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1470
1471 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001472
Guido van Rossume9f66142002-08-07 15:46:19 +00001473 In this case (and in this case only), it should be possible to
1474 create a file object, read a line from it, create another file
1475 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001476 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001477 when reading multiple requests from the same socket."""
1478
1479 bufsize = 0 # Use unbuffered mode
1480
1481 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001482 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001483 line = self.read_file.readline() # first line
1484 self.assertEqual(line, b"A. " + self.write_msg) # first line
1485 self.read_file = self.cli_conn.makefile('rb', 0)
1486 line = self.read_file.readline() # second line
1487 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001488
1489 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001490 self.write_file.write(b"A. " + self.write_msg)
1491 self.write_file.write(b"B. " + self.write_msg)
1492 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001493
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001494 def testMakefileClose(self):
1495 # The file returned by makefile should keep the socket open...
1496 self.cli_conn.close()
1497 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001498 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001499 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001500 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001501 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1502
1503 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001504 self.write_file.write(self.write_msg)
1505 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001506
1507 def testMakefileCloseSocketDestroy(self):
1508 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001509 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001510 refcount_after = sys.getrefcount(self.cli_conn)
1511 self.assertEqual(refcount_before - 1, refcount_after)
1512
1513 def _testMakefileCloseSocketDestroy(self):
1514 pass
1515
Antoine Pitrou98b46702010-09-18 22:59:00 +00001516 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001517 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001518 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1519
1520 def testSmallReadNonBlocking(self):
1521 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001522 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1523 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001524 self.evt1.set()
1525 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001526 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001527 if first_seg is None:
1528 # Data not arrived (can happen under Windows), wait a bit
1529 time.sleep(0.5)
1530 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001531 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001532 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001533 self.assertEqual(n, 3)
1534 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001535 self.assertEqual(msg, self.read_msg)
1536 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1537 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001538
1539 def _testSmallReadNonBlocking(self):
1540 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001541 self.write_file.write(self.write_msg)
1542 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001543 self.evt2.set()
1544 # Avoid cloding the socket before the server test has finished,
1545 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1546 self.serv_finished.wait(5.0)
1547
1548 def testWriteNonBlocking(self):
1549 self.cli_finished.wait(5.0)
1550 # The client thread can't skip directly - the SkipTest exception
1551 # would appear as a failure.
1552 if self.serv_skipped:
1553 self.skipTest(self.serv_skipped)
1554
1555 def _testWriteNonBlocking(self):
1556 self.serv_skipped = None
1557 self.serv_conn.setblocking(False)
1558 # Try to saturate the socket buffer pipe with repeated large writes.
1559 BIG = b"x" * (1024 ** 2)
1560 LIMIT = 10
1561 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001562 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001563 self.assertGreater(n, 0)
1564 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001565 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001566 if n is None:
1567 # Succeeded
1568 break
1569 self.assertGreater(n, 0)
1570 else:
1571 # Let us know that this test didn't manage to establish
1572 # the expected conditions. This is not a failure in itself but,
1573 # if it happens repeatedly, the test should be fixed.
1574 self.serv_skipped = "failed to saturate the socket buffer"
1575
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001576
Guido van Rossum8c943832002-08-08 01:00:28 +00001577class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1578
1579 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1580
1581
1582class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1583
1584 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001585
Thomas Woutersb2137042007-02-01 18:02:27 +00001586
Antoine Pitrou834bd812010-10-13 16:17:14 +00001587class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1588 """Tests for socket.makefile() in text mode (rather than binary)"""
1589
1590 read_mode = 'r'
1591 read_msg = MSG.decode('utf8')
1592 write_mode = 'wb'
1593 write_msg = MSG
1594 newline = ''
1595
1596
1597class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1598 """Tests for socket.makefile() in text mode (rather than binary)"""
1599
1600 read_mode = 'rb'
1601 read_msg = MSG
1602 write_mode = 'w'
1603 write_msg = MSG.decode('utf8')
1604 newline = ''
1605
1606
1607class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1608 """Tests for socket.makefile() in text mode (rather than binary)"""
1609
1610 read_mode = 'r'
1611 read_msg = MSG.decode('utf8')
1612 write_mode = 'w'
1613 write_msg = MSG.decode('utf8')
1614 newline = ''
1615
1616
Guido van Rossumd8faa362007-04-27 19:54:29 +00001617class NetworkConnectionTest(object):
1618 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001619
Guido van Rossumd8faa362007-04-27 19:54:29 +00001620 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001621 # We're inherited below by BasicTCPTest2, which also inherits
1622 # BasicTCPTest, which defines self.port referenced below.
1623 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624 self.serv_conn = self.cli
1625
1626class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1627 """Tests that NetworkConnection does not break existing TCP functionality.
1628 """
1629
1630class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001631
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001632 class MockSocket(socket.socket):
1633 def connect(self, *args):
1634 raise socket.timeout('timed out')
1635
1636 @contextlib.contextmanager
1637 def mocked_socket_module(self):
1638 """Return a socket which times out on connect"""
1639 old_socket = socket.socket
1640 socket.socket = self.MockSocket
1641 try:
1642 yield
1643 finally:
1644 socket.socket = old_socket
1645
1646 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001647 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001648 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001649 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001650 with self.assertRaises(socket.error) as cm:
1651 cli.connect((HOST, port))
1652 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1653
1654 def test_create_connection(self):
1655 # Issue #9792: errors raised by create_connection() should have
1656 # a proper errno attribute.
1657 port = support.find_unused_port()
1658 with self.assertRaises(socket.error) as cm:
1659 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04001660
1661 # Issue #16257: create_connection() calls getaddrinfo() against
1662 # 'localhost'. This may result in an IPV6 addr being returned
1663 # as well as an IPV4 one:
1664 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1665 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1666 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1667 #
1668 # create_connection() enumerates through all the addresses returned
1669 # and if it doesn't successfully bind to any of them, it propagates
1670 # the last exception it encountered.
1671 #
1672 # On Solaris, ENETUNREACH is returned in this circumstance instead
1673 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1674 # expected errnos.
1675 expected_errnos = [ errno.ECONNREFUSED, ]
1676 if hasattr(errno, 'ENETUNREACH'):
1677 expected_errnos.append(errno.ENETUNREACH)
1678
1679 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001680
1681 def test_create_connection_timeout(self):
1682 # Issue #9792: create_connection() should not recast timeout errors
1683 # as generic socket errors.
1684 with self.mocked_socket_module():
1685 with self.assertRaises(socket.timeout):
1686 socket.create_connection((HOST, 1234))
1687
Guido van Rossumd8faa362007-04-27 19:54:29 +00001688
Victor Stinner45df8202010-04-28 22:31:17 +00001689@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001690class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1691
1692 def __init__(self, methodName='runTest'):
1693 SocketTCPTest.__init__(self, methodName=methodName)
1694 ThreadableTest.__init__(self)
1695
1696 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001697 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001698
1699 def clientTearDown(self):
1700 self.cli.close()
1701 self.cli = None
1702 ThreadableTest.clientTearDown(self)
1703
1704 def _justAccept(self):
1705 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001706 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001707
1708 testFamily = _justAccept
1709 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001710 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001711 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001712 self.assertEqual(self.cli.family, 2)
1713
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001714 testSourceAddress = _justAccept
1715 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001716 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1717 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001718 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001719 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001720 # The port number being used is sufficient to show that the bind()
1721 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001722
Guido van Rossumd8faa362007-04-27 19:54:29 +00001723 testTimeoutDefault = _justAccept
1724 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001725 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001726 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001727 socket.setdefaulttimeout(42)
1728 try:
1729 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001730 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001731 finally:
1732 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001733 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001734
1735 testTimeoutNone = _justAccept
1736 def _testTimeoutNone(self):
1737 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001738 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001739 socket.setdefaulttimeout(30)
1740 try:
1741 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001742 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001743 finally:
1744 socket.setdefaulttimeout(None)
1745 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001746
1747 testTimeoutValueNamed = _justAccept
1748 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001749 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001750 self.assertEqual(self.cli.gettimeout(), 30)
1751
1752 testTimeoutValueNonamed = _justAccept
1753 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001754 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001755 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001756 self.assertEqual(self.cli.gettimeout(), 30)
1757
Victor Stinner45df8202010-04-28 22:31:17 +00001758@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001759class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1760
1761 def __init__(self, methodName='runTest'):
1762 SocketTCPTest.__init__(self, methodName=methodName)
1763 ThreadableTest.__init__(self)
1764
1765 def clientSetUp(self):
1766 pass
1767
1768 def clientTearDown(self):
1769 self.cli.close()
1770 self.cli = None
1771 ThreadableTest.clientTearDown(self)
1772
1773 def testInsideTimeout(self):
1774 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001775 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001776 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001777 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001778 testOutsideTimeout = testInsideTimeout
1779
1780 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001781 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001782 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001783 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001784
1785 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001786 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001787 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001788
1789
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001790class TCPTimeoutTest(SocketTCPTest):
1791
1792 def testTCPTimeout(self):
1793 def raise_timeout(*args, **kwargs):
1794 self.serv.settimeout(1.0)
1795 self.serv.accept()
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 (TCP)")
1798
1799 def testTimeoutZero(self):
1800 ok = False
1801 try:
1802 self.serv.settimeout(0.0)
1803 foo = self.serv.accept()
1804 except socket.timeout:
1805 self.fail("caught timeout instead of error (TCP)")
1806 except socket.error:
1807 ok = True
1808 except:
1809 self.fail("caught unexpected exception (TCP)")
1810 if not ok:
1811 self.fail("accept() returned success when we did not expect it")
1812
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001813 def testInterruptedTimeout(self):
1814 # XXX I don't know how to do this test on MSWindows or any other
1815 # plaform that doesn't support signal.alarm() or os.kill(), though
1816 # the bug should have existed on all platforms.
1817 if not hasattr(signal, "alarm"):
1818 return # can only test on *nix
1819 self.serv.settimeout(5.0) # must be longer than alarm
1820 class Alarm(Exception):
1821 pass
1822 def alarm_handler(signal, frame):
1823 raise Alarm
1824 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1825 try:
1826 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1827 try:
1828 foo = self.serv.accept()
1829 except socket.timeout:
1830 self.fail("caught timeout instead of Alarm")
1831 except Alarm:
1832 pass
1833 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001834 self.fail("caught other exception instead of Alarm:"
1835 " %s(%s):\n%s" %
1836 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001837 else:
1838 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001839 finally:
1840 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001841 except Alarm:
1842 self.fail("got Alarm in wrong place")
1843 finally:
1844 # no alarm can be pending. Safe to restore old handler.
1845 signal.signal(signal.SIGALRM, old_alarm)
1846
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02001847class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001848
1849 def testUDPTimeout(self):
1850 def raise_timeout(*args, **kwargs):
1851 self.serv.settimeout(1.0)
1852 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001853 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001854 "Error generating a timeout exception (UDP)")
1855
1856 def testTimeoutZero(self):
1857 ok = False
1858 try:
1859 self.serv.settimeout(0.0)
1860 foo = self.serv.recv(1024)
1861 except socket.timeout:
1862 self.fail("caught timeout instead of error (UDP)")
1863 except socket.error:
1864 ok = True
1865 except:
1866 self.fail("caught unexpected exception (UDP)")
1867 if not ok:
1868 self.fail("recv() returned success when we did not expect it")
1869
1870class TestExceptions(unittest.TestCase):
1871
1872 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001873 self.assertTrue(issubclass(socket.error, Exception))
1874 self.assertTrue(issubclass(socket.herror, socket.error))
1875 self.assertTrue(issubclass(socket.gaierror, socket.error))
1876 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001877
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001878class TestLinuxAbstractNamespace(unittest.TestCase):
1879
1880 UNIX_PATH_MAX = 108
1881
1882 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001883 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001884 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1885 s1.bind(address)
1886 s1.listen(1)
1887 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1888 s2.connect(s1.getsockname())
1889 with s1.accept()[0] as s3:
1890 self.assertEqual(s1.getsockname(), address)
1891 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001892
1893 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001894 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001895 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1896 s.bind(address)
1897 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001898
1899 def testNameOverflow(self):
1900 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001901 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1902 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001903
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001904
Victor Stinner45df8202010-04-28 22:31:17 +00001905@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001906class BufferIOTest(SocketConnectedTest):
1907 """
1908 Test the buffer versions of socket.recv() and socket.send().
1909 """
1910 def __init__(self, methodName='runTest'):
1911 SocketConnectedTest.__init__(self, methodName=methodName)
1912
Antoine Pitrou25480782010-03-17 22:50:28 +00001913 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001914 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001915 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001916 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001917 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001918 self.assertEqual(msg, MSG)
1919
Antoine Pitrou25480782010-03-17 22:50:28 +00001920 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001921 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001922 self.serv_conn.send(buf)
1923
Antoine Pitrou25480782010-03-17 22:50:28 +00001924 def testRecvIntoBytearray(self):
1925 buf = bytearray(1024)
1926 nbytes = self.cli_conn.recv_into(buf)
1927 self.assertEqual(nbytes, len(MSG))
1928 msg = buf[:len(MSG)]
1929 self.assertEqual(msg, MSG)
1930
1931 _testRecvIntoBytearray = _testRecvIntoArray
1932
1933 def testRecvIntoMemoryview(self):
1934 buf = bytearray(1024)
1935 nbytes = self.cli_conn.recv_into(memoryview(buf))
1936 self.assertEqual(nbytes, len(MSG))
1937 msg = buf[:len(MSG)]
1938 self.assertEqual(msg, MSG)
1939
1940 _testRecvIntoMemoryview = _testRecvIntoArray
1941
1942 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001943 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001944 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001945 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001946 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001947 self.assertEqual(msg, MSG)
1948
Antoine Pitrou25480782010-03-17 22:50:28 +00001949 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001950 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001951 self.serv_conn.send(buf)
1952
Antoine Pitrou25480782010-03-17 22:50:28 +00001953 def testRecvFromIntoBytearray(self):
1954 buf = bytearray(1024)
1955 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1956 self.assertEqual(nbytes, len(MSG))
1957 msg = buf[:len(MSG)]
1958 self.assertEqual(msg, MSG)
1959
1960 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1961
1962 def testRecvFromIntoMemoryview(self):
1963 buf = bytearray(1024)
1964 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1965 self.assertEqual(nbytes, len(MSG))
1966 msg = buf[:len(MSG)]
1967 self.assertEqual(msg, MSG)
1968
1969 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1970
Christian Heimes043d6f62008-01-07 17:19:16 +00001971
1972TIPC_STYPE = 2000
1973TIPC_LOWER = 200
1974TIPC_UPPER = 210
1975
1976def isTipcAvailable():
1977 """Check if the TIPC module is loaded
1978
1979 The TIPC module is not loaded automatically on Ubuntu and probably
1980 other Linux distros.
1981 """
1982 if not hasattr(socket, "AF_TIPC"):
1983 return False
1984 if not os.path.isfile("/proc/modules"):
1985 return False
1986 with open("/proc/modules") as f:
1987 for line in f:
1988 if line.startswith("tipc "):
1989 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001990 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001991 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1992 return False
1993
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001994class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00001995 def testRDM(self):
1996 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1997 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02001998 self.addCleanup(srv.close)
1999 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00002000
2001 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
2002 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
2003 TIPC_LOWER, TIPC_UPPER)
2004 srv.bind(srvaddr)
2005
2006 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
2007 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
2008 cli.sendto(MSG, sendaddr)
2009
2010 msg, recvaddr = srv.recvfrom(1024)
2011
2012 self.assertEqual(cli.getsockname(), recvaddr)
2013 self.assertEqual(msg, MSG)
2014
2015
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02002016class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00002017 def __init__(self, methodName = 'runTest'):
2018 unittest.TestCase.__init__(self, methodName = methodName)
2019 ThreadableTest.__init__(self)
2020
2021 def setUp(self):
2022 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02002023 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00002024 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
2025 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
2026 TIPC_LOWER, TIPC_UPPER)
2027 self.srv.bind(srvaddr)
2028 self.srv.listen(5)
2029 self.serverExplicitReady()
2030 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02002031 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00002032
2033 def clientSetUp(self):
2034 # The is a hittable race between serverExplicitReady() and the
2035 # accept() call; sleep a little while to avoid it, otherwise
2036 # we could get an exception
2037 time.sleep(0.1)
2038 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02002039 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00002040 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
2041 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
2042 self.cli.connect(addr)
2043 self.cliaddr = self.cli.getsockname()
2044
2045 def testStream(self):
2046 msg = self.conn.recv(1024)
2047 self.assertEqual(msg, MSG)
2048 self.assertEqual(self.cliaddr, self.connaddr)
2049
2050 def _testStream(self):
2051 self.cli.send(MSG)
2052 self.cli.close()
2053
2054
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002055@unittest.skipUnless(thread, 'Threading required for this test.')
2056class ContextManagersTest(ThreadedTCPSocketTest):
2057
2058 def _testSocketClass(self):
2059 # base test
2060 with socket.socket() as sock:
2061 self.assertFalse(sock._closed)
2062 self.assertTrue(sock._closed)
2063 # close inside with block
2064 with socket.socket() as sock:
2065 sock.close()
2066 self.assertTrue(sock._closed)
2067 # exception inside with block
2068 with socket.socket() as sock:
2069 self.assertRaises(socket.error, sock.sendall, b'foo')
2070 self.assertTrue(sock._closed)
2071
2072 def testCreateConnectionBase(self):
2073 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002074 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002075 data = conn.recv(1024)
2076 conn.sendall(data)
2077
2078 def _testCreateConnectionBase(self):
2079 address = self.serv.getsockname()
2080 with socket.create_connection(address) as sock:
2081 self.assertFalse(sock._closed)
2082 sock.sendall(b'foo')
2083 self.assertEqual(sock.recv(1024), b'foo')
2084 self.assertTrue(sock._closed)
2085
2086 def testCreateConnectionClose(self):
2087 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002088 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002089 data = conn.recv(1024)
2090 conn.sendall(data)
2091
2092 def _testCreateConnectionClose(self):
2093 address = self.serv.getsockname()
2094 with socket.create_connection(address) as sock:
2095 sock.close()
2096 self.assertTrue(sock._closed)
2097 self.assertRaises(socket.error, sock.sendall, b'foo')
2098
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002099
Antoine Pitroub1c54962010-10-14 15:05:38 +00002100@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
2101 "SOCK_CLOEXEC not defined")
2102@unittest.skipUnless(fcntl, "module fcntl not available")
2103class CloexecConstantTest(unittest.TestCase):
2104 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002105 v = linux_version()
2106 if v < (2, 6, 28):
2107 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2108 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00002109 with socket.socket(socket.AF_INET,
2110 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2111 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2112 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002113
2114
2115@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2116 "SOCK_NONBLOCK not defined")
2117class NonblockConstantTest(unittest.TestCase):
2118 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2119 if nonblock:
2120 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2121 self.assertEqual(s.gettimeout(), timeout)
2122 else:
2123 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2124 self.assertEqual(s.gettimeout(), None)
2125
2126 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00002127 v = linux_version()
2128 if v < (2, 6, 28):
2129 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
2130 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00002131 # a lot of it seems silly and redundant, but I wanted to test that
2132 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002133 with socket.socket(socket.AF_INET,
2134 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2135 self.checkNonblock(s)
2136 s.setblocking(1)
2137 self.checkNonblock(s, False)
2138 s.setblocking(0)
2139 self.checkNonblock(s)
2140 s.settimeout(None)
2141 self.checkNonblock(s, False)
2142 s.settimeout(2.0)
2143 self.checkNonblock(s, timeout=2.0)
2144 s.setblocking(1)
2145 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002146 # defaulttimeout
2147 t = socket.getdefaulttimeout()
2148 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002149 with socket.socket() as s:
2150 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002151 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002152 with socket.socket() as s:
2153 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002154 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002155 with socket.socket() as s:
2156 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002157 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002158 with socket.socket() as s:
2159 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002160 socket.setdefaulttimeout(t)
2161
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002162
Guido van Rossumb995eb72002-07-31 16:08:40 +00002163def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002164 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002165 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002166
2167 tests.extend([
2168 NonBlockingTCPTests,
2169 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002170 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002171 UnbufferedFileObjectClassTestCase,
2172 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002173 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002174 UnicodeReadFileObjectClassTestCase,
2175 UnicodeWriteFileObjectClassTestCase,
2176 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002177 NetworkConnectionNoServer,
2178 NetworkConnectionAttributesTest,
2179 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002180 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002181 CloexecConstantTest,
2182 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002183 ])
Dave Cole331708b2004-08-09 04:51:41 +00002184 if hasattr(socket, "socketpair"):
2185 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002186 if sys.platform == 'linux2':
2187 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002188 if isTipcAvailable():
2189 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002190 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002191
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002192 thread_info = support.threading_setup()
2193 support.run_unittest(*tests)
2194 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002195
2196if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002197 test_main()