blob: 6bdb6c919e70438acc7e4d68f4eb0b1817e36d72 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitroub1c54962010-10-14 15:05:38 +000021try:
22 import fcntl
23except ImportError:
24 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000026def try_address(host, port=0, family=socket.AF_INET):
27 """Try to bind a socket on the given host:port and return True
28 if that has been possible."""
29 try:
30 sock = socket.socket(family, socket.SOCK_STREAM)
31 sock.bind((host, port))
32 except (socket.error, socket.gaierror):
33 return False
34 else:
35 sock.close()
36 return True
37
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000038def linux_version():
39 try:
40 # platform.release() is something like '2.6.33.7-desktop-2mnb'
41 version_string = platform.release().split('-')[0]
42 return tuple(map(int, version_string.split('.')))
43 except ValueError:
44 return 0, 0, 0
45
Benjamin Petersonee8712c2008-05-20 21:35:26 +000046HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000047MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000048SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Victor Stinner45df8202010-04-28 22:31:17 +000050try:
51 import _thread as thread
52 import threading
53except ImportError:
54 thread = None
55 threading = None
56
Guido van Rossum24e4af82002-06-12 19:18:08 +000057class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000058
Guido van Rossum24e4af82002-06-12 19:18:08 +000059 def setUp(self):
60 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000061 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000062 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000063
Guido van Rossum24e4af82002-06-12 19:18:08 +000064 def tearDown(self):
65 self.serv.close()
66 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000067
Guido van Rossum24e4af82002-06-12 19:18:08 +000068class SocketUDPTest(unittest.TestCase):
69
70 def setUp(self):
71 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000072 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000073
74 def tearDown(self):
75 self.serv.close()
76 self.serv = None
77
78class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000079 """Threadable Test class
80
81 The ThreadableTest class makes it easy to create a threaded
82 client/server pair from an existing unit test. To create a
83 new threaded class from an existing unit test, use multiple
84 inheritance:
85
86 class NewClass (OldClass, ThreadableTest):
87 pass
88
89 This class defines two new fixture functions with obvious
90 purposes for overriding:
91
92 clientSetUp ()
93 clientTearDown ()
94
95 Any new test functions within the class must then define
96 tests in pairs, where the test name is preceeded with a
97 '_' to indicate the client portion of the test. Ex:
98
99 def testFoo(self):
100 # Server portion
101
102 def _testFoo(self):
103 # Client portion
104
105 Any exceptions raised by the clients during their tests
106 are caught and transferred to the main thread to alert
107 the testing framework.
108
109 Note, the server setup function cannot call any blocking
110 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 the blocking call (such as in setting up a client/server
113 connection and performing the accept() in setUp().
114 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def __init__(self):
117 # Swap the true setup function
118 self.__setUp = self.setUp
119 self.__tearDown = self.tearDown
120 self.setUp = self._setUp
121 self.tearDown = self._tearDown
122
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 def serverExplicitReady(self):
124 """This method allows the server to explicitly indicate that
125 it wants the client thread to proceed. This is useful if the
126 server is about to execute a blocking routine that is
127 dependent upon the client thread during its setup routine."""
128 self.server_ready.set()
129
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000131 self.server_ready = threading.Event()
132 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000134 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000137 methodname = self.id()
138 i = methodname.rfind('.')
139 methodname = methodname[i+1:]
140 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000141 self.client_thread = thread.start_new_thread(
142 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000145 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.set()
147 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148
149 def _tearDown(self):
150 self.__tearDown()
151 self.done.wait()
152
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000153 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000154 exc = self.queue.get()
155 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000158 self.server_ready.wait()
159 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000161 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000162 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000163 try:
164 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000165 except BaseException as e:
166 self.queue.put(e)
167 finally:
168 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000169
170 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000171 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172
173 def clientTearDown(self):
174 self.done.set()
175 thread.exit()
176
177class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
178
179 def __init__(self, methodName='runTest'):
180 SocketTCPTest.__init__(self, methodName=methodName)
181 ThreadableTest.__init__(self)
182
183 def clientSetUp(self):
184 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
185
186 def clientTearDown(self):
187 self.cli.close()
188 self.cli = None
189 ThreadableTest.clientTearDown(self)
190
191class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
192
193 def __init__(self, methodName='runTest'):
194 SocketUDPTest.__init__(self, methodName=methodName)
195 ThreadableTest.__init__(self)
196
197 def clientSetUp(self):
198 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
199
Brian Curtin3beb38f2010-11-04 03:41:43 +0000200 def clientTearDown(self):
201 self.cli.close()
202 self.cli = None
203 ThreadableTest.clientTearDown(self)
204
Guido van Rossum24e4af82002-06-12 19:18:08 +0000205class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000206 """Socket tests for client-server connection.
207
208 self.cli_conn is a client socket connected to the server. The
209 setUp() method guarantees that it is connected to the server.
210 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211
212 def __init__(self, methodName='runTest'):
213 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
214
215 def setUp(self):
216 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000217 # Indicate explicitly we're ready for the client thread to
218 # proceed and then perform the blocking call to accept
219 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000220 conn, addr = self.serv.accept()
221 self.cli_conn = conn
222
223 def tearDown(self):
224 self.cli_conn.close()
225 self.cli_conn = None
226 ThreadedTCPSocketTest.tearDown(self)
227
228 def clientSetUp(self):
229 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000230 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 self.serv_conn = self.cli
232
233 def clientTearDown(self):
234 self.serv_conn.close()
235 self.serv_conn = None
236 ThreadedTCPSocketTest.clientTearDown(self)
237
Dave Cole331708b2004-08-09 04:51:41 +0000238class SocketPairTest(unittest.TestCase, ThreadableTest):
239
240 def __init__(self, methodName='runTest'):
241 unittest.TestCase.__init__(self, methodName=methodName)
242 ThreadableTest.__init__(self)
243
244 def setUp(self):
245 self.serv, self.cli = socket.socketpair()
246
247 def tearDown(self):
248 self.serv.close()
249 self.serv = None
250
251 def clientSetUp(self):
252 pass
253
254 def clientTearDown(self):
255 self.cli.close()
256 self.cli = None
257 ThreadableTest.clientTearDown(self)
258
Tim Peters494aaee2004-08-09 18:54:11 +0000259
Guido van Rossum24e4af82002-06-12 19:18:08 +0000260#######################################################################
261## Begin Tests
262
263class GeneralModuleTests(unittest.TestCase):
264
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000265 def test_repr(self):
266 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000267 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000269
Raymond Hettinger027bb632004-05-31 03:09:25 +0000270 def test_weakref(self):
271 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
272 p = proxy(s)
273 self.assertEqual(p.fileno(), s.fileno())
274 s.close()
275 s = None
276 try:
277 p.fileno()
278 except ReferenceError:
279 pass
280 else:
281 self.fail('Socket proxy still exists')
282
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000284 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000285 def raise_error(*args, **kwargs):
286 raise socket.error
287 def raise_herror(*args, **kwargs):
288 raise socket.herror
289 def raise_gaierror(*args, **kwargs):
290 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000291 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000293 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000295 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296 "Error raising socket exception.")
297
298 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000299 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000300 socket.AF_INET
301 socket.SOCK_STREAM
302 socket.SOCK_DGRAM
303 socket.SOCK_RAW
304 socket.SOCK_RDM
305 socket.SOCK_SEQPACKET
306 socket.SOL_SOCKET
307 socket.SO_REUSEADDR
308
Guido van Rossum654c11e2002-06-13 20:24:17 +0000309 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000310 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000311 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000312 try:
313 ip = socket.gethostbyname(hostname)
314 except socket.error:
315 # Probably name lookup wasn't set up right; skip this test
316 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000317 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000318 try:
319 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
320 except socket.error:
321 # Probably a similar problem as above; skip this test
322 return
Brett Cannon01668a12005-03-11 00:04:17 +0000323 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000324 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000325 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000326 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000327
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000328 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000329 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000330 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331 try:
332 # On some versions, this loses a reference
333 orig = sys.getrefcount(__name__)
334 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000335 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000336 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000337 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000338
Guido van Rossum24e4af82002-06-12 19:18:08 +0000339 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000340 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000341 try:
342 # On some versions, this crashes the interpreter.
343 socket.getnameinfo(('x', 0, 0, 0), 0)
344 except socket.error:
345 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000346
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000347 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000348 # This just checks that htons etc. are their own inverse,
349 # when looking at the lower 16 or 32 bits.
350 sizes = {socket.htonl: 32, socket.ntohl: 32,
351 socket.htons: 16, socket.ntohs: 16}
352 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000353 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000354 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
355 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000356
Guido van Rossuma2627af2002-09-14 00:58:46 +0000357 swapped = func(mask)
358 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000359 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000360
Guido van Rossum018919a2007-01-15 00:07:32 +0000361 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000362 good_values = [ 1, 2, 3, 1, 2, 3 ]
363 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000364 for k in good_values:
365 socket.ntohl(k)
366 socket.ntohs(k)
367 socket.htonl(k)
368 socket.htons(k)
369 for k in bad_values:
370 self.assertRaises(OverflowError, socket.ntohl, k)
371 self.assertRaises(OverflowError, socket.ntohs, k)
372 self.assertRaises(OverflowError, socket.htonl, k)
373 self.assertRaises(OverflowError, socket.htons, k)
374
Barry Warsaw11b91a02004-06-28 00:50:43 +0000375 def testGetServBy(self):
376 eq = self.assertEqual
377 # Find one service that exists, then check all the related interfaces.
378 # I've ordered this by protocols that have both a tcp and udp
379 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000380 if (sys.platform.startswith('linux') or
381 sys.platform.startswith('freebsd') or
382 sys.platform.startswith('netbsd') or
383 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000384 # avoid the 'echo' service on this platform, as there is an
385 # assumption breaking non-standard port/protocol entry
386 services = ('daytime', 'qotd', 'domain')
387 else:
388 services = ('echo', 'daytime', 'domain')
389 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000390 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000391 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000392 break
393 except socket.error:
394 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000395 else:
396 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000397 # Try same call with optional protocol omitted
398 port2 = socket.getservbyname(service)
399 eq(port, port2)
400 # Try udp, but don't barf it it doesn't exist
401 try:
402 udpport = socket.getservbyname(service, 'udp')
403 except socket.error:
404 udpport = None
405 else:
406 eq(udpport, port)
407 # Now make sure the lookup by port returns the same service name
408 eq(socket.getservbyport(port2), service)
409 eq(socket.getservbyport(port, 'tcp'), service)
410 if udpport is not None:
411 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000412 # Make sure getservbyport does not accept out of range ports.
413 self.assertRaises(OverflowError, socket.getservbyport, -1)
414 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000415
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000416 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000417 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000418 # The default timeout should initially be None
419 self.assertEqual(socket.getdefaulttimeout(), None)
420 s = socket.socket()
421 self.assertEqual(s.gettimeout(), None)
422 s.close()
423
424 # Set the default timeout to 10, and see if it propagates
425 socket.setdefaulttimeout(10)
426 self.assertEqual(socket.getdefaulttimeout(), 10)
427 s = socket.socket()
428 self.assertEqual(s.gettimeout(), 10)
429 s.close()
430
431 # Reset the default timeout to None, and see if it propagates
432 socket.setdefaulttimeout(None)
433 self.assertEqual(socket.getdefaulttimeout(), None)
434 s = socket.socket()
435 self.assertEqual(s.gettimeout(), None)
436 s.close()
437
438 # Check that setting it to an invalid value raises ValueError
439 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
440
441 # Check that setting it to an invalid type raises TypeError
442 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
443
Benjamin Petersonf91df042009-02-13 02:50:59 +0000444 def testIPv4_inet_aton_fourbytes(self):
445 if not hasattr(socket, 'inet_aton'):
446 return # No inet_aton, nothing to check
447 # Test that issue1008086 and issue767150 are fixed.
448 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000449 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
450 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000451
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000452 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000453 if not hasattr(socket, 'inet_pton'):
454 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000455 from socket import inet_aton as f, inet_pton, AF_INET
456 g = lambda a: inet_pton(AF_INET, a)
457
Ezio Melottib3aedd42010-11-20 19:04:17 +0000458 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
459 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
460 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
461 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
462 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000463
Ezio Melottib3aedd42010-11-20 19:04:17 +0000464 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
465 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
466 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
467 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000468
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000469 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000470 if not hasattr(socket, 'inet_pton'):
471 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000472 try:
473 from socket import inet_pton, AF_INET6, has_ipv6
474 if not has_ipv6:
475 return
476 except ImportError:
477 return
478 f = lambda a: inet_pton(AF_INET6, a)
479
Ezio Melottib3aedd42010-11-20 19:04:17 +0000480 self.assertEqual(b'\x00' * 16, f('::'))
481 self.assertEqual(b'\x00' * 16, f('0::0'))
482 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
483 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000484 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 +0000485 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
486 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000487
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000488 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000489 if not hasattr(socket, 'inet_ntop'):
490 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000491 from socket import inet_ntoa as f, inet_ntop, AF_INET
492 g = lambda a: inet_ntop(AF_INET, a)
493
Ezio Melottib3aedd42010-11-20 19:04:17 +0000494 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
495 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
496 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
497 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000498
Ezio Melottib3aedd42010-11-20 19:04:17 +0000499 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
500 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
501 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000502
503 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000504 if not hasattr(socket, 'inet_ntop'):
505 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000506 try:
507 from socket import inet_ntop, AF_INET6, has_ipv6
508 if not has_ipv6:
509 return
510 except ImportError:
511 return
512 f = lambda a: inet_ntop(AF_INET6, a)
513
Ezio Melottib3aedd42010-11-20 19:04:17 +0000514 self.assertEqual('::', f(b'\x00' * 16))
515 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
516 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000517 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000518 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 +0000519 )
520
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000521 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000522
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000523 def _get_unused_port(self, bind_address='0.0.0.0'):
524 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000525
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000526 Args:
527 bind_address: Hostname or IP address to search for a port on.
528
529 Returns: A most likely to be unused port.
530 """
531 tempsock = socket.socket()
532 tempsock.bind((bind_address, 0))
533 host, port = tempsock.getsockname()
534 tempsock.close()
535 return port
536
537 def testSockName(self):
538 # Testing getsockname()
539 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000541 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000542 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000543 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000544 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
545 # it reasonable to get the host's addr in addition to 0.0.0.0.
546 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000547 try:
548 my_ip_addr = socket.gethostbyname(socket.gethostname())
549 except socket.error:
550 # Probably name lookup wasn't set up right; skip this test
551 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000552 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000553 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000554
555 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000556 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557 # We know a socket should start without reuse==0
558 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000559 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000561 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562
563 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000564 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000566 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000567 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
568 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000569 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000570
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000571 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000572 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000573 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
574 sock.settimeout(1)
575 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000576 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000577
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000578 def testNewAttributes(self):
579 # testing .family, .type and .protocol
580 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
581 self.assertEqual(sock.family, socket.AF_INET)
582 self.assertEqual(sock.type, socket.SOCK_STREAM)
583 self.assertEqual(sock.proto, 0)
584 sock.close()
585
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000586 def test_getsockaddrarg(self):
587 host = '0.0.0.0'
588 port = self._get_unused_port(bind_address=host)
589 big_port = port + 65536
590 neg_port = port - 65536
591 sock = socket.socket()
592 try:
593 self.assertRaises(OverflowError, sock.bind, (host, big_port))
594 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
595 sock.bind((host, port))
596 finally:
597 sock.close()
598
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000599 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000600 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000601 self.assertTrue(hasattr(socket.socket, 'ioctl'))
602 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
603 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
604 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000605 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
606 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000607 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000608 self.assertRaises(ValueError, s.ioctl, -1, None)
609 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000610
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000611 def testGetaddrinfo(self):
612 try:
613 socket.getaddrinfo('localhost', 80)
614 except socket.gaierror as err:
615 if err.errno == socket.EAI_SERVICE:
616 # see http://bugs.python.org/issue1282647
617 self.skipTest("buggy libc version")
618 raise
619 # len of every sequence is supposed to be == 5
620 for info in socket.getaddrinfo(HOST, None):
621 self.assertEqual(len(info), 5)
622 # host can be a domain name, a string representation of an
623 # IPv4/v6 address or None
624 socket.getaddrinfo('localhost', 80)
625 socket.getaddrinfo('127.0.0.1', 80)
626 socket.getaddrinfo(None, 80)
627 if SUPPORTS_IPV6:
628 socket.getaddrinfo('::1', 80)
629 # port can be a string service name such as "http", a numeric
630 # port number or None
631 socket.getaddrinfo(HOST, "http")
632 socket.getaddrinfo(HOST, 80)
633 socket.getaddrinfo(HOST, None)
634 # test family and socktype filters
635 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
636 for family, _, _, _, _ in infos:
637 self.assertEqual(family, socket.AF_INET)
638 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
639 for _, socktype, _, _, _ in infos:
640 self.assertEqual(socktype, socket.SOCK_STREAM)
641 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000642 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000643 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
644 # a server willing to support both IPv4 and IPv6 will
645 # usually do this
646 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
647 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000648 # test keyword arguments
649 a = socket.getaddrinfo(HOST, None)
650 b = socket.getaddrinfo(host=HOST, port=None)
651 self.assertEqual(a, b)
652 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
653 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
654 self.assertEqual(a, b)
655 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
656 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
657 self.assertEqual(a, b)
658 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
659 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
660 self.assertEqual(a, b)
661 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
662 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
663 self.assertEqual(a, b)
664 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
665 socket.AI_PASSIVE)
666 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
667 type=socket.SOCK_STREAM, proto=0,
668 flags=socket.AI_PASSIVE)
669 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000670 # Issue #6697.
671 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000672
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000673 def test_getnameinfo(self):
674 # only IP addresses are allowed
675 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
676
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000677 @unittest.skipUnless(support.is_resource_enabled('network'),
678 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000679 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000680 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000681 # these should all be successful
682 socket.gethostbyname('испытание.python.org')
683 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000684 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
685 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
686 # have a reverse entry yet
687 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000688
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000689 def check_sendall_interrupted(self, with_timeout):
690 # socketpair() is not stricly required, but it makes things easier.
691 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
692 self.skipTest("signal.alarm and socket.socketpair required for this test")
693 # Our signal handlers clobber the C errno by calling a math function
694 # with an invalid domain value.
695 def ok_handler(*args):
696 self.assertRaises(ValueError, math.acosh, 0)
697 def raising_handler(*args):
698 self.assertRaises(ValueError, math.acosh, 0)
699 1 // 0
700 c, s = socket.socketpair()
701 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
702 try:
703 if with_timeout:
704 # Just above the one second minimum for signal.alarm
705 c.settimeout(1.5)
706 with self.assertRaises(ZeroDivisionError):
707 signal.alarm(1)
708 c.sendall(b"x" * (1024**2))
709 if with_timeout:
710 signal.signal(signal.SIGALRM, ok_handler)
711 signal.alarm(1)
712 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
713 finally:
714 signal.signal(signal.SIGALRM, old_alarm)
715 c.close()
716 s.close()
717
718 def test_sendall_interrupted(self):
719 self.check_sendall_interrupted(False)
720
721 def test_sendall_interrupted_with_timeout(self):
722 self.check_sendall_interrupted(True)
723
Antoine Pitroue033e062010-10-29 10:38:18 +0000724 def test_dealloc_warn(self):
725 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
726 r = repr(sock)
727 with self.assertWarns(ResourceWarning) as cm:
728 sock = None
729 support.gc_collect()
730 self.assertIn(r, str(cm.warning.args[0]))
731 # An open socket file object gets dereferenced after the socket
732 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
733 f = sock.makefile('rb')
734 r = repr(sock)
735 sock = None
736 support.gc_collect()
737 with self.assertWarns(ResourceWarning):
738 f = None
739 support.gc_collect()
740
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000741
Victor Stinner45df8202010-04-28 22:31:17 +0000742@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743class BasicTCPTest(SocketConnectedTest):
744
745 def __init__(self, methodName='runTest'):
746 SocketConnectedTest.__init__(self, methodName=methodName)
747
748 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000749 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000751 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000752
753 def _testRecv(self):
754 self.serv_conn.send(MSG)
755
756 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000757 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758 seg1 = self.cli_conn.recv(len(MSG) - 3)
759 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000760 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000761 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762
763 def _testOverFlowRecv(self):
764 self.serv_conn.send(MSG)
765
766 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000769 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000770
771 def _testRecvFrom(self):
772 self.serv_conn.send(MSG)
773
774 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000775 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
777 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000778 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000779 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000780
781 def _testOverFlowRecvFrom(self):
782 self.serv_conn.send(MSG)
783
784 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000785 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000786 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787 while 1:
788 read = self.cli_conn.recv(1024)
789 if not read:
790 break
Guido van Rossume531e292002-08-08 20:28:34 +0000791 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000792 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793
794 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000795 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000796 self.serv_conn.sendall(big_chunk)
797
798 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000799 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800 fd = self.cli_conn.fileno()
801 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000802 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000803 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000804 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000805 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000806
807 def _testFromFd(self):
808 self.serv_conn.send(MSG)
809
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000810 def testDup(self):
811 # Testing dup()
812 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000813 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000814 msg = sock.recv(1024)
815 self.assertEqual(msg, MSG)
816
817 def _testDup(self):
818 self.serv_conn.send(MSG)
819
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000821 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000823 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000824 # wait for _testShutdown to finish: on OS X, when the server
825 # closes the connection the client also becomes disconnected,
826 # and the client's shutdown call will fail. (Issue #4397.)
827 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828
829 def _testShutdown(self):
830 self.serv_conn.send(MSG)
831 self.serv_conn.shutdown(2)
832
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000833 def testDetach(self):
834 # Testing detach()
835 fileno = self.cli_conn.fileno()
836 f = self.cli_conn.detach()
837 self.assertEqual(f, fileno)
838 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000839 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
840 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000841 # ...but we can create another socket using the (still open)
842 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000843 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000844 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000845 msg = sock.recv(1024)
846 self.assertEqual(msg, MSG)
847
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000848 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000849 self.serv_conn.send(MSG)
850
Victor Stinner45df8202010-04-28 22:31:17 +0000851@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852class BasicUDPTest(ThreadedUDPSocketTest):
853
854 def __init__(self, methodName='runTest'):
855 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
856
857 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000860 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861
862 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000863 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000864
Guido van Rossum1c938012002-06-12 21:17:20 +0000865 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000866 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000868 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869
Guido van Rossum1c938012002-06-12 21:17:20 +0000870 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000871 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872
Guido van Rossumd8faa362007-04-27 19:54:29 +0000873 def testRecvFromNegative(self):
874 # Negative lengths passed to recvfrom should give ValueError.
875 self.assertRaises(ValueError, self.serv.recvfrom, -1)
876
877 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000878 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000879
Victor Stinner45df8202010-04-28 22:31:17 +0000880@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000881class TCPCloserTest(ThreadedTCPSocketTest):
882
883 def testClose(self):
884 conn, addr = self.serv.accept()
885 conn.close()
886
887 sd = self.cli
888 read, write, err = select.select([sd], [], [], 1.0)
889 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000890 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000891
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000892 # Calling close() many times should be safe.
893 conn.close()
894 conn.close()
895
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000896 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000897 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000898 time.sleep(1.0)
899
Victor Stinner45df8202010-04-28 22:31:17 +0000900@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000901class BasicSocketPairTest(SocketPairTest):
902
903 def __init__(self, methodName='runTest'):
904 SocketPairTest.__init__(self, methodName=methodName)
905
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000906 def _check_defaults(self, sock):
907 self.assertIsInstance(sock, socket.socket)
908 if hasattr(socket, 'AF_UNIX'):
909 self.assertEqual(sock.family, socket.AF_UNIX)
910 else:
911 self.assertEqual(sock.family, socket.AF_INET)
912 self.assertEqual(sock.type, socket.SOCK_STREAM)
913 self.assertEqual(sock.proto, 0)
914
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000915 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000916 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000917
918 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000919 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000920
Dave Cole331708b2004-08-09 04:51:41 +0000921 def testRecv(self):
922 msg = self.serv.recv(1024)
923 self.assertEqual(msg, MSG)
924
925 def _testRecv(self):
926 self.cli.send(MSG)
927
928 def testSend(self):
929 self.serv.send(MSG)
930
931 def _testSend(self):
932 msg = self.cli.recv(1024)
933 self.assertEqual(msg, MSG)
934
Victor Stinner45df8202010-04-28 22:31:17 +0000935@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000936class NonBlockingTCPTests(ThreadedTCPSocketTest):
937
938 def __init__(self, methodName='runTest'):
939 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
940
941 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000942 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000943 self.serv.setblocking(0)
944 start = time.time()
945 try:
946 self.serv.accept()
947 except socket.error:
948 pass
949 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000950 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000951
952 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000953 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000954
Antoine Pitroub1c54962010-10-14 15:05:38 +0000955 if hasattr(socket, "SOCK_NONBLOCK"):
956 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000957 v = linux_version()
958 if v < (2, 6, 28):
959 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
960 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +0000961 # reinit server socket
962 self.serv.close()
963 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000964 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000965 self.port = support.bind_port(self.serv)
966 self.serv.listen(1)
967 # actual testing
968 start = time.time()
969 try:
970 self.serv.accept()
971 except socket.error:
972 pass
973 end = time.time()
974 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
975
976 def _testInitNonBlocking(self):
977 pass
978
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000980 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000981 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000982 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000983 conn, addr = self.serv.accept()
984 except socket.error:
985 pass
986 else:
987 self.fail("Error trying to do non-blocking accept.")
988 read, write, err = select.select([self.serv], [], [])
989 if self.serv in read:
990 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000991 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000992 else:
993 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000994
Guido van Rossum24e4af82002-06-12 19:18:08 +0000995 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000996 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000997 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000998
999 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001000 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001001 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001002 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001003
1004 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001005 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001006 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001007
1008 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001009 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001010 conn, addr = self.serv.accept()
1011 conn.setblocking(0)
1012 try:
1013 msg = conn.recv(len(MSG))
1014 except socket.error:
1015 pass
1016 else:
1017 self.fail("Error trying to do non-blocking recv.")
1018 read, write, err = select.select([conn], [], [])
1019 if conn in read:
1020 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001021 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001022 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001023 else:
1024 self.fail("Error during select call to non-blocking socket.")
1025
1026 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001027 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001028 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001029 self.cli.send(MSG)
1030
Victor Stinner45df8202010-04-28 22:31:17 +00001031@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001032class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001033 """Unit tests for the object returned by socket.makefile()
1034
Antoine Pitrou834bd812010-10-13 16:17:14 +00001035 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001036 the client connection. You can read from this file to
1037 get output from the server.
1038
Antoine Pitrou834bd812010-10-13 16:17:14 +00001039 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001040 server connection. You can write to this file to send output
1041 to the client.
1042 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001043
Guido van Rossume9f66142002-08-07 15:46:19 +00001044 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001045 encoding = 'utf8'
1046 errors = 'strict'
1047 newline = None
1048
1049 read_mode = 'rb'
1050 read_msg = MSG
1051 write_mode = 'wb'
1052 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001053
Guido van Rossum24e4af82002-06-12 19:18:08 +00001054 def __init__(self, methodName='runTest'):
1055 SocketConnectedTest.__init__(self, methodName=methodName)
1056
1057 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001058 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1059 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001060 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001061 self.read_file = self.cli_conn.makefile(
1062 self.read_mode, self.bufsize,
1063 encoding = self.encoding,
1064 errors = self.errors,
1065 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066
1067 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001068 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001069 self.read_file.close()
1070 self.assertTrue(self.read_file.closed)
1071 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001072 SocketConnectedTest.tearDown(self)
1073
1074 def clientSetUp(self):
1075 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001076 self.write_file = self.serv_conn.makefile(
1077 self.write_mode, self.bufsize,
1078 encoding = self.encoding,
1079 errors = self.errors,
1080 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001081
1082 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001083 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001084 self.write_file.close()
1085 self.assertTrue(self.write_file.closed)
1086 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001087 SocketConnectedTest.clientTearDown(self)
1088
1089 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001090 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001091 first_seg = self.read_file.read(len(self.read_msg)-3)
1092 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001093 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001094 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001095
1096 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001097 self.write_file.write(self.write_msg)
1098 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001099
Guido van Rossum8c943832002-08-08 01:00:28 +00001100 def testFullRead(self):
1101 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001102 msg = self.read_file.read()
1103 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001104
1105 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001106 self.write_file.write(self.write_msg)
1107 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001108
Guido van Rossum24e4af82002-06-12 19:18:08 +00001109 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001110 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001111 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001112 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001113 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001114 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001115 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001116 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001117 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001118
1119 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001120 self.write_file.write(self.write_msg)
1121 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001122
1123 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001124 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001125 line = self.read_file.readline()
1126 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001127
1128 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001129 self.write_file.write(self.write_msg)
1130 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001131
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001132 def testCloseAfterMakefile(self):
1133 # The file returned by makefile should keep the socket open.
1134 self.cli_conn.close()
1135 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001136 msg = self.read_file.read()
1137 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001138
1139 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001140 self.write_file.write(self.write_msg)
1141 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001142
1143 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001144 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001145 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001146 if isinstance(self.read_msg, str):
1147 msg = msg.decode()
1148 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001149
1150 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001151 self.write_file.write(self.write_msg)
1152 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001153
Tim Peters116d83c2004-03-28 02:20:45 +00001154 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001155 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001156
1157 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001158 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001159
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001160 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001161 self.assertEqual(self.read_file.mode, self.read_mode)
1162 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001163
1164 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001165 self.assertEqual(self.write_file.mode, self.write_mode)
1166 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001167
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001168 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001169 self.read_file.close()
1170 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001171 self.cli_conn.close()
1172 self.assertRaises(socket.error, self.cli_conn.getsockname)
1173
1174 def _testRealClose(self):
1175 pass
1176
1177
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001178class FileObjectInterruptedTestCase(unittest.TestCase):
1179 """Test that the file object correctly handles EINTR internally."""
1180
1181 class MockSocket(object):
1182 def __init__(self, recv_funcs=()):
1183 # A generator that returns callables that we'll call for each
1184 # call to recv().
1185 self._recv_step = iter(recv_funcs)
1186
1187 def recv_into(self, buffer):
1188 data = next(self._recv_step)()
1189 assert len(buffer) >= len(data)
1190 buffer[:len(data)] = data
1191 return len(data)
1192
1193 def _decref_socketios(self):
1194 pass
1195
1196 def _textiowrap_for_test(self, buffering=-1):
1197 raw = socket.SocketIO(self, "r")
1198 if buffering < 0:
1199 buffering = io.DEFAULT_BUFFER_SIZE
1200 if buffering == 0:
1201 return raw
1202 buffer = io.BufferedReader(raw, buffering)
1203 text = io.TextIOWrapper(buffer, None, None)
1204 text.mode = "rb"
1205 return text
1206
1207 @staticmethod
1208 def _raise_eintr():
1209 raise socket.error(errno.EINTR)
1210
1211 def _textiowrap_mock_socket(self, mock, buffering=-1):
1212 raw = socket.SocketIO(mock, "r")
1213 if buffering < 0:
1214 buffering = io.DEFAULT_BUFFER_SIZE
1215 if buffering == 0:
1216 return raw
1217 buffer = io.BufferedReader(raw, buffering)
1218 text = io.TextIOWrapper(buffer, None, None)
1219 text.mode = "rb"
1220 return text
1221
1222 def _test_readline(self, size=-1, buffering=-1):
1223 mock_sock = self.MockSocket(recv_funcs=[
1224 lambda : b"This is the first line\nAnd the sec",
1225 self._raise_eintr,
1226 lambda : b"ond line is here\n",
1227 lambda : b"",
1228 lambda : b"", # XXX(gps): io library does an extra EOF read
1229 ])
1230 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001231 self.assertEqual(fo.readline(size), "This is the first line\n")
1232 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001233
1234 def _test_read(self, size=-1, buffering=-1):
1235 mock_sock = self.MockSocket(recv_funcs=[
1236 lambda : b"This is the first line\nAnd the sec",
1237 self._raise_eintr,
1238 lambda : b"ond line is here\n",
1239 lambda : b"",
1240 lambda : b"", # XXX(gps): io library does an extra EOF read
1241 ])
1242 expecting = (b"This is the first line\n"
1243 b"And the second line is here\n")
1244 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1245 if buffering == 0:
1246 data = b''
1247 else:
1248 data = ''
1249 expecting = expecting.decode('utf8')
1250 while len(data) != len(expecting):
1251 part = fo.read(size)
1252 if not part:
1253 break
1254 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001255 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001256
1257 def test_default(self):
1258 self._test_readline()
1259 self._test_readline(size=100)
1260 self._test_read()
1261 self._test_read(size=100)
1262
1263 def test_with_1k_buffer(self):
1264 self._test_readline(buffering=1024)
1265 self._test_readline(size=100, buffering=1024)
1266 self._test_read(buffering=1024)
1267 self._test_read(size=100, buffering=1024)
1268
1269 def _test_readline_no_buffer(self, size=-1):
1270 mock_sock = self.MockSocket(recv_funcs=[
1271 lambda : b"a",
1272 lambda : b"\n",
1273 lambda : b"B",
1274 self._raise_eintr,
1275 lambda : b"b",
1276 lambda : b"",
1277 ])
1278 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001279 self.assertEqual(fo.readline(size), b"a\n")
1280 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001281
1282 def test_no_buffer(self):
1283 self._test_readline_no_buffer()
1284 self._test_readline_no_buffer(size=4)
1285 self._test_read(buffering=0)
1286 self._test_read(size=100, buffering=0)
1287
1288
Guido van Rossume9f66142002-08-07 15:46:19 +00001289class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1290
1291 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001292
Guido van Rossume9f66142002-08-07 15:46:19 +00001293 In this case (and in this case only), it should be possible to
1294 create a file object, read a line from it, create another file
1295 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001296 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001297 when reading multiple requests from the same socket."""
1298
1299 bufsize = 0 # Use unbuffered mode
1300
1301 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001302 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001303 line = self.read_file.readline() # first line
1304 self.assertEqual(line, b"A. " + self.write_msg) # first line
1305 self.read_file = self.cli_conn.makefile('rb', 0)
1306 line = self.read_file.readline() # second line
1307 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001308
1309 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001310 self.write_file.write(b"A. " + self.write_msg)
1311 self.write_file.write(b"B. " + self.write_msg)
1312 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001313
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001314 def testMakefileClose(self):
1315 # The file returned by makefile should keep the socket open...
1316 self.cli_conn.close()
1317 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001318 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001319 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001320 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001321 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1322
1323 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001324 self.write_file.write(self.write_msg)
1325 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001326
1327 def testMakefileCloseSocketDestroy(self):
1328 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001329 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001330 refcount_after = sys.getrefcount(self.cli_conn)
1331 self.assertEqual(refcount_before - 1, refcount_after)
1332
1333 def _testMakefileCloseSocketDestroy(self):
1334 pass
1335
Antoine Pitrou98b46702010-09-18 22:59:00 +00001336 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001337 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001338 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1339
1340 def testSmallReadNonBlocking(self):
1341 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001342 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1343 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001344 self.evt1.set()
1345 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001346 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001347 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001348 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001349 self.assertEqual(n, 3)
1350 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001351 self.assertEqual(msg, self.read_msg)
1352 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1353 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001354
1355 def _testSmallReadNonBlocking(self):
1356 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001357 self.write_file.write(self.write_msg)
1358 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001359 self.evt2.set()
1360 # Avoid cloding the socket before the server test has finished,
1361 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1362 self.serv_finished.wait(5.0)
1363
1364 def testWriteNonBlocking(self):
1365 self.cli_finished.wait(5.0)
1366 # The client thread can't skip directly - the SkipTest exception
1367 # would appear as a failure.
1368 if self.serv_skipped:
1369 self.skipTest(self.serv_skipped)
1370
1371 def _testWriteNonBlocking(self):
1372 self.serv_skipped = None
1373 self.serv_conn.setblocking(False)
1374 # Try to saturate the socket buffer pipe with repeated large writes.
1375 BIG = b"x" * (1024 ** 2)
1376 LIMIT = 10
1377 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001378 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001379 self.assertGreater(n, 0)
1380 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001381 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001382 if n is None:
1383 # Succeeded
1384 break
1385 self.assertGreater(n, 0)
1386 else:
1387 # Let us know that this test didn't manage to establish
1388 # the expected conditions. This is not a failure in itself but,
1389 # if it happens repeatedly, the test should be fixed.
1390 self.serv_skipped = "failed to saturate the socket buffer"
1391
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001392
Guido van Rossum8c943832002-08-08 01:00:28 +00001393class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1394
1395 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1396
1397
1398class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1399
1400 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001401
Thomas Woutersb2137042007-02-01 18:02:27 +00001402
Antoine Pitrou834bd812010-10-13 16:17:14 +00001403class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1404 """Tests for socket.makefile() in text mode (rather than binary)"""
1405
1406 read_mode = 'r'
1407 read_msg = MSG.decode('utf8')
1408 write_mode = 'wb'
1409 write_msg = MSG
1410 newline = ''
1411
1412
1413class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1414 """Tests for socket.makefile() in text mode (rather than binary)"""
1415
1416 read_mode = 'rb'
1417 read_msg = MSG
1418 write_mode = 'w'
1419 write_msg = MSG.decode('utf8')
1420 newline = ''
1421
1422
1423class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1424 """Tests for socket.makefile() in text mode (rather than binary)"""
1425
1426 read_mode = 'r'
1427 read_msg = MSG.decode('utf8')
1428 write_mode = 'w'
1429 write_msg = MSG.decode('utf8')
1430 newline = ''
1431
1432
Guido van Rossumd8faa362007-04-27 19:54:29 +00001433class NetworkConnectionTest(object):
1434 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001435
Guido van Rossumd8faa362007-04-27 19:54:29 +00001436 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001437 # We're inherited below by BasicTCPTest2, which also inherits
1438 # BasicTCPTest, which defines self.port referenced below.
1439 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001440 self.serv_conn = self.cli
1441
1442class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1443 """Tests that NetworkConnection does not break existing TCP functionality.
1444 """
1445
1446class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001447
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001448 class MockSocket(socket.socket):
1449 def connect(self, *args):
1450 raise socket.timeout('timed out')
1451
1452 @contextlib.contextmanager
1453 def mocked_socket_module(self):
1454 """Return a socket which times out on connect"""
1455 old_socket = socket.socket
1456 socket.socket = self.MockSocket
1457 try:
1458 yield
1459 finally:
1460 socket.socket = old_socket
1461
1462 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001463 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001464 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001465 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001466 with self.assertRaises(socket.error) as cm:
1467 cli.connect((HOST, port))
1468 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1469
1470 def test_create_connection(self):
1471 # Issue #9792: errors raised by create_connection() should have
1472 # a proper errno attribute.
1473 port = support.find_unused_port()
1474 with self.assertRaises(socket.error) as cm:
1475 socket.create_connection((HOST, port))
1476 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1477
1478 def test_create_connection_timeout(self):
1479 # Issue #9792: create_connection() should not recast timeout errors
1480 # as generic socket errors.
1481 with self.mocked_socket_module():
1482 with self.assertRaises(socket.timeout):
1483 socket.create_connection((HOST, 1234))
1484
Guido van Rossumd8faa362007-04-27 19:54:29 +00001485
Victor Stinner45df8202010-04-28 22:31:17 +00001486@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001487class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1488
1489 def __init__(self, methodName='runTest'):
1490 SocketTCPTest.__init__(self, methodName=methodName)
1491 ThreadableTest.__init__(self)
1492
1493 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001494 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001495
1496 def clientTearDown(self):
1497 self.cli.close()
1498 self.cli = None
1499 ThreadableTest.clientTearDown(self)
1500
1501 def _justAccept(self):
1502 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001503 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001504
1505 testFamily = _justAccept
1506 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001507 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001508 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001509 self.assertEqual(self.cli.family, 2)
1510
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001511 testSourceAddress = _justAccept
1512 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001513 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1514 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001515 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001516 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001517 # The port number being used is sufficient to show that the bind()
1518 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001519
Guido van Rossumd8faa362007-04-27 19:54:29 +00001520 testTimeoutDefault = _justAccept
1521 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001522 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001523 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001524 socket.setdefaulttimeout(42)
1525 try:
1526 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001527 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001528 finally:
1529 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001530 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001531
1532 testTimeoutNone = _justAccept
1533 def _testTimeoutNone(self):
1534 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001535 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001536 socket.setdefaulttimeout(30)
1537 try:
1538 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001539 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001540 finally:
1541 socket.setdefaulttimeout(None)
1542 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001543
1544 testTimeoutValueNamed = _justAccept
1545 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001546 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001547 self.assertEqual(self.cli.gettimeout(), 30)
1548
1549 testTimeoutValueNonamed = _justAccept
1550 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001551 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001552 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001553 self.assertEqual(self.cli.gettimeout(), 30)
1554
Victor Stinner45df8202010-04-28 22:31:17 +00001555@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001556class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1557
1558 def __init__(self, methodName='runTest'):
1559 SocketTCPTest.__init__(self, methodName=methodName)
1560 ThreadableTest.__init__(self)
1561
1562 def clientSetUp(self):
1563 pass
1564
1565 def clientTearDown(self):
1566 self.cli.close()
1567 self.cli = None
1568 ThreadableTest.clientTearDown(self)
1569
1570 def testInsideTimeout(self):
1571 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001572 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001573 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001574 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575 testOutsideTimeout = testInsideTimeout
1576
1577 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001578 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001579 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001580 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001581
1582 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001583 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001584 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001585
1586
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001587class TCPTimeoutTest(SocketTCPTest):
1588
1589 def testTCPTimeout(self):
1590 def raise_timeout(*args, **kwargs):
1591 self.serv.settimeout(1.0)
1592 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001593 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001594 "Error generating a timeout exception (TCP)")
1595
1596 def testTimeoutZero(self):
1597 ok = False
1598 try:
1599 self.serv.settimeout(0.0)
1600 foo = self.serv.accept()
1601 except socket.timeout:
1602 self.fail("caught timeout instead of error (TCP)")
1603 except socket.error:
1604 ok = True
1605 except:
1606 self.fail("caught unexpected exception (TCP)")
1607 if not ok:
1608 self.fail("accept() returned success when we did not expect it")
1609
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001610 def testInterruptedTimeout(self):
1611 # XXX I don't know how to do this test on MSWindows or any other
1612 # plaform that doesn't support signal.alarm() or os.kill(), though
1613 # the bug should have existed on all platforms.
1614 if not hasattr(signal, "alarm"):
1615 return # can only test on *nix
1616 self.serv.settimeout(5.0) # must be longer than alarm
1617 class Alarm(Exception):
1618 pass
1619 def alarm_handler(signal, frame):
1620 raise Alarm
1621 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1622 try:
1623 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1624 try:
1625 foo = self.serv.accept()
1626 except socket.timeout:
1627 self.fail("caught timeout instead of Alarm")
1628 except Alarm:
1629 pass
1630 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001631 self.fail("caught other exception instead of Alarm:"
1632 " %s(%s):\n%s" %
1633 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001634 else:
1635 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001636 finally:
1637 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001638 except Alarm:
1639 self.fail("got Alarm in wrong place")
1640 finally:
1641 # no alarm can be pending. Safe to restore old handler.
1642 signal.signal(signal.SIGALRM, old_alarm)
1643
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001644class UDPTimeoutTest(SocketTCPTest):
1645
1646 def testUDPTimeout(self):
1647 def raise_timeout(*args, **kwargs):
1648 self.serv.settimeout(1.0)
1649 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001650 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001651 "Error generating a timeout exception (UDP)")
1652
1653 def testTimeoutZero(self):
1654 ok = False
1655 try:
1656 self.serv.settimeout(0.0)
1657 foo = self.serv.recv(1024)
1658 except socket.timeout:
1659 self.fail("caught timeout instead of error (UDP)")
1660 except socket.error:
1661 ok = True
1662 except:
1663 self.fail("caught unexpected exception (UDP)")
1664 if not ok:
1665 self.fail("recv() returned success when we did not expect it")
1666
1667class TestExceptions(unittest.TestCase):
1668
1669 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001670 self.assertTrue(issubclass(socket.error, Exception))
1671 self.assertTrue(issubclass(socket.herror, socket.error))
1672 self.assertTrue(issubclass(socket.gaierror, socket.error))
1673 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001674
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001675class TestLinuxAbstractNamespace(unittest.TestCase):
1676
1677 UNIX_PATH_MAX = 108
1678
1679 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001680 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001681 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1682 s1.bind(address)
1683 s1.listen(1)
1684 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1685 s2.connect(s1.getsockname())
1686 s1.accept()
1687 self.assertEqual(s1.getsockname(), address)
1688 self.assertEqual(s2.getpeername(), address)
1689
1690 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001691 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001692 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1693 s.bind(address)
1694 self.assertEqual(s.getsockname(), address)
1695
1696 def testNameOverflow(self):
1697 address = "\x00" + "h" * self.UNIX_PATH_MAX
1698 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1699 self.assertRaises(socket.error, s.bind, address)
1700
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001701
Victor Stinner45df8202010-04-28 22:31:17 +00001702@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001703class BufferIOTest(SocketConnectedTest):
1704 """
1705 Test the buffer versions of socket.recv() and socket.send().
1706 """
1707 def __init__(self, methodName='runTest'):
1708 SocketConnectedTest.__init__(self, methodName=methodName)
1709
Antoine Pitrou25480782010-03-17 22:50:28 +00001710 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001711 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001712 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001713 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001714 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001715 self.assertEqual(msg, MSG)
1716
Antoine Pitrou25480782010-03-17 22:50:28 +00001717 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001718 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001719 self.serv_conn.send(buf)
1720
Antoine Pitrou25480782010-03-17 22:50:28 +00001721 def testRecvIntoBytearray(self):
1722 buf = bytearray(1024)
1723 nbytes = self.cli_conn.recv_into(buf)
1724 self.assertEqual(nbytes, len(MSG))
1725 msg = buf[:len(MSG)]
1726 self.assertEqual(msg, MSG)
1727
1728 _testRecvIntoBytearray = _testRecvIntoArray
1729
1730 def testRecvIntoMemoryview(self):
1731 buf = bytearray(1024)
1732 nbytes = self.cli_conn.recv_into(memoryview(buf))
1733 self.assertEqual(nbytes, len(MSG))
1734 msg = buf[:len(MSG)]
1735 self.assertEqual(msg, MSG)
1736
1737 _testRecvIntoMemoryview = _testRecvIntoArray
1738
1739 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001740 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001741 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001742 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001743 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001744 self.assertEqual(msg, MSG)
1745
Antoine Pitrou25480782010-03-17 22:50:28 +00001746 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001747 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001748 self.serv_conn.send(buf)
1749
Antoine Pitrou25480782010-03-17 22:50:28 +00001750 def testRecvFromIntoBytearray(self):
1751 buf = bytearray(1024)
1752 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1753 self.assertEqual(nbytes, len(MSG))
1754 msg = buf[:len(MSG)]
1755 self.assertEqual(msg, MSG)
1756
1757 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1758
1759 def testRecvFromIntoMemoryview(self):
1760 buf = bytearray(1024)
1761 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1762 self.assertEqual(nbytes, len(MSG))
1763 msg = buf[:len(MSG)]
1764 self.assertEqual(msg, MSG)
1765
1766 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1767
Christian Heimes043d6f62008-01-07 17:19:16 +00001768
1769TIPC_STYPE = 2000
1770TIPC_LOWER = 200
1771TIPC_UPPER = 210
1772
1773def isTipcAvailable():
1774 """Check if the TIPC module is loaded
1775
1776 The TIPC module is not loaded automatically on Ubuntu and probably
1777 other Linux distros.
1778 """
1779 if not hasattr(socket, "AF_TIPC"):
1780 return False
1781 if not os.path.isfile("/proc/modules"):
1782 return False
1783 with open("/proc/modules") as f:
1784 for line in f:
1785 if line.startswith("tipc "):
1786 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001787 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001788 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1789 return False
1790
1791class TIPCTest (unittest.TestCase):
1792 def testRDM(self):
1793 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1794 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1795
1796 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1797 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1798 TIPC_LOWER, TIPC_UPPER)
1799 srv.bind(srvaddr)
1800
1801 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1802 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1803 cli.sendto(MSG, sendaddr)
1804
1805 msg, recvaddr = srv.recvfrom(1024)
1806
1807 self.assertEqual(cli.getsockname(), recvaddr)
1808 self.assertEqual(msg, MSG)
1809
1810
1811class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1812 def __init__(self, methodName = 'runTest'):
1813 unittest.TestCase.__init__(self, methodName = methodName)
1814 ThreadableTest.__init__(self)
1815
1816 def setUp(self):
1817 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1818 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1819 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1820 TIPC_LOWER, TIPC_UPPER)
1821 self.srv.bind(srvaddr)
1822 self.srv.listen(5)
1823 self.serverExplicitReady()
1824 self.conn, self.connaddr = self.srv.accept()
1825
1826 def clientSetUp(self):
1827 # The is a hittable race between serverExplicitReady() and the
1828 # accept() call; sleep a little while to avoid it, otherwise
1829 # we could get an exception
1830 time.sleep(0.1)
1831 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1832 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1833 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1834 self.cli.connect(addr)
1835 self.cliaddr = self.cli.getsockname()
1836
1837 def testStream(self):
1838 msg = self.conn.recv(1024)
1839 self.assertEqual(msg, MSG)
1840 self.assertEqual(self.cliaddr, self.connaddr)
1841
1842 def _testStream(self):
1843 self.cli.send(MSG)
1844 self.cli.close()
1845
1846
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001847@unittest.skipUnless(thread, 'Threading required for this test.')
1848class ContextManagersTest(ThreadedTCPSocketTest):
1849
1850 def _testSocketClass(self):
1851 # base test
1852 with socket.socket() as sock:
1853 self.assertFalse(sock._closed)
1854 self.assertTrue(sock._closed)
1855 # close inside with block
1856 with socket.socket() as sock:
1857 sock.close()
1858 self.assertTrue(sock._closed)
1859 # exception inside with block
1860 with socket.socket() as sock:
1861 self.assertRaises(socket.error, sock.sendall, b'foo')
1862 self.assertTrue(sock._closed)
1863
1864 def testCreateConnectionBase(self):
1865 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001866 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001867 data = conn.recv(1024)
1868 conn.sendall(data)
1869
1870 def _testCreateConnectionBase(self):
1871 address = self.serv.getsockname()
1872 with socket.create_connection(address) as sock:
1873 self.assertFalse(sock._closed)
1874 sock.sendall(b'foo')
1875 self.assertEqual(sock.recv(1024), b'foo')
1876 self.assertTrue(sock._closed)
1877
1878 def testCreateConnectionClose(self):
1879 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001880 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001881 data = conn.recv(1024)
1882 conn.sendall(data)
1883
1884 def _testCreateConnectionClose(self):
1885 address = self.serv.getsockname()
1886 with socket.create_connection(address) as sock:
1887 sock.close()
1888 self.assertTrue(sock._closed)
1889 self.assertRaises(socket.error, sock.sendall, b'foo')
1890
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001891
Antoine Pitroub1c54962010-10-14 15:05:38 +00001892@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1893 "SOCK_CLOEXEC not defined")
1894@unittest.skipUnless(fcntl, "module fcntl not available")
1895class CloexecConstantTest(unittest.TestCase):
1896 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001897 v = linux_version()
1898 if v < (2, 6, 28):
1899 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1900 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001901 s = socket.socket(socket.AF_INET,
1902 socket.SOCK_STREAM | socket.SOCK_CLOEXEC)
1903 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1904 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
1905
1906
1907@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1908 "SOCK_NONBLOCK not defined")
1909class NonblockConstantTest(unittest.TestCase):
1910 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1911 if nonblock:
1912 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1913 self.assertEqual(s.gettimeout(), timeout)
1914 else:
1915 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1916 self.assertEqual(s.gettimeout(), None)
1917
1918 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001919 v = linux_version()
1920 if v < (2, 6, 28):
1921 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1922 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001923 # a lot of it seems silly and redundant, but I wanted to test that
1924 # changing back and forth worked ok
1925 s = socket.socket(socket.AF_INET,
1926 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
1927 self.checkNonblock(s)
1928 s.setblocking(1)
1929 self.checkNonblock(s, False)
1930 s.setblocking(0)
1931 self.checkNonblock(s)
1932 s.settimeout(None)
1933 self.checkNonblock(s, False)
1934 s.settimeout(2.0)
1935 self.checkNonblock(s, timeout=2.0)
1936 s.setblocking(1)
1937 self.checkNonblock(s, False)
1938 # defaulttimeout
1939 t = socket.getdefaulttimeout()
1940 socket.setdefaulttimeout(0.0)
1941 self.checkNonblock(socket.socket())
1942 socket.setdefaulttimeout(None)
1943 self.checkNonblock(socket.socket(), False)
1944 socket.setdefaulttimeout(2.0)
1945 self.checkNonblock(socket.socket(), timeout=2.0)
1946 socket.setdefaulttimeout(None)
1947 self.checkNonblock(socket.socket(), False)
1948 socket.setdefaulttimeout(t)
1949
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001950
Guido van Rossumb995eb72002-07-31 16:08:40 +00001951def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001952 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001953 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001954
1955 tests.extend([
1956 NonBlockingTCPTests,
1957 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001958 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001959 UnbufferedFileObjectClassTestCase,
1960 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001961 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001962 UnicodeReadFileObjectClassTestCase,
1963 UnicodeWriteFileObjectClassTestCase,
1964 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001965 NetworkConnectionNoServer,
1966 NetworkConnectionAttributesTest,
1967 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001968 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00001969 CloexecConstantTest,
1970 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00001971 ])
Dave Cole331708b2004-08-09 04:51:41 +00001972 if hasattr(socket, "socketpair"):
1973 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001974 if sys.platform == 'linux2':
1975 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001976 if isTipcAvailable():
1977 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001978 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001979
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001980 thread_info = support.threading_setup()
1981 support.run_unittest(*tests)
1982 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001983
1984if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001985 test_main()