blob: 99d658b7cbc6febe7a4c1446e2d6cd90a0a3ddc5 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Antoine Pitroub1c54962010-10-14 15:05:38 +000022try:
23 import fcntl
24except ImportError:
25 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000026
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000027def linux_version():
28 try:
29 # platform.release() is something like '2.6.33.7-desktop-2mnb'
30 version_string = platform.release().split('-')[0]
31 return tuple(map(int, version_string.split('.')))
32 except ValueError:
33 return 0, 0, 0
34
Benjamin Petersonee8712c2008-05-20 21:35:26 +000035HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000036MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
Victor Stinner45df8202010-04-28 22:31:17 +000038try:
39 import _thread as thread
40 import threading
41except ImportError:
42 thread = None
43 threading = None
44
Guido van Rossum24e4af82002-06-12 19:18:08 +000045class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000046
Guido van Rossum24e4af82002-06-12 19:18:08 +000047 def setUp(self):
48 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000049 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000050 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000051
Guido van Rossum24e4af82002-06-12 19:18:08 +000052 def tearDown(self):
53 self.serv.close()
54 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000055
Guido van Rossum24e4af82002-06-12 19:18:08 +000056class SocketUDPTest(unittest.TestCase):
57
58 def setUp(self):
59 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000060 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000061
62 def tearDown(self):
63 self.serv.close()
64 self.serv = None
65
66class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000067 """Threadable Test class
68
69 The ThreadableTest class makes it easy to create a threaded
70 client/server pair from an existing unit test. To create a
71 new threaded class from an existing unit test, use multiple
72 inheritance:
73
74 class NewClass (OldClass, ThreadableTest):
75 pass
76
77 This class defines two new fixture functions with obvious
78 purposes for overriding:
79
80 clientSetUp ()
81 clientTearDown ()
82
83 Any new test functions within the class must then define
84 tests in pairs, where the test name is preceeded with a
85 '_' to indicate the client portion of the test. Ex:
86
87 def testFoo(self):
88 # Server portion
89
90 def _testFoo(self):
91 # Client portion
92
93 Any exceptions raised by the clients during their tests
94 are caught and transferred to the main thread to alert
95 the testing framework.
96
97 Note, the server setup function cannot call any blocking
98 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000099 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000100 the blocking call (such as in setting up a client/server
101 connection and performing the accept() in setUp().
102 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000103
104 def __init__(self):
105 # Swap the true setup function
106 self.__setUp = self.setUp
107 self.__tearDown = self.tearDown
108 self.setUp = self._setUp
109 self.tearDown = self._tearDown
110
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 def serverExplicitReady(self):
112 """This method allows the server to explicitly indicate that
113 it wants the client thread to proceed. This is useful if the
114 server is about to execute a blocking routine that is
115 dependent upon the client thread during its setup routine."""
116 self.server_ready.set()
117
Guido van Rossum24e4af82002-06-12 19:18:08 +0000118 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000119 self.server_ready = threading.Event()
120 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000122 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123
124 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000125 methodname = self.id()
126 i = methodname.rfind('.')
127 methodname = methodname[i+1:]
128 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000129 self.client_thread = thread.start_new_thread(
130 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000131
132 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000133 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000134 self.server_ready.set()
135 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 def _tearDown(self):
138 self.__tearDown()
139 self.done.wait()
140
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000141 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000142 exc = self.queue.get()
143 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000144
145 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.wait()
147 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000149 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000150 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000151 try:
152 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000153 except BaseException as e:
154 self.queue.put(e)
155 finally:
156 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000157
158 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000159 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160
161 def clientTearDown(self):
162 self.done.set()
163 thread.exit()
164
165class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
166
167 def __init__(self, methodName='runTest'):
168 SocketTCPTest.__init__(self, methodName=methodName)
169 ThreadableTest.__init__(self)
170
171 def clientSetUp(self):
172 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
173
174 def clientTearDown(self):
175 self.cli.close()
176 self.cli = None
177 ThreadableTest.clientTearDown(self)
178
179class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
180
181 def __init__(self, methodName='runTest'):
182 SocketUDPTest.__init__(self, methodName=methodName)
183 ThreadableTest.__init__(self)
184
185 def clientSetUp(self):
186 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
187
Brian Curtin3beb38f2010-11-04 03:41:43 +0000188 def clientTearDown(self):
189 self.cli.close()
190 self.cli = None
191 ThreadableTest.clientTearDown(self)
192
Guido van Rossum24e4af82002-06-12 19:18:08 +0000193class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000194 """Socket tests for client-server connection.
195
196 self.cli_conn is a client socket connected to the server. The
197 setUp() method guarantees that it is connected to the server.
198 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000199
200 def __init__(self, methodName='runTest'):
201 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
202
203 def setUp(self):
204 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000205 # Indicate explicitly we're ready for the client thread to
206 # proceed and then perform the blocking call to accept
207 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000208 conn, addr = self.serv.accept()
209 self.cli_conn = conn
210
211 def tearDown(self):
212 self.cli_conn.close()
213 self.cli_conn = None
214 ThreadedTCPSocketTest.tearDown(self)
215
216 def clientSetUp(self):
217 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000218 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000219 self.serv_conn = self.cli
220
221 def clientTearDown(self):
222 self.serv_conn.close()
223 self.serv_conn = None
224 ThreadedTCPSocketTest.clientTearDown(self)
225
Dave Cole331708b2004-08-09 04:51:41 +0000226class SocketPairTest(unittest.TestCase, ThreadableTest):
227
228 def __init__(self, methodName='runTest'):
229 unittest.TestCase.__init__(self, methodName=methodName)
230 ThreadableTest.__init__(self)
231
232 def setUp(self):
233 self.serv, self.cli = socket.socketpair()
234
235 def tearDown(self):
236 self.serv.close()
237 self.serv = None
238
239 def clientSetUp(self):
240 pass
241
242 def clientTearDown(self):
243 self.cli.close()
244 self.cli = None
245 ThreadableTest.clientTearDown(self)
246
Tim Peters494aaee2004-08-09 18:54:11 +0000247
Guido van Rossum24e4af82002-06-12 19:18:08 +0000248#######################################################################
249## Begin Tests
250
251class GeneralModuleTests(unittest.TestCase):
252
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000253 def test_repr(self):
254 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000255 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000256 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000257
Raymond Hettinger027bb632004-05-31 03:09:25 +0000258 def test_weakref(self):
259 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
260 p = proxy(s)
261 self.assertEqual(p.fileno(), s.fileno())
262 s.close()
263 s = None
264 try:
265 p.fileno()
266 except ReferenceError:
267 pass
268 else:
269 self.fail('Socket proxy still exists')
270
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000272 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 def raise_error(*args, **kwargs):
274 raise socket.error
275 def raise_herror(*args, **kwargs):
276 raise socket.herror
277 def raise_gaierror(*args, **kwargs):
278 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000279 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000281 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000282 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000283 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000284 "Error raising socket exception.")
285
286 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000287 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288 socket.AF_INET
289 socket.SOCK_STREAM
290 socket.SOCK_DGRAM
291 socket.SOCK_RAW
292 socket.SOCK_RDM
293 socket.SOCK_SEQPACKET
294 socket.SOL_SOCKET
295 socket.SO_REUSEADDR
296
Guido van Rossum654c11e2002-06-13 20:24:17 +0000297 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000298 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000299 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000300 try:
301 ip = socket.gethostbyname(hostname)
302 except socket.error:
303 # Probably name lookup wasn't set up right; skip this test
304 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000305 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000306 try:
307 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
308 except socket.error:
309 # Probably a similar problem as above; skip this test
310 return
Brett Cannon01668a12005-03-11 00:04:17 +0000311 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000312 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000313 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000314 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000315
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000316 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
317 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
318 def test_sethostname(self):
319 oldhn = socket.gethostname()
320 try:
321 socket.sethostname('new')
322 except socket.error as e:
323 if e.errno == errno.EPERM:
324 self.skipTest("test should be run as root")
325 else:
326 raise
327 try:
328 # running test as root!
329 self.assertEqual(socket.gethostname(), 'new')
330 # Should work with bytes objects too
331 socket.sethostname(b'bar')
332 self.assertEqual(socket.gethostname(), 'bar')
333 finally:
334 socket.sethostname(oldhn)
335
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000336 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000337 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000338 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000339 try:
340 # On some versions, this loses a reference
341 orig = sys.getrefcount(__name__)
342 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000343 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000344 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000345 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000346
Guido van Rossum24e4af82002-06-12 19:18:08 +0000347 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000348 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000349 try:
350 # On some versions, this crashes the interpreter.
351 socket.getnameinfo(('x', 0, 0, 0), 0)
352 except socket.error:
353 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000354
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000355 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000356 # This just checks that htons etc. are their own inverse,
357 # when looking at the lower 16 or 32 bits.
358 sizes = {socket.htonl: 32, socket.ntohl: 32,
359 socket.htons: 16, socket.ntohs: 16}
360 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000361 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000362 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
363 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000364
Guido van Rossuma2627af2002-09-14 00:58:46 +0000365 swapped = func(mask)
366 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000367 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000368
Guido van Rossum018919a2007-01-15 00:07:32 +0000369 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000370 good_values = [ 1, 2, 3, 1, 2, 3 ]
371 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000372 for k in good_values:
373 socket.ntohl(k)
374 socket.ntohs(k)
375 socket.htonl(k)
376 socket.htons(k)
377 for k in bad_values:
378 self.assertRaises(OverflowError, socket.ntohl, k)
379 self.assertRaises(OverflowError, socket.ntohs, k)
380 self.assertRaises(OverflowError, socket.htonl, k)
381 self.assertRaises(OverflowError, socket.htons, k)
382
Barry Warsaw11b91a02004-06-28 00:50:43 +0000383 def testGetServBy(self):
384 eq = self.assertEqual
385 # Find one service that exists, then check all the related interfaces.
386 # I've ordered this by protocols that have both a tcp and udp
387 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000388 if (sys.platform.startswith('linux') or
389 sys.platform.startswith('freebsd') or
390 sys.platform.startswith('netbsd') or
391 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000392 # avoid the 'echo' service on this platform, as there is an
393 # assumption breaking non-standard port/protocol entry
394 services = ('daytime', 'qotd', 'domain')
395 else:
396 services = ('echo', 'daytime', 'domain')
397 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000398 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000399 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000400 break
401 except socket.error:
402 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000403 else:
404 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000405 # Try same call with optional protocol omitted
406 port2 = socket.getservbyname(service)
407 eq(port, port2)
408 # Try udp, but don't barf it it doesn't exist
409 try:
410 udpport = socket.getservbyname(service, 'udp')
411 except socket.error:
412 udpport = None
413 else:
414 eq(udpport, port)
415 # Now make sure the lookup by port returns the same service name
416 eq(socket.getservbyport(port2), service)
417 eq(socket.getservbyport(port, 'tcp'), service)
418 if udpport is not None:
419 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000420 # Make sure getservbyport does not accept out of range ports.
421 self.assertRaises(OverflowError, socket.getservbyport, -1)
422 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000423
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000424 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000425 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000426 # The default timeout should initially be None
427 self.assertEqual(socket.getdefaulttimeout(), None)
428 s = socket.socket()
429 self.assertEqual(s.gettimeout(), None)
430 s.close()
431
432 # Set the default timeout to 10, and see if it propagates
433 socket.setdefaulttimeout(10)
434 self.assertEqual(socket.getdefaulttimeout(), 10)
435 s = socket.socket()
436 self.assertEqual(s.gettimeout(), 10)
437 s.close()
438
439 # Reset the default timeout to None, and see if it propagates
440 socket.setdefaulttimeout(None)
441 self.assertEqual(socket.getdefaulttimeout(), None)
442 s = socket.socket()
443 self.assertEqual(s.gettimeout(), None)
444 s.close()
445
446 # Check that setting it to an invalid value raises ValueError
447 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
448
449 # Check that setting it to an invalid type raises TypeError
450 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
451
Benjamin Petersonf91df042009-02-13 02:50:59 +0000452 def testIPv4_inet_aton_fourbytes(self):
453 if not hasattr(socket, 'inet_aton'):
454 return # No inet_aton, nothing to check
455 # Test that issue1008086 and issue767150 are fixed.
456 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000457 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
458 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000459
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000460 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000461 if not hasattr(socket, 'inet_pton'):
462 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000463 from socket import inet_aton as f, inet_pton, AF_INET
464 g = lambda a: inet_pton(AF_INET, a)
465
Ezio Melottib3aedd42010-11-20 19:04:17 +0000466 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
467 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
468 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
469 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
470 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000471
Ezio Melottib3aedd42010-11-20 19:04:17 +0000472 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
473 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
474 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
475 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000476
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000477 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000478 if not hasattr(socket, 'inet_pton'):
479 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000480 try:
481 from socket import inet_pton, AF_INET6, has_ipv6
482 if not has_ipv6:
483 return
484 except ImportError:
485 return
486 f = lambda a: inet_pton(AF_INET6, a)
487
Ezio Melottib3aedd42010-11-20 19:04:17 +0000488 self.assertEqual(b'\x00' * 16, f('::'))
489 self.assertEqual(b'\x00' * 16, f('0::0'))
490 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
491 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000492 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 +0000493 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
494 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000495
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000496 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000497 if not hasattr(socket, 'inet_ntop'):
498 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000499 from socket import inet_ntoa as f, inet_ntop, AF_INET
500 g = lambda a: inet_ntop(AF_INET, a)
501
Ezio Melottib3aedd42010-11-20 19:04:17 +0000502 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
503 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
504 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
505 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000506
Ezio Melottib3aedd42010-11-20 19:04:17 +0000507 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
508 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
509 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000510
511 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000512 if not hasattr(socket, 'inet_ntop'):
513 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000514 try:
515 from socket import inet_ntop, AF_INET6, has_ipv6
516 if not has_ipv6:
517 return
518 except ImportError:
519 return
520 f = lambda a: inet_ntop(AF_INET6, a)
521
Ezio Melottib3aedd42010-11-20 19:04:17 +0000522 self.assertEqual('::', f(b'\x00' * 16))
523 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
524 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000525 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000526 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 +0000527 )
528
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000529 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000530
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000531 def _get_unused_port(self, bind_address='0.0.0.0'):
532 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000533
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000534 Args:
535 bind_address: Hostname or IP address to search for a port on.
536
537 Returns: A most likely to be unused port.
538 """
539 tempsock = socket.socket()
540 tempsock.bind((bind_address, 0))
541 host, port = tempsock.getsockname()
542 tempsock.close()
543 return port
544
545 def testSockName(self):
546 # Testing getsockname()
547 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000548 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000549 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000550 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000551 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000552 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
553 # it reasonable to get the host's addr in addition to 0.0.0.0.
554 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000555 try:
556 my_ip_addr = socket.gethostbyname(socket.gethostname())
557 except socket.error:
558 # Probably name lookup wasn't set up right; skip this test
559 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000560 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000561 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562
563 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000564 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565 # We know a socket should start without reuse==0
566 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000567 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000568 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000569 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000570
571 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000572 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000574 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
576 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000577 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000579 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000580 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000581 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
582 sock.settimeout(1)
583 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000584 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000585
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 def testNewAttributes(self):
587 # testing .family, .type and .protocol
588 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
589 self.assertEqual(sock.family, socket.AF_INET)
590 self.assertEqual(sock.type, socket.SOCK_STREAM)
591 self.assertEqual(sock.proto, 0)
592 sock.close()
593
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000594 def test_getsockaddrarg(self):
595 host = '0.0.0.0'
596 port = self._get_unused_port(bind_address=host)
597 big_port = port + 65536
598 neg_port = port - 65536
599 sock = socket.socket()
600 try:
601 self.assertRaises(OverflowError, sock.bind, (host, big_port))
602 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
603 sock.bind((host, port))
604 finally:
605 sock.close()
606
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000607 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000608 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000609 self.assertTrue(hasattr(socket.socket, 'ioctl'))
610 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
611 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
612 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000613 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
614 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000615 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000616 self.assertRaises(ValueError, s.ioctl, -1, None)
617 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000618
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000619 def testGetaddrinfo(self):
620 try:
621 socket.getaddrinfo('localhost', 80)
622 except socket.gaierror as err:
623 if err.errno == socket.EAI_SERVICE:
624 # see http://bugs.python.org/issue1282647
625 self.skipTest("buggy libc version")
626 raise
627 # len of every sequence is supposed to be == 5
628 for info in socket.getaddrinfo(HOST, None):
629 self.assertEqual(len(info), 5)
630 # host can be a domain name, a string representation of an
631 # IPv4/v6 address or None
632 socket.getaddrinfo('localhost', 80)
633 socket.getaddrinfo('127.0.0.1', 80)
634 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200635 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000636 socket.getaddrinfo('::1', 80)
637 # port can be a string service name such as "http", a numeric
638 # port number or None
639 socket.getaddrinfo(HOST, "http")
640 socket.getaddrinfo(HOST, 80)
641 socket.getaddrinfo(HOST, None)
642 # test family and socktype filters
643 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
644 for family, _, _, _, _ in infos:
645 self.assertEqual(family, socket.AF_INET)
646 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
647 for _, socktype, _, _, _ in infos:
648 self.assertEqual(socktype, socket.SOCK_STREAM)
649 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000650 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000651 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
652 # a server willing to support both IPv4 and IPv6 will
653 # usually do this
654 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
655 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000656 # test keyword arguments
657 a = socket.getaddrinfo(HOST, None)
658 b = socket.getaddrinfo(host=HOST, port=None)
659 self.assertEqual(a, b)
660 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
661 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
662 self.assertEqual(a, b)
663 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
664 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
665 self.assertEqual(a, b)
666 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
667 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
668 self.assertEqual(a, b)
669 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
670 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
671 self.assertEqual(a, b)
672 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
673 socket.AI_PASSIVE)
674 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
675 type=socket.SOCK_STREAM, proto=0,
676 flags=socket.AI_PASSIVE)
677 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000678 # Issue #6697.
679 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000680
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000681 def test_getnameinfo(self):
682 # only IP addresses are allowed
683 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
684
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000685 @unittest.skipUnless(support.is_resource_enabled('network'),
686 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000687 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000688 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000689 # these should all be successful
690 socket.gethostbyname('испытание.python.org')
691 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000692 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
693 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
694 # have a reverse entry yet
695 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000696
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000697 def check_sendall_interrupted(self, with_timeout):
698 # socketpair() is not stricly required, but it makes things easier.
699 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
700 self.skipTest("signal.alarm and socket.socketpair required for this test")
701 # Our signal handlers clobber the C errno by calling a math function
702 # with an invalid domain value.
703 def ok_handler(*args):
704 self.assertRaises(ValueError, math.acosh, 0)
705 def raising_handler(*args):
706 self.assertRaises(ValueError, math.acosh, 0)
707 1 // 0
708 c, s = socket.socketpair()
709 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
710 try:
711 if with_timeout:
712 # Just above the one second minimum for signal.alarm
713 c.settimeout(1.5)
714 with self.assertRaises(ZeroDivisionError):
715 signal.alarm(1)
716 c.sendall(b"x" * (1024**2))
717 if with_timeout:
718 signal.signal(signal.SIGALRM, ok_handler)
719 signal.alarm(1)
720 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
721 finally:
722 signal.signal(signal.SIGALRM, old_alarm)
723 c.close()
724 s.close()
725
726 def test_sendall_interrupted(self):
727 self.check_sendall_interrupted(False)
728
729 def test_sendall_interrupted_with_timeout(self):
730 self.check_sendall_interrupted(True)
731
Antoine Pitroue033e062010-10-29 10:38:18 +0000732 def test_dealloc_warn(self):
733 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
734 r = repr(sock)
735 with self.assertWarns(ResourceWarning) as cm:
736 sock = None
737 support.gc_collect()
738 self.assertIn(r, str(cm.warning.args[0]))
739 # An open socket file object gets dereferenced after the socket
740 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
741 f = sock.makefile('rb')
742 r = repr(sock)
743 sock = None
744 support.gc_collect()
745 with self.assertWarns(ResourceWarning):
746 f = None
747 support.gc_collect()
748
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000749 def test_name_closed_socketio(self):
750 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
751 fp = sock.makefile("rb")
752 fp.close()
753 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
754
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100755 def test_pickle(self):
756 sock = socket.socket()
757 with sock:
758 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
759 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
760
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000761
Victor Stinner45df8202010-04-28 22:31:17 +0000762@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000763class BasicTCPTest(SocketConnectedTest):
764
765 def __init__(self, methodName='runTest'):
766 SocketConnectedTest.__init__(self, methodName=methodName)
767
768 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000769 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000770 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000771 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000772
773 def _testRecv(self):
774 self.serv_conn.send(MSG)
775
776 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000777 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778 seg1 = self.cli_conn.recv(len(MSG) - 3)
779 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000780 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000781 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782
783 def _testOverFlowRecv(self):
784 self.serv_conn.send(MSG)
785
786 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000789 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790
791 def _testRecvFrom(self):
792 self.serv_conn.send(MSG)
793
794 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000795 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000796 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
797 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000798 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000799 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800
801 def _testOverFlowRecvFrom(self):
802 self.serv_conn.send(MSG)
803
804 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000805 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000806 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000807 while 1:
808 read = self.cli_conn.recv(1024)
809 if not read:
810 break
Guido van Rossume531e292002-08-08 20:28:34 +0000811 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000812 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813
814 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000815 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816 self.serv_conn.sendall(big_chunk)
817
818 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000819 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 fd = self.cli_conn.fileno()
821 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000822 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000823 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000825 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826
827 def _testFromFd(self):
828 self.serv_conn.send(MSG)
829
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000830 def testDup(self):
831 # Testing dup()
832 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000833 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000834 msg = sock.recv(1024)
835 self.assertEqual(msg, MSG)
836
837 def _testDup(self):
838 self.serv_conn.send(MSG)
839
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000841 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000842 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000843 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000844 # wait for _testShutdown to finish: on OS X, when the server
845 # closes the connection the client also becomes disconnected,
846 # and the client's shutdown call will fail. (Issue #4397.)
847 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848
849 def _testShutdown(self):
850 self.serv_conn.send(MSG)
851 self.serv_conn.shutdown(2)
852
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000853 def testDetach(self):
854 # Testing detach()
855 fileno = self.cli_conn.fileno()
856 f = self.cli_conn.detach()
857 self.assertEqual(f, fileno)
858 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000859 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
860 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000861 # ...but we can create another socket using the (still open)
862 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000863 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000864 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000865 msg = sock.recv(1024)
866 self.assertEqual(msg, MSG)
867
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000868 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000869 self.serv_conn.send(MSG)
870
Victor Stinner45df8202010-04-28 22:31:17 +0000871@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872class BasicUDPTest(ThreadedUDPSocketTest):
873
874 def __init__(self, methodName='runTest'):
875 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
876
877 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000880 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000881
882 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000883 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884
Guido van Rossum1c938012002-06-12 21:17:20 +0000885 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000886 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000888 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889
Guido van Rossum1c938012002-06-12 21:17:20 +0000890 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000891 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892
Guido van Rossumd8faa362007-04-27 19:54:29 +0000893 def testRecvFromNegative(self):
894 # Negative lengths passed to recvfrom should give ValueError.
895 self.assertRaises(ValueError, self.serv.recvfrom, -1)
896
897 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000898 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000899
Victor Stinner45df8202010-04-28 22:31:17 +0000900@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000901class TCPCloserTest(ThreadedTCPSocketTest):
902
903 def testClose(self):
904 conn, addr = self.serv.accept()
905 conn.close()
906
907 sd = self.cli
908 read, write, err = select.select([sd], [], [], 1.0)
909 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000910 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000911
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000912 # Calling close() many times should be safe.
913 conn.close()
914 conn.close()
915
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000916 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000917 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000918 time.sleep(1.0)
919
Victor Stinner45df8202010-04-28 22:31:17 +0000920@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000921class BasicSocketPairTest(SocketPairTest):
922
923 def __init__(self, methodName='runTest'):
924 SocketPairTest.__init__(self, methodName=methodName)
925
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000926 def _check_defaults(self, sock):
927 self.assertIsInstance(sock, socket.socket)
928 if hasattr(socket, 'AF_UNIX'):
929 self.assertEqual(sock.family, socket.AF_UNIX)
930 else:
931 self.assertEqual(sock.family, socket.AF_INET)
932 self.assertEqual(sock.type, socket.SOCK_STREAM)
933 self.assertEqual(sock.proto, 0)
934
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000935 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000936 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000937
938 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000939 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000940
Dave Cole331708b2004-08-09 04:51:41 +0000941 def testRecv(self):
942 msg = self.serv.recv(1024)
943 self.assertEqual(msg, MSG)
944
945 def _testRecv(self):
946 self.cli.send(MSG)
947
948 def testSend(self):
949 self.serv.send(MSG)
950
951 def _testSend(self):
952 msg = self.cli.recv(1024)
953 self.assertEqual(msg, MSG)
954
Victor Stinner45df8202010-04-28 22:31:17 +0000955@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000956class NonBlockingTCPTests(ThreadedTCPSocketTest):
957
958 def __init__(self, methodName='runTest'):
959 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
960
961 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000962 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000963 self.serv.setblocking(0)
964 start = time.time()
965 try:
966 self.serv.accept()
967 except socket.error:
968 pass
969 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000970 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000971
972 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000973 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000974
Antoine Pitroub1c54962010-10-14 15:05:38 +0000975 if hasattr(socket, "SOCK_NONBLOCK"):
976 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000977 v = linux_version()
978 if v < (2, 6, 28):
979 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
980 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +0000981 # reinit server socket
982 self.serv.close()
983 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000984 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000985 self.port = support.bind_port(self.serv)
986 self.serv.listen(1)
987 # actual testing
988 start = time.time()
989 try:
990 self.serv.accept()
991 except socket.error:
992 pass
993 end = time.time()
994 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
995
996 def _testInitNonBlocking(self):
997 pass
998
Antoine Pitrou600232b2011-01-05 21:03:42 +0000999 def testInheritFlags(self):
1000 # Issue #7995: when calling accept() on a listening socket with a
1001 # timeout, the resulting socket should not be non-blocking.
1002 self.serv.settimeout(10)
1003 try:
1004 conn, addr = self.serv.accept()
1005 message = conn.recv(len(MSG))
1006 finally:
1007 conn.close()
1008 self.serv.settimeout(None)
1009
1010 def _testInheritFlags(self):
1011 time.sleep(0.1)
1012 self.cli.connect((HOST, self.port))
1013 time.sleep(0.5)
1014 self.cli.send(MSG)
1015
Guido van Rossum24e4af82002-06-12 19:18:08 +00001016 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001017 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001018 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001019 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001020 conn, addr = self.serv.accept()
1021 except socket.error:
1022 pass
1023 else:
1024 self.fail("Error trying to do non-blocking accept.")
1025 read, write, err = select.select([self.serv], [], [])
1026 if self.serv in read:
1027 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001028 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001029 else:
1030 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001031
Guido van Rossum24e4af82002-06-12 19:18:08 +00001032 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001033 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001034 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001035
1036 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001037 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001038 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001039 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001040
1041 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001042 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001043 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001044
1045 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001046 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001047 conn, addr = self.serv.accept()
1048 conn.setblocking(0)
1049 try:
1050 msg = conn.recv(len(MSG))
1051 except socket.error:
1052 pass
1053 else:
1054 self.fail("Error trying to do non-blocking recv.")
1055 read, write, err = select.select([conn], [], [])
1056 if conn in read:
1057 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001058 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001059 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001060 else:
1061 self.fail("Error during select call to non-blocking socket.")
1062
1063 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001064 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001065 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066 self.cli.send(MSG)
1067
Victor Stinner45df8202010-04-28 22:31:17 +00001068@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001069class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001070 """Unit tests for the object returned by socket.makefile()
1071
Antoine Pitrou834bd812010-10-13 16:17:14 +00001072 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001073 the client connection. You can read from this file to
1074 get output from the server.
1075
Antoine Pitrou834bd812010-10-13 16:17:14 +00001076 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001077 server connection. You can write to this file to send output
1078 to the client.
1079 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001080
Guido van Rossume9f66142002-08-07 15:46:19 +00001081 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001082 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001083 errors = 'strict'
1084 newline = None
1085
1086 read_mode = 'rb'
1087 read_msg = MSG
1088 write_mode = 'wb'
1089 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001090
Guido van Rossum24e4af82002-06-12 19:18:08 +00001091 def __init__(self, methodName='runTest'):
1092 SocketConnectedTest.__init__(self, methodName=methodName)
1093
1094 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001095 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1096 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001098 self.read_file = self.cli_conn.makefile(
1099 self.read_mode, self.bufsize,
1100 encoding = self.encoding,
1101 errors = self.errors,
1102 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001103
1104 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001105 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001106 self.read_file.close()
1107 self.assertTrue(self.read_file.closed)
1108 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001109 SocketConnectedTest.tearDown(self)
1110
1111 def clientSetUp(self):
1112 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001113 self.write_file = self.serv_conn.makefile(
1114 self.write_mode, self.bufsize,
1115 encoding = self.encoding,
1116 errors = self.errors,
1117 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001118
1119 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001120 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001121 self.write_file.close()
1122 self.assertTrue(self.write_file.closed)
1123 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001124 SocketConnectedTest.clientTearDown(self)
1125
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001126 def testReadAfterTimeout(self):
1127 # Issue #7322: A file object must disallow further reads
1128 # after a timeout has occurred.
1129 self.cli_conn.settimeout(1)
1130 self.read_file.read(3)
1131 # First read raises a timeout
1132 self.assertRaises(socket.timeout, self.read_file.read, 1)
1133 # Second read is disallowed
1134 with self.assertRaises(IOError) as ctx:
1135 self.read_file.read(1)
1136 self.assertIn("cannot read from timed out object", str(ctx.exception))
1137
1138 def _testReadAfterTimeout(self):
1139 self.write_file.write(self.write_msg[0:3])
1140 self.write_file.flush()
1141 self.serv_finished.wait()
1142
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001144 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001145 first_seg = self.read_file.read(len(self.read_msg)-3)
1146 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001147 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001148 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001149
1150 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001151 self.write_file.write(self.write_msg)
1152 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001153
Guido van Rossum8c943832002-08-08 01:00:28 +00001154 def testFullRead(self):
1155 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001156 msg = self.read_file.read()
1157 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001158
1159 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001160 self.write_file.write(self.write_msg)
1161 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001162
Guido van Rossum24e4af82002-06-12 19:18:08 +00001163 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001164 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001165 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001166 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001167 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001168 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001169 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001170 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001171 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001172
1173 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001174 self.write_file.write(self.write_msg)
1175 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001176
1177 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001178 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001179 line = self.read_file.readline()
1180 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001181
1182 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001183 self.write_file.write(self.write_msg)
1184 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001185
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001186 def testCloseAfterMakefile(self):
1187 # The file returned by makefile should keep the socket open.
1188 self.cli_conn.close()
1189 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001190 msg = self.read_file.read()
1191 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001192
1193 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001194 self.write_file.write(self.write_msg)
1195 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001196
1197 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001198 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001199 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001200 if isinstance(self.read_msg, str):
1201 msg = msg.decode()
1202 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001203
1204 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001205 self.write_file.write(self.write_msg)
1206 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001207
Tim Peters116d83c2004-03-28 02:20:45 +00001208 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001209 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001210
1211 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001212 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001213
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001214 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001215 self.assertEqual(self.read_file.mode, self.read_mode)
1216 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001217
1218 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001219 self.assertEqual(self.write_file.mode, self.write_mode)
1220 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001221
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001222 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001223 self.read_file.close()
1224 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001225 self.cli_conn.close()
1226 self.assertRaises(socket.error, self.cli_conn.getsockname)
1227
1228 def _testRealClose(self):
1229 pass
1230
1231
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001232class FileObjectInterruptedTestCase(unittest.TestCase):
1233 """Test that the file object correctly handles EINTR internally."""
1234
1235 class MockSocket(object):
1236 def __init__(self, recv_funcs=()):
1237 # A generator that returns callables that we'll call for each
1238 # call to recv().
1239 self._recv_step = iter(recv_funcs)
1240
1241 def recv_into(self, buffer):
1242 data = next(self._recv_step)()
1243 assert len(buffer) >= len(data)
1244 buffer[:len(data)] = data
1245 return len(data)
1246
1247 def _decref_socketios(self):
1248 pass
1249
1250 def _textiowrap_for_test(self, buffering=-1):
1251 raw = socket.SocketIO(self, "r")
1252 if buffering < 0:
1253 buffering = io.DEFAULT_BUFFER_SIZE
1254 if buffering == 0:
1255 return raw
1256 buffer = io.BufferedReader(raw, buffering)
1257 text = io.TextIOWrapper(buffer, None, None)
1258 text.mode = "rb"
1259 return text
1260
1261 @staticmethod
1262 def _raise_eintr():
1263 raise socket.error(errno.EINTR)
1264
1265 def _textiowrap_mock_socket(self, mock, buffering=-1):
1266 raw = socket.SocketIO(mock, "r")
1267 if buffering < 0:
1268 buffering = io.DEFAULT_BUFFER_SIZE
1269 if buffering == 0:
1270 return raw
1271 buffer = io.BufferedReader(raw, buffering)
1272 text = io.TextIOWrapper(buffer, None, None)
1273 text.mode = "rb"
1274 return text
1275
1276 def _test_readline(self, size=-1, buffering=-1):
1277 mock_sock = self.MockSocket(recv_funcs=[
1278 lambda : b"This is the first line\nAnd the sec",
1279 self._raise_eintr,
1280 lambda : b"ond line is here\n",
1281 lambda : b"",
1282 lambda : b"", # XXX(gps): io library does an extra EOF read
1283 ])
1284 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001285 self.assertEqual(fo.readline(size), "This is the first line\n")
1286 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001287
1288 def _test_read(self, size=-1, buffering=-1):
1289 mock_sock = self.MockSocket(recv_funcs=[
1290 lambda : b"This is the first line\nAnd the sec",
1291 self._raise_eintr,
1292 lambda : b"ond line is here\n",
1293 lambda : b"",
1294 lambda : b"", # XXX(gps): io library does an extra EOF read
1295 ])
1296 expecting = (b"This is the first line\n"
1297 b"And the second line is here\n")
1298 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1299 if buffering == 0:
1300 data = b''
1301 else:
1302 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001303 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001304 while len(data) != len(expecting):
1305 part = fo.read(size)
1306 if not part:
1307 break
1308 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001309 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001310
1311 def test_default(self):
1312 self._test_readline()
1313 self._test_readline(size=100)
1314 self._test_read()
1315 self._test_read(size=100)
1316
1317 def test_with_1k_buffer(self):
1318 self._test_readline(buffering=1024)
1319 self._test_readline(size=100, buffering=1024)
1320 self._test_read(buffering=1024)
1321 self._test_read(size=100, buffering=1024)
1322
1323 def _test_readline_no_buffer(self, size=-1):
1324 mock_sock = self.MockSocket(recv_funcs=[
1325 lambda : b"a",
1326 lambda : b"\n",
1327 lambda : b"B",
1328 self._raise_eintr,
1329 lambda : b"b",
1330 lambda : b"",
1331 ])
1332 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001333 self.assertEqual(fo.readline(size), b"a\n")
1334 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001335
1336 def test_no_buffer(self):
1337 self._test_readline_no_buffer()
1338 self._test_readline_no_buffer(size=4)
1339 self._test_read(buffering=0)
1340 self._test_read(size=100, buffering=0)
1341
1342
Guido van Rossume9f66142002-08-07 15:46:19 +00001343class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1344
1345 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001346
Guido van Rossume9f66142002-08-07 15:46:19 +00001347 In this case (and in this case only), it should be possible to
1348 create a file object, read a line from it, create another file
1349 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001350 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001351 when reading multiple requests from the same socket."""
1352
1353 bufsize = 0 # Use unbuffered mode
1354
1355 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001356 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001357 line = self.read_file.readline() # first line
1358 self.assertEqual(line, b"A. " + self.write_msg) # first line
1359 self.read_file = self.cli_conn.makefile('rb', 0)
1360 line = self.read_file.readline() # second line
1361 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001362
1363 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001364 self.write_file.write(b"A. " + self.write_msg)
1365 self.write_file.write(b"B. " + self.write_msg)
1366 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001367
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001368 def testMakefileClose(self):
1369 # The file returned by makefile should keep the socket open...
1370 self.cli_conn.close()
1371 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001372 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001373 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001374 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001375 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1376
1377 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001378 self.write_file.write(self.write_msg)
1379 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001380
1381 def testMakefileCloseSocketDestroy(self):
1382 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001383 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001384 refcount_after = sys.getrefcount(self.cli_conn)
1385 self.assertEqual(refcount_before - 1, refcount_after)
1386
1387 def _testMakefileCloseSocketDestroy(self):
1388 pass
1389
Antoine Pitrou98b46702010-09-18 22:59:00 +00001390 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001391 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001392 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1393
1394 def testSmallReadNonBlocking(self):
1395 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001396 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1397 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001398 self.evt1.set()
1399 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001400 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001401 if first_seg is None:
1402 # Data not arrived (can happen under Windows), wait a bit
1403 time.sleep(0.5)
1404 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001405 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001406 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001407 self.assertEqual(n, 3)
1408 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001409 self.assertEqual(msg, self.read_msg)
1410 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1411 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001412
1413 def _testSmallReadNonBlocking(self):
1414 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001415 self.write_file.write(self.write_msg)
1416 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001417 self.evt2.set()
1418 # Avoid cloding the socket before the server test has finished,
1419 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1420 self.serv_finished.wait(5.0)
1421
1422 def testWriteNonBlocking(self):
1423 self.cli_finished.wait(5.0)
1424 # The client thread can't skip directly - the SkipTest exception
1425 # would appear as a failure.
1426 if self.serv_skipped:
1427 self.skipTest(self.serv_skipped)
1428
1429 def _testWriteNonBlocking(self):
1430 self.serv_skipped = None
1431 self.serv_conn.setblocking(False)
1432 # Try to saturate the socket buffer pipe with repeated large writes.
1433 BIG = b"x" * (1024 ** 2)
1434 LIMIT = 10
1435 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001436 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001437 self.assertGreater(n, 0)
1438 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001439 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001440 if n is None:
1441 # Succeeded
1442 break
1443 self.assertGreater(n, 0)
1444 else:
1445 # Let us know that this test didn't manage to establish
1446 # the expected conditions. This is not a failure in itself but,
1447 # if it happens repeatedly, the test should be fixed.
1448 self.serv_skipped = "failed to saturate the socket buffer"
1449
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001450
Guido van Rossum8c943832002-08-08 01:00:28 +00001451class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1452
1453 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1454
1455
1456class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1457
1458 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001459
Thomas Woutersb2137042007-02-01 18:02:27 +00001460
Antoine Pitrou834bd812010-10-13 16:17:14 +00001461class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1462 """Tests for socket.makefile() in text mode (rather than binary)"""
1463
1464 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001465 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001466 write_mode = 'wb'
1467 write_msg = MSG
1468 newline = ''
1469
1470
1471class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1472 """Tests for socket.makefile() in text mode (rather than binary)"""
1473
1474 read_mode = 'rb'
1475 read_msg = MSG
1476 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001477 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001478 newline = ''
1479
1480
1481class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1482 """Tests for socket.makefile() in text mode (rather than binary)"""
1483
1484 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001485 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001486 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001487 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001488 newline = ''
1489
1490
Guido van Rossumd8faa362007-04-27 19:54:29 +00001491class NetworkConnectionTest(object):
1492 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001493
Guido van Rossumd8faa362007-04-27 19:54:29 +00001494 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001495 # We're inherited below by BasicTCPTest2, which also inherits
1496 # BasicTCPTest, which defines self.port referenced below.
1497 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001498 self.serv_conn = self.cli
1499
1500class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1501 """Tests that NetworkConnection does not break existing TCP functionality.
1502 """
1503
1504class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001505
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001506 class MockSocket(socket.socket):
1507 def connect(self, *args):
1508 raise socket.timeout('timed out')
1509
1510 @contextlib.contextmanager
1511 def mocked_socket_module(self):
1512 """Return a socket which times out on connect"""
1513 old_socket = socket.socket
1514 socket.socket = self.MockSocket
1515 try:
1516 yield
1517 finally:
1518 socket.socket = old_socket
1519
1520 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001521 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001522 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001523 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001524 with self.assertRaises(socket.error) as cm:
1525 cli.connect((HOST, port))
1526 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1527
1528 def test_create_connection(self):
1529 # Issue #9792: errors raised by create_connection() should have
1530 # a proper errno attribute.
1531 port = support.find_unused_port()
1532 with self.assertRaises(socket.error) as cm:
1533 socket.create_connection((HOST, port))
1534 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1535
1536 def test_create_connection_timeout(self):
1537 # Issue #9792: create_connection() should not recast timeout errors
1538 # as generic socket errors.
1539 with self.mocked_socket_module():
1540 with self.assertRaises(socket.timeout):
1541 socket.create_connection((HOST, 1234))
1542
Guido van Rossumd8faa362007-04-27 19:54:29 +00001543
Victor Stinner45df8202010-04-28 22:31:17 +00001544@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001545class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1546
1547 def __init__(self, methodName='runTest'):
1548 SocketTCPTest.__init__(self, methodName=methodName)
1549 ThreadableTest.__init__(self)
1550
1551 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001552 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001553
1554 def clientTearDown(self):
1555 self.cli.close()
1556 self.cli = None
1557 ThreadableTest.clientTearDown(self)
1558
1559 def _justAccept(self):
1560 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001561 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001562
1563 testFamily = _justAccept
1564 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001565 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001566 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001567 self.assertEqual(self.cli.family, 2)
1568
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001569 testSourceAddress = _justAccept
1570 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001571 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1572 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001573 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001574 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001575 # The port number being used is sufficient to show that the bind()
1576 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001577
Guido van Rossumd8faa362007-04-27 19:54:29 +00001578 testTimeoutDefault = _justAccept
1579 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001580 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001581 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001582 socket.setdefaulttimeout(42)
1583 try:
1584 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001585 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001586 finally:
1587 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001588 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001589
1590 testTimeoutNone = _justAccept
1591 def _testTimeoutNone(self):
1592 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001593 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001594 socket.setdefaulttimeout(30)
1595 try:
1596 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001597 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001598 finally:
1599 socket.setdefaulttimeout(None)
1600 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601
1602 testTimeoutValueNamed = _justAccept
1603 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001604 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001605 self.assertEqual(self.cli.gettimeout(), 30)
1606
1607 testTimeoutValueNonamed = _justAccept
1608 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001609 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001610 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001611 self.assertEqual(self.cli.gettimeout(), 30)
1612
Victor Stinner45df8202010-04-28 22:31:17 +00001613@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001614class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1615
1616 def __init__(self, methodName='runTest'):
1617 SocketTCPTest.__init__(self, methodName=methodName)
1618 ThreadableTest.__init__(self)
1619
1620 def clientSetUp(self):
1621 pass
1622
1623 def clientTearDown(self):
1624 self.cli.close()
1625 self.cli = None
1626 ThreadableTest.clientTearDown(self)
1627
1628 def testInsideTimeout(self):
1629 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001630 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001631 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001632 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001633 testOutsideTimeout = testInsideTimeout
1634
1635 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001636 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001637 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001638 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001639
1640 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001641 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001642 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001643
1644
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001645class TCPTimeoutTest(SocketTCPTest):
1646
1647 def testTCPTimeout(self):
1648 def raise_timeout(*args, **kwargs):
1649 self.serv.settimeout(1.0)
1650 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001651 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001652 "Error generating a timeout exception (TCP)")
1653
1654 def testTimeoutZero(self):
1655 ok = False
1656 try:
1657 self.serv.settimeout(0.0)
1658 foo = self.serv.accept()
1659 except socket.timeout:
1660 self.fail("caught timeout instead of error (TCP)")
1661 except socket.error:
1662 ok = True
1663 except:
1664 self.fail("caught unexpected exception (TCP)")
1665 if not ok:
1666 self.fail("accept() returned success when we did not expect it")
1667
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001668 def testInterruptedTimeout(self):
1669 # XXX I don't know how to do this test on MSWindows or any other
1670 # plaform that doesn't support signal.alarm() or os.kill(), though
1671 # the bug should have existed on all platforms.
1672 if not hasattr(signal, "alarm"):
1673 return # can only test on *nix
1674 self.serv.settimeout(5.0) # must be longer than alarm
1675 class Alarm(Exception):
1676 pass
1677 def alarm_handler(signal, frame):
1678 raise Alarm
1679 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1680 try:
1681 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1682 try:
1683 foo = self.serv.accept()
1684 except socket.timeout:
1685 self.fail("caught timeout instead of Alarm")
1686 except Alarm:
1687 pass
1688 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001689 self.fail("caught other exception instead of Alarm:"
1690 " %s(%s):\n%s" %
1691 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001692 else:
1693 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001694 finally:
1695 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001696 except Alarm:
1697 self.fail("got Alarm in wrong place")
1698 finally:
1699 # no alarm can be pending. Safe to restore old handler.
1700 signal.signal(signal.SIGALRM, old_alarm)
1701
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001702class UDPTimeoutTest(SocketTCPTest):
1703
1704 def testUDPTimeout(self):
1705 def raise_timeout(*args, **kwargs):
1706 self.serv.settimeout(1.0)
1707 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001708 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001709 "Error generating a timeout exception (UDP)")
1710
1711 def testTimeoutZero(self):
1712 ok = False
1713 try:
1714 self.serv.settimeout(0.0)
1715 foo = self.serv.recv(1024)
1716 except socket.timeout:
1717 self.fail("caught timeout instead of error (UDP)")
1718 except socket.error:
1719 ok = True
1720 except:
1721 self.fail("caught unexpected exception (UDP)")
1722 if not ok:
1723 self.fail("recv() returned success when we did not expect it")
1724
1725class TestExceptions(unittest.TestCase):
1726
1727 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001728 self.assertTrue(issubclass(socket.error, Exception))
1729 self.assertTrue(issubclass(socket.herror, socket.error))
1730 self.assertTrue(issubclass(socket.gaierror, socket.error))
1731 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001732
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001733class TestLinuxAbstractNamespace(unittest.TestCase):
1734
1735 UNIX_PATH_MAX = 108
1736
1737 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001738 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001739 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1740 s1.bind(address)
1741 s1.listen(1)
1742 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1743 s2.connect(s1.getsockname())
1744 with s1.accept()[0] as s3:
1745 self.assertEqual(s1.getsockname(), address)
1746 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001747
1748 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001749 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001750 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1751 s.bind(address)
1752 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001753
1754 def testNameOverflow(self):
1755 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001756 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1757 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001758
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001759
Victor Stinner45df8202010-04-28 22:31:17 +00001760@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001761class BufferIOTest(SocketConnectedTest):
1762 """
1763 Test the buffer versions of socket.recv() and socket.send().
1764 """
1765 def __init__(self, methodName='runTest'):
1766 SocketConnectedTest.__init__(self, methodName=methodName)
1767
Antoine Pitrou25480782010-03-17 22:50:28 +00001768 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001769 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001770 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001771 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001772 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001773 self.assertEqual(msg, MSG)
1774
Antoine Pitrou25480782010-03-17 22:50:28 +00001775 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001776 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001777 self.serv_conn.send(buf)
1778
Antoine Pitrou25480782010-03-17 22:50:28 +00001779 def testRecvIntoBytearray(self):
1780 buf = bytearray(1024)
1781 nbytes = self.cli_conn.recv_into(buf)
1782 self.assertEqual(nbytes, len(MSG))
1783 msg = buf[:len(MSG)]
1784 self.assertEqual(msg, MSG)
1785
1786 _testRecvIntoBytearray = _testRecvIntoArray
1787
1788 def testRecvIntoMemoryview(self):
1789 buf = bytearray(1024)
1790 nbytes = self.cli_conn.recv_into(memoryview(buf))
1791 self.assertEqual(nbytes, len(MSG))
1792 msg = buf[:len(MSG)]
1793 self.assertEqual(msg, MSG)
1794
1795 _testRecvIntoMemoryview = _testRecvIntoArray
1796
1797 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001798 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001799 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001800 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001801 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001802 self.assertEqual(msg, MSG)
1803
Antoine Pitrou25480782010-03-17 22:50:28 +00001804 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001805 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001806 self.serv_conn.send(buf)
1807
Antoine Pitrou25480782010-03-17 22:50:28 +00001808 def testRecvFromIntoBytearray(self):
1809 buf = bytearray(1024)
1810 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1811 self.assertEqual(nbytes, len(MSG))
1812 msg = buf[:len(MSG)]
1813 self.assertEqual(msg, MSG)
1814
1815 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1816
1817 def testRecvFromIntoMemoryview(self):
1818 buf = bytearray(1024)
1819 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1820 self.assertEqual(nbytes, len(MSG))
1821 msg = buf[:len(MSG)]
1822 self.assertEqual(msg, MSG)
1823
1824 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1825
Christian Heimes043d6f62008-01-07 17:19:16 +00001826
1827TIPC_STYPE = 2000
1828TIPC_LOWER = 200
1829TIPC_UPPER = 210
1830
1831def isTipcAvailable():
1832 """Check if the TIPC module is loaded
1833
1834 The TIPC module is not loaded automatically on Ubuntu and probably
1835 other Linux distros.
1836 """
1837 if not hasattr(socket, "AF_TIPC"):
1838 return False
1839 if not os.path.isfile("/proc/modules"):
1840 return False
1841 with open("/proc/modules") as f:
1842 for line in f:
1843 if line.startswith("tipc "):
1844 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001845 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001846 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1847 return False
1848
1849class TIPCTest (unittest.TestCase):
1850 def testRDM(self):
1851 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1852 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1853
1854 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1855 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1856 TIPC_LOWER, TIPC_UPPER)
1857 srv.bind(srvaddr)
1858
1859 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1860 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1861 cli.sendto(MSG, sendaddr)
1862
1863 msg, recvaddr = srv.recvfrom(1024)
1864
1865 self.assertEqual(cli.getsockname(), recvaddr)
1866 self.assertEqual(msg, MSG)
1867
1868
1869class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1870 def __init__(self, methodName = 'runTest'):
1871 unittest.TestCase.__init__(self, methodName = methodName)
1872 ThreadableTest.__init__(self)
1873
1874 def setUp(self):
1875 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1876 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1877 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1878 TIPC_LOWER, TIPC_UPPER)
1879 self.srv.bind(srvaddr)
1880 self.srv.listen(5)
1881 self.serverExplicitReady()
1882 self.conn, self.connaddr = self.srv.accept()
1883
1884 def clientSetUp(self):
1885 # The is a hittable race between serverExplicitReady() and the
1886 # accept() call; sleep a little while to avoid it, otherwise
1887 # we could get an exception
1888 time.sleep(0.1)
1889 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1890 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1891 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1892 self.cli.connect(addr)
1893 self.cliaddr = self.cli.getsockname()
1894
1895 def testStream(self):
1896 msg = self.conn.recv(1024)
1897 self.assertEqual(msg, MSG)
1898 self.assertEqual(self.cliaddr, self.connaddr)
1899
1900 def _testStream(self):
1901 self.cli.send(MSG)
1902 self.cli.close()
1903
1904
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001905@unittest.skipUnless(thread, 'Threading required for this test.')
1906class ContextManagersTest(ThreadedTCPSocketTest):
1907
1908 def _testSocketClass(self):
1909 # base test
1910 with socket.socket() as sock:
1911 self.assertFalse(sock._closed)
1912 self.assertTrue(sock._closed)
1913 # close inside with block
1914 with socket.socket() as sock:
1915 sock.close()
1916 self.assertTrue(sock._closed)
1917 # exception inside with block
1918 with socket.socket() as sock:
1919 self.assertRaises(socket.error, sock.sendall, b'foo')
1920 self.assertTrue(sock._closed)
1921
1922 def testCreateConnectionBase(self):
1923 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001924 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001925 data = conn.recv(1024)
1926 conn.sendall(data)
1927
1928 def _testCreateConnectionBase(self):
1929 address = self.serv.getsockname()
1930 with socket.create_connection(address) as sock:
1931 self.assertFalse(sock._closed)
1932 sock.sendall(b'foo')
1933 self.assertEqual(sock.recv(1024), b'foo')
1934 self.assertTrue(sock._closed)
1935
1936 def testCreateConnectionClose(self):
1937 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001938 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001939 data = conn.recv(1024)
1940 conn.sendall(data)
1941
1942 def _testCreateConnectionClose(self):
1943 address = self.serv.getsockname()
1944 with socket.create_connection(address) as sock:
1945 sock.close()
1946 self.assertTrue(sock._closed)
1947 self.assertRaises(socket.error, sock.sendall, b'foo')
1948
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001949
Antoine Pitroub1c54962010-10-14 15:05:38 +00001950@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1951 "SOCK_CLOEXEC not defined")
1952@unittest.skipUnless(fcntl, "module fcntl not available")
1953class CloexecConstantTest(unittest.TestCase):
1954 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001955 v = linux_version()
1956 if v < (2, 6, 28):
1957 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1958 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00001959 with socket.socket(socket.AF_INET,
1960 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
1961 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1962 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001963
1964
1965@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1966 "SOCK_NONBLOCK not defined")
1967class NonblockConstantTest(unittest.TestCase):
1968 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1969 if nonblock:
1970 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1971 self.assertEqual(s.gettimeout(), timeout)
1972 else:
1973 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1974 self.assertEqual(s.gettimeout(), None)
1975
1976 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001977 v = linux_version()
1978 if v < (2, 6, 28):
1979 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1980 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001981 # a lot of it seems silly and redundant, but I wanted to test that
1982 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00001983 with socket.socket(socket.AF_INET,
1984 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
1985 self.checkNonblock(s)
1986 s.setblocking(1)
1987 self.checkNonblock(s, False)
1988 s.setblocking(0)
1989 self.checkNonblock(s)
1990 s.settimeout(None)
1991 self.checkNonblock(s, False)
1992 s.settimeout(2.0)
1993 self.checkNonblock(s, timeout=2.0)
1994 s.setblocking(1)
1995 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001996 # defaulttimeout
1997 t = socket.getdefaulttimeout()
1998 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001999 with socket.socket() as s:
2000 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002001 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002002 with socket.socket() as s:
2003 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002004 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002005 with socket.socket() as s:
2006 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002007 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002008 with socket.socket() as s:
2009 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002010 socket.setdefaulttimeout(t)
2011
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002012
Guido van Rossumb995eb72002-07-31 16:08:40 +00002013def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002014 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002015 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002016
2017 tests.extend([
2018 NonBlockingTCPTests,
2019 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002020 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002021 UnbufferedFileObjectClassTestCase,
2022 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002023 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002024 UnicodeReadFileObjectClassTestCase,
2025 UnicodeWriteFileObjectClassTestCase,
2026 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002027 NetworkConnectionNoServer,
2028 NetworkConnectionAttributesTest,
2029 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002030 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002031 CloexecConstantTest,
2032 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002033 ])
Dave Cole331708b2004-08-09 04:51:41 +00002034 if hasattr(socket, "socketpair"):
2035 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002036 if sys.platform == 'linux2':
2037 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002038 if isTipcAvailable():
2039 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002040 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002041
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002042 thread_info = support.threading_setup()
2043 support.run_unittest(*tests)
2044 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002045
2046if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002047 test_main()