blob: 9f27a5120c5be45cd5e5e55b4871e1769c8319ee [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.
449 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
450 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
451
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
Guido van Rossumb5b22702007-05-18 18:55:53 +0000458 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
459 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
460 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
461 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
462 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000463
Guido van Rossumb5b22702007-05-18 18:55:53 +0000464 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
465 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
466 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
467 self.assertEquals(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
Guido van Rossum540d9872007-08-17 03:51:09 +0000480 self.assertEquals(b'\x00' * 16, f('::'))
481 self.assertEquals(b'\x00' * 16, f('0::0'))
482 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000483 self.assertEquals(
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
Guido van Rossumb5b22702007-05-18 18:55:53 +0000494 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
495 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
496 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
497 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000498
Guido van Rossumb5b22702007-05-18 18:55:53 +0000499 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
500 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
501 self.assertEquals('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
Guido van Rossum540d9872007-08-17 03:51:09 +0000514 self.assertEquals('::', f(b'\x00' * 16))
515 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000516 self.assertEquals(
517 '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)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000670
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000671 def test_getnameinfo(self):
672 # only IP addresses are allowed
673 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
674
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000675 @unittest.skipUnless(support.is_resource_enabled('network'),
676 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000677 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000678 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000679 # these should all be successful
680 socket.gethostbyname('испытание.python.org')
681 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000682 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
683 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
684 # have a reverse entry yet
685 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000686
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000687 def check_sendall_interrupted(self, with_timeout):
688 # socketpair() is not stricly required, but it makes things easier.
689 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
690 self.skipTest("signal.alarm and socket.socketpair required for this test")
691 # Our signal handlers clobber the C errno by calling a math function
692 # with an invalid domain value.
693 def ok_handler(*args):
694 self.assertRaises(ValueError, math.acosh, 0)
695 def raising_handler(*args):
696 self.assertRaises(ValueError, math.acosh, 0)
697 1 // 0
698 c, s = socket.socketpair()
699 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
700 try:
701 if with_timeout:
702 # Just above the one second minimum for signal.alarm
703 c.settimeout(1.5)
704 with self.assertRaises(ZeroDivisionError):
705 signal.alarm(1)
706 c.sendall(b"x" * (1024**2))
707 if with_timeout:
708 signal.signal(signal.SIGALRM, ok_handler)
709 signal.alarm(1)
710 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
711 finally:
712 signal.signal(signal.SIGALRM, old_alarm)
713 c.close()
714 s.close()
715
716 def test_sendall_interrupted(self):
717 self.check_sendall_interrupted(False)
718
719 def test_sendall_interrupted_with_timeout(self):
720 self.check_sendall_interrupted(True)
721
Antoine Pitroue033e062010-10-29 10:38:18 +0000722 def test_dealloc_warn(self):
723 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
724 r = repr(sock)
725 with self.assertWarns(ResourceWarning) as cm:
726 sock = None
727 support.gc_collect()
728 self.assertIn(r, str(cm.warning.args[0]))
729 # An open socket file object gets dereferenced after the socket
730 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
731 f = sock.makefile('rb')
732 r = repr(sock)
733 sock = None
734 support.gc_collect()
735 with self.assertWarns(ResourceWarning):
736 f = None
737 support.gc_collect()
738
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000739
Victor Stinner45df8202010-04-28 22:31:17 +0000740@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741class BasicTCPTest(SocketConnectedTest):
742
743 def __init__(self, methodName='runTest'):
744 SocketConnectedTest.__init__(self, methodName=methodName)
745
746 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000747 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000749 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750
751 def _testRecv(self):
752 self.serv_conn.send(MSG)
753
754 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000755 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756 seg1 = self.cli_conn.recv(len(MSG) - 3)
757 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000758 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000759 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760
761 def _testOverFlowRecv(self):
762 self.serv_conn.send(MSG)
763
764 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000765 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000767 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768
769 def _testRecvFrom(self):
770 self.serv_conn.send(MSG)
771
772 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000773 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
775 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000776 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000777 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778
779 def _testOverFlowRecvFrom(self):
780 self.serv_conn.send(MSG)
781
782 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000783 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000784 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785 while 1:
786 read = self.cli_conn.recv(1024)
787 if not read:
788 break
Guido van Rossume531e292002-08-08 20:28:34 +0000789 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000790 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000791
792 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000793 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 self.serv_conn.sendall(big_chunk)
795
796 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000797 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798 fd = self.cli_conn.fileno()
799 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000800 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000801 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000803 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000804
805 def _testFromFd(self):
806 self.serv_conn.send(MSG)
807
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000808 def testDup(self):
809 # Testing dup()
810 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000811 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000812 msg = sock.recv(1024)
813 self.assertEqual(msg, MSG)
814
815 def _testDup(self):
816 self.serv_conn.send(MSG)
817
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000819 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000821 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000822 # wait for _testShutdown to finish: on OS X, when the server
823 # closes the connection the client also becomes disconnected,
824 # and the client's shutdown call will fail. (Issue #4397.)
825 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826
827 def _testShutdown(self):
828 self.serv_conn.send(MSG)
829 self.serv_conn.shutdown(2)
830
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000831 def testDetach(self):
832 # Testing detach()
833 fileno = self.cli_conn.fileno()
834 f = self.cli_conn.detach()
835 self.assertEqual(f, fileno)
836 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000837 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
838 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000839 # ...but we can create another socket using the (still open)
840 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000841 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000842 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000843 msg = sock.recv(1024)
844 self.assertEqual(msg, MSG)
845
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000846 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000847 self.serv_conn.send(MSG)
848
Victor Stinner45df8202010-04-28 22:31:17 +0000849@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850class BasicUDPTest(ThreadedUDPSocketTest):
851
852 def __init__(self, methodName='runTest'):
853 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
854
855 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000856 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000858 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859
860 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000861 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862
Guido van Rossum1c938012002-06-12 21:17:20 +0000863 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000864 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000866 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867
Guido van Rossum1c938012002-06-12 21:17:20 +0000868 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000869 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870
Guido van Rossumd8faa362007-04-27 19:54:29 +0000871 def testRecvFromNegative(self):
872 # Negative lengths passed to recvfrom should give ValueError.
873 self.assertRaises(ValueError, self.serv.recvfrom, -1)
874
875 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000876 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000877
Victor Stinner45df8202010-04-28 22:31:17 +0000878@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000879class TCPCloserTest(ThreadedTCPSocketTest):
880
881 def testClose(self):
882 conn, addr = self.serv.accept()
883 conn.close()
884
885 sd = self.cli
886 read, write, err = select.select([sd], [], [], 1.0)
887 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000888 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000889
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000890 # Calling close() many times should be safe.
891 conn.close()
892 conn.close()
893
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000894 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000895 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000896 time.sleep(1.0)
897
Victor Stinner45df8202010-04-28 22:31:17 +0000898@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000899class BasicSocketPairTest(SocketPairTest):
900
901 def __init__(self, methodName='runTest'):
902 SocketPairTest.__init__(self, methodName=methodName)
903
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000904 def _check_defaults(self, sock):
905 self.assertIsInstance(sock, socket.socket)
906 if hasattr(socket, 'AF_UNIX'):
907 self.assertEqual(sock.family, socket.AF_UNIX)
908 else:
909 self.assertEqual(sock.family, socket.AF_INET)
910 self.assertEqual(sock.type, socket.SOCK_STREAM)
911 self.assertEqual(sock.proto, 0)
912
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000913 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000914 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000915
916 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000917 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000918
Dave Cole331708b2004-08-09 04:51:41 +0000919 def testRecv(self):
920 msg = self.serv.recv(1024)
921 self.assertEqual(msg, MSG)
922
923 def _testRecv(self):
924 self.cli.send(MSG)
925
926 def testSend(self):
927 self.serv.send(MSG)
928
929 def _testSend(self):
930 msg = self.cli.recv(1024)
931 self.assertEqual(msg, MSG)
932
Victor Stinner45df8202010-04-28 22:31:17 +0000933@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934class NonBlockingTCPTests(ThreadedTCPSocketTest):
935
936 def __init__(self, methodName='runTest'):
937 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
938
939 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000940 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000941 self.serv.setblocking(0)
942 start = time.time()
943 try:
944 self.serv.accept()
945 except socket.error:
946 pass
947 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000948 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000949
950 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000951 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000952
Antoine Pitroub1c54962010-10-14 15:05:38 +0000953 if hasattr(socket, "SOCK_NONBLOCK"):
954 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000955 v = linux_version()
956 if v < (2, 6, 28):
957 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
958 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +0000959 # reinit server socket
960 self.serv.close()
961 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000962 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000963 self.port = support.bind_port(self.serv)
964 self.serv.listen(1)
965 # actual testing
966 start = time.time()
967 try:
968 self.serv.accept()
969 except socket.error:
970 pass
971 end = time.time()
972 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
973
974 def _testInitNonBlocking(self):
975 pass
976
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000978 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000980 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000981 conn, addr = self.serv.accept()
982 except socket.error:
983 pass
984 else:
985 self.fail("Error trying to do non-blocking accept.")
986 read, write, err = select.select([self.serv], [], [])
987 if self.serv in read:
988 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000989 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000990 else:
991 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000992
Guido van Rossum24e4af82002-06-12 19:18:08 +0000993 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000994 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000995 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000996
997 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000998 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000999 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001000 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001001
1002 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001003 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001004 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001005
1006 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001007 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001008 conn, addr = self.serv.accept()
1009 conn.setblocking(0)
1010 try:
1011 msg = conn.recv(len(MSG))
1012 except socket.error:
1013 pass
1014 else:
1015 self.fail("Error trying to do non-blocking recv.")
1016 read, write, err = select.select([conn], [], [])
1017 if conn in read:
1018 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001019 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001020 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001021 else:
1022 self.fail("Error during select call to non-blocking socket.")
1023
1024 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001025 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001026 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001027 self.cli.send(MSG)
1028
Victor Stinner45df8202010-04-28 22:31:17 +00001029@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001030class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001031 """Unit tests for the object returned by socket.makefile()
1032
Antoine Pitrou834bd812010-10-13 16:17:14 +00001033 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001034 the client connection. You can read from this file to
1035 get output from the server.
1036
Antoine Pitrou834bd812010-10-13 16:17:14 +00001037 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001038 server connection. You can write to this file to send output
1039 to the client.
1040 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001041
Guido van Rossume9f66142002-08-07 15:46:19 +00001042 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001043 encoding = 'utf8'
1044 errors = 'strict'
1045 newline = None
1046
1047 read_mode = 'rb'
1048 read_msg = MSG
1049 write_mode = 'wb'
1050 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001051
Guido van Rossum24e4af82002-06-12 19:18:08 +00001052 def __init__(self, methodName='runTest'):
1053 SocketConnectedTest.__init__(self, methodName=methodName)
1054
1055 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001056 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1057 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001059 self.read_file = self.cli_conn.makefile(
1060 self.read_mode, self.bufsize,
1061 encoding = self.encoding,
1062 errors = self.errors,
1063 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001064
1065 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001066 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001067 self.read_file.close()
1068 self.assertTrue(self.read_file.closed)
1069 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070 SocketConnectedTest.tearDown(self)
1071
1072 def clientSetUp(self):
1073 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001074 self.write_file = self.serv_conn.makefile(
1075 self.write_mode, self.bufsize,
1076 encoding = self.encoding,
1077 errors = self.errors,
1078 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001079
1080 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001081 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001082 self.write_file.close()
1083 self.assertTrue(self.write_file.closed)
1084 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001085 SocketConnectedTest.clientTearDown(self)
1086
1087 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001088 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001089 first_seg = self.read_file.read(len(self.read_msg)-3)
1090 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001091 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001092 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001093
1094 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001095 self.write_file.write(self.write_msg)
1096 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097
Guido van Rossum8c943832002-08-08 01:00:28 +00001098 def testFullRead(self):
1099 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001100 msg = self.read_file.read()
1101 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001102
1103 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001104 self.write_file.write(self.write_msg)
1105 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001106
Guido van Rossum24e4af82002-06-12 19:18:08 +00001107 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001108 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001109 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001110 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001111 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001112 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001113 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001114 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001115 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001116
1117 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001118 self.write_file.write(self.write_msg)
1119 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001120
1121 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001122 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001123 line = self.read_file.readline()
1124 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001125
1126 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001127 self.write_file.write(self.write_msg)
1128 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001129
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001130 def testCloseAfterMakefile(self):
1131 # The file returned by makefile should keep the socket open.
1132 self.cli_conn.close()
1133 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001134 msg = self.read_file.read()
1135 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001136
1137 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001138 self.write_file.write(self.write_msg)
1139 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001140
1141 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001142 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001143 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001144 if isinstance(self.read_msg, str):
1145 msg = msg.decode()
1146 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001147
1148 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001149 self.write_file.write(self.write_msg)
1150 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001151
Tim Peters116d83c2004-03-28 02:20:45 +00001152 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001153 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001154
1155 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001156 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001157
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001158 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001159 self.assertEqual(self.read_file.mode, self.read_mode)
1160 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001161
1162 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001163 self.assertEqual(self.write_file.mode, self.write_mode)
1164 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001165
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001166 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001167 self.read_file.close()
1168 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001169 self.cli_conn.close()
1170 self.assertRaises(socket.error, self.cli_conn.getsockname)
1171
1172 def _testRealClose(self):
1173 pass
1174
1175
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001176class FileObjectInterruptedTestCase(unittest.TestCase):
1177 """Test that the file object correctly handles EINTR internally."""
1178
1179 class MockSocket(object):
1180 def __init__(self, recv_funcs=()):
1181 # A generator that returns callables that we'll call for each
1182 # call to recv().
1183 self._recv_step = iter(recv_funcs)
1184
1185 def recv_into(self, buffer):
1186 data = next(self._recv_step)()
1187 assert len(buffer) >= len(data)
1188 buffer[:len(data)] = data
1189 return len(data)
1190
1191 def _decref_socketios(self):
1192 pass
1193
1194 def _textiowrap_for_test(self, buffering=-1):
1195 raw = socket.SocketIO(self, "r")
1196 if buffering < 0:
1197 buffering = io.DEFAULT_BUFFER_SIZE
1198 if buffering == 0:
1199 return raw
1200 buffer = io.BufferedReader(raw, buffering)
1201 text = io.TextIOWrapper(buffer, None, None)
1202 text.mode = "rb"
1203 return text
1204
1205 @staticmethod
1206 def _raise_eintr():
1207 raise socket.error(errno.EINTR)
1208
1209 def _textiowrap_mock_socket(self, mock, buffering=-1):
1210 raw = socket.SocketIO(mock, "r")
1211 if buffering < 0:
1212 buffering = io.DEFAULT_BUFFER_SIZE
1213 if buffering == 0:
1214 return raw
1215 buffer = io.BufferedReader(raw, buffering)
1216 text = io.TextIOWrapper(buffer, None, None)
1217 text.mode = "rb"
1218 return text
1219
1220 def _test_readline(self, size=-1, buffering=-1):
1221 mock_sock = self.MockSocket(recv_funcs=[
1222 lambda : b"This is the first line\nAnd the sec",
1223 self._raise_eintr,
1224 lambda : b"ond line is here\n",
1225 lambda : b"",
1226 lambda : b"", # XXX(gps): io library does an extra EOF read
1227 ])
1228 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1229 self.assertEquals(fo.readline(size), "This is the first line\n")
1230 self.assertEquals(fo.readline(size), "And the second line is here\n")
1231
1232 def _test_read(self, size=-1, buffering=-1):
1233 mock_sock = self.MockSocket(recv_funcs=[
1234 lambda : b"This is the first line\nAnd the sec",
1235 self._raise_eintr,
1236 lambda : b"ond line is here\n",
1237 lambda : b"",
1238 lambda : b"", # XXX(gps): io library does an extra EOF read
1239 ])
1240 expecting = (b"This is the first line\n"
1241 b"And the second line is here\n")
1242 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1243 if buffering == 0:
1244 data = b''
1245 else:
1246 data = ''
1247 expecting = expecting.decode('utf8')
1248 while len(data) != len(expecting):
1249 part = fo.read(size)
1250 if not part:
1251 break
1252 data += part
1253 self.assertEquals(data, expecting)
1254
1255 def test_default(self):
1256 self._test_readline()
1257 self._test_readline(size=100)
1258 self._test_read()
1259 self._test_read(size=100)
1260
1261 def test_with_1k_buffer(self):
1262 self._test_readline(buffering=1024)
1263 self._test_readline(size=100, buffering=1024)
1264 self._test_read(buffering=1024)
1265 self._test_read(size=100, buffering=1024)
1266
1267 def _test_readline_no_buffer(self, size=-1):
1268 mock_sock = self.MockSocket(recv_funcs=[
1269 lambda : b"a",
1270 lambda : b"\n",
1271 lambda : b"B",
1272 self._raise_eintr,
1273 lambda : b"b",
1274 lambda : b"",
1275 ])
1276 fo = mock_sock._textiowrap_for_test(buffering=0)
1277 self.assertEquals(fo.readline(size), b"a\n")
1278 self.assertEquals(fo.readline(size), b"Bb")
1279
1280 def test_no_buffer(self):
1281 self._test_readline_no_buffer()
1282 self._test_readline_no_buffer(size=4)
1283 self._test_read(buffering=0)
1284 self._test_read(size=100, buffering=0)
1285
1286
Guido van Rossume9f66142002-08-07 15:46:19 +00001287class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1288
1289 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001290
Guido van Rossume9f66142002-08-07 15:46:19 +00001291 In this case (and in this case only), it should be possible to
1292 create a file object, read a line from it, create another file
1293 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001294 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001295 when reading multiple requests from the same socket."""
1296
1297 bufsize = 0 # Use unbuffered mode
1298
1299 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001300 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001301 line = self.read_file.readline() # first line
1302 self.assertEqual(line, b"A. " + self.write_msg) # first line
1303 self.read_file = self.cli_conn.makefile('rb', 0)
1304 line = self.read_file.readline() # second line
1305 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001306
1307 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001308 self.write_file.write(b"A. " + self.write_msg)
1309 self.write_file.write(b"B. " + self.write_msg)
1310 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001311
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001312 def testMakefileClose(self):
1313 # The file returned by makefile should keep the socket open...
1314 self.cli_conn.close()
1315 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001316 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001317 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001318 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001319 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1320
1321 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001322 self.write_file.write(self.write_msg)
1323 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001324
1325 def testMakefileCloseSocketDestroy(self):
1326 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001327 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001328 refcount_after = sys.getrefcount(self.cli_conn)
1329 self.assertEqual(refcount_before - 1, refcount_after)
1330
1331 def _testMakefileCloseSocketDestroy(self):
1332 pass
1333
Antoine Pitrou98b46702010-09-18 22:59:00 +00001334 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001335 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001336 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1337
1338 def testSmallReadNonBlocking(self):
1339 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001340 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1341 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001342 self.evt1.set()
1343 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001344 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001345 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001346 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001347 self.assertEqual(n, 3)
1348 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001349 self.assertEqual(msg, self.read_msg)
1350 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1351 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001352
1353 def _testSmallReadNonBlocking(self):
1354 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001355 self.write_file.write(self.write_msg)
1356 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001357 self.evt2.set()
1358 # Avoid cloding the socket before the server test has finished,
1359 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1360 self.serv_finished.wait(5.0)
1361
1362 def testWriteNonBlocking(self):
1363 self.cli_finished.wait(5.0)
1364 # The client thread can't skip directly - the SkipTest exception
1365 # would appear as a failure.
1366 if self.serv_skipped:
1367 self.skipTest(self.serv_skipped)
1368
1369 def _testWriteNonBlocking(self):
1370 self.serv_skipped = None
1371 self.serv_conn.setblocking(False)
1372 # Try to saturate the socket buffer pipe with repeated large writes.
1373 BIG = b"x" * (1024 ** 2)
1374 LIMIT = 10
1375 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001376 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001377 self.assertGreater(n, 0)
1378 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001379 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001380 if n is None:
1381 # Succeeded
1382 break
1383 self.assertGreater(n, 0)
1384 else:
1385 # Let us know that this test didn't manage to establish
1386 # the expected conditions. This is not a failure in itself but,
1387 # if it happens repeatedly, the test should be fixed.
1388 self.serv_skipped = "failed to saturate the socket buffer"
1389
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001390
Guido van Rossum8c943832002-08-08 01:00:28 +00001391class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1392
1393 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1394
1395
1396class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1397
1398 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001399
Thomas Woutersb2137042007-02-01 18:02:27 +00001400
Antoine Pitrou834bd812010-10-13 16:17:14 +00001401class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1402 """Tests for socket.makefile() in text mode (rather than binary)"""
1403
1404 read_mode = 'r'
1405 read_msg = MSG.decode('utf8')
1406 write_mode = 'wb'
1407 write_msg = MSG
1408 newline = ''
1409
1410
1411class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1412 """Tests for socket.makefile() in text mode (rather than binary)"""
1413
1414 read_mode = 'rb'
1415 read_msg = MSG
1416 write_mode = 'w'
1417 write_msg = MSG.decode('utf8')
1418 newline = ''
1419
1420
1421class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1422 """Tests for socket.makefile() in text mode (rather than binary)"""
1423
1424 read_mode = 'r'
1425 read_msg = MSG.decode('utf8')
1426 write_mode = 'w'
1427 write_msg = MSG.decode('utf8')
1428 newline = ''
1429
1430
Guido van Rossumd8faa362007-04-27 19:54:29 +00001431class NetworkConnectionTest(object):
1432 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001433
Guido van Rossumd8faa362007-04-27 19:54:29 +00001434 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001435 # We're inherited below by BasicTCPTest2, which also inherits
1436 # BasicTCPTest, which defines self.port referenced below.
1437 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001438 self.serv_conn = self.cli
1439
1440class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1441 """Tests that NetworkConnection does not break existing TCP functionality.
1442 """
1443
1444class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001445
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001446 class MockSocket(socket.socket):
1447 def connect(self, *args):
1448 raise socket.timeout('timed out')
1449
1450 @contextlib.contextmanager
1451 def mocked_socket_module(self):
1452 """Return a socket which times out on connect"""
1453 old_socket = socket.socket
1454 socket.socket = self.MockSocket
1455 try:
1456 yield
1457 finally:
1458 socket.socket = old_socket
1459
1460 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001461 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001462 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001463 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001464 with self.assertRaises(socket.error) as cm:
1465 cli.connect((HOST, port))
1466 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1467
1468 def test_create_connection(self):
1469 # Issue #9792: errors raised by create_connection() should have
1470 # a proper errno attribute.
1471 port = support.find_unused_port()
1472 with self.assertRaises(socket.error) as cm:
1473 socket.create_connection((HOST, port))
1474 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1475
1476 def test_create_connection_timeout(self):
1477 # Issue #9792: create_connection() should not recast timeout errors
1478 # as generic socket errors.
1479 with self.mocked_socket_module():
1480 with self.assertRaises(socket.timeout):
1481 socket.create_connection((HOST, 1234))
1482
Guido van Rossumd8faa362007-04-27 19:54:29 +00001483
Victor Stinner45df8202010-04-28 22:31:17 +00001484@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001485class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1486
1487 def __init__(self, methodName='runTest'):
1488 SocketTCPTest.__init__(self, methodName=methodName)
1489 ThreadableTest.__init__(self)
1490
1491 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001492 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001493
1494 def clientTearDown(self):
1495 self.cli.close()
1496 self.cli = None
1497 ThreadableTest.clientTearDown(self)
1498
1499 def _justAccept(self):
1500 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001501 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001502
1503 testFamily = _justAccept
1504 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001505 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001506 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001507 self.assertEqual(self.cli.family, 2)
1508
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001509 testSourceAddress = _justAccept
1510 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001511 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1512 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001513 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001514 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001515 # The port number being used is sufficient to show that the bind()
1516 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001517
Guido van Rossumd8faa362007-04-27 19:54:29 +00001518 testTimeoutDefault = _justAccept
1519 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001520 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001521 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001522 socket.setdefaulttimeout(42)
1523 try:
1524 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001525 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001526 finally:
1527 socket.setdefaulttimeout(None)
1528 self.assertEquals(self.cli.gettimeout(), 42)
1529
1530 testTimeoutNone = _justAccept
1531 def _testTimeoutNone(self):
1532 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001533 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001534 socket.setdefaulttimeout(30)
1535 try:
1536 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001537 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001538 finally:
1539 socket.setdefaulttimeout(None)
1540 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001541
1542 testTimeoutValueNamed = _justAccept
1543 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001544 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001545 self.assertEqual(self.cli.gettimeout(), 30)
1546
1547 testTimeoutValueNonamed = _justAccept
1548 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001549 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001550 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001551 self.assertEqual(self.cli.gettimeout(), 30)
1552
Victor Stinner45df8202010-04-28 22:31:17 +00001553@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001554class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1555
1556 def __init__(self, methodName='runTest'):
1557 SocketTCPTest.__init__(self, methodName=methodName)
1558 ThreadableTest.__init__(self)
1559
1560 def clientSetUp(self):
1561 pass
1562
1563 def clientTearDown(self):
1564 self.cli.close()
1565 self.cli = None
1566 ThreadableTest.clientTearDown(self)
1567
1568 def testInsideTimeout(self):
1569 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001570 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001571 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001572 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001573 testOutsideTimeout = testInsideTimeout
1574
1575 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001576 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001577 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001578 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001579
1580 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001581 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001582 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001583
1584
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001585class TCPTimeoutTest(SocketTCPTest):
1586
1587 def testTCPTimeout(self):
1588 def raise_timeout(*args, **kwargs):
1589 self.serv.settimeout(1.0)
1590 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001591 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001592 "Error generating a timeout exception (TCP)")
1593
1594 def testTimeoutZero(self):
1595 ok = False
1596 try:
1597 self.serv.settimeout(0.0)
1598 foo = self.serv.accept()
1599 except socket.timeout:
1600 self.fail("caught timeout instead of error (TCP)")
1601 except socket.error:
1602 ok = True
1603 except:
1604 self.fail("caught unexpected exception (TCP)")
1605 if not ok:
1606 self.fail("accept() returned success when we did not expect it")
1607
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001608 def testInterruptedTimeout(self):
1609 # XXX I don't know how to do this test on MSWindows or any other
1610 # plaform that doesn't support signal.alarm() or os.kill(), though
1611 # the bug should have existed on all platforms.
1612 if not hasattr(signal, "alarm"):
1613 return # can only test on *nix
1614 self.serv.settimeout(5.0) # must be longer than alarm
1615 class Alarm(Exception):
1616 pass
1617 def alarm_handler(signal, frame):
1618 raise Alarm
1619 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1620 try:
1621 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1622 try:
1623 foo = self.serv.accept()
1624 except socket.timeout:
1625 self.fail("caught timeout instead of Alarm")
1626 except Alarm:
1627 pass
1628 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001629 self.fail("caught other exception instead of Alarm:"
1630 " %s(%s):\n%s" %
1631 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001632 else:
1633 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001634 finally:
1635 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001636 except Alarm:
1637 self.fail("got Alarm in wrong place")
1638 finally:
1639 # no alarm can be pending. Safe to restore old handler.
1640 signal.signal(signal.SIGALRM, old_alarm)
1641
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001642class UDPTimeoutTest(SocketTCPTest):
1643
1644 def testUDPTimeout(self):
1645 def raise_timeout(*args, **kwargs):
1646 self.serv.settimeout(1.0)
1647 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001648 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001649 "Error generating a timeout exception (UDP)")
1650
1651 def testTimeoutZero(self):
1652 ok = False
1653 try:
1654 self.serv.settimeout(0.0)
1655 foo = self.serv.recv(1024)
1656 except socket.timeout:
1657 self.fail("caught timeout instead of error (UDP)")
1658 except socket.error:
1659 ok = True
1660 except:
1661 self.fail("caught unexpected exception (UDP)")
1662 if not ok:
1663 self.fail("recv() returned success when we did not expect it")
1664
1665class TestExceptions(unittest.TestCase):
1666
1667 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001668 self.assertTrue(issubclass(socket.error, Exception))
1669 self.assertTrue(issubclass(socket.herror, socket.error))
1670 self.assertTrue(issubclass(socket.gaierror, socket.error))
1671 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001672
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001673class TestLinuxAbstractNamespace(unittest.TestCase):
1674
1675 UNIX_PATH_MAX = 108
1676
1677 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001678 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001679 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1680 s1.bind(address)
1681 s1.listen(1)
1682 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1683 s2.connect(s1.getsockname())
1684 s1.accept()
1685 self.assertEqual(s1.getsockname(), address)
1686 self.assertEqual(s2.getpeername(), address)
1687
1688 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001689 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001690 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1691 s.bind(address)
1692 self.assertEqual(s.getsockname(), address)
1693
1694 def testNameOverflow(self):
1695 address = "\x00" + "h" * self.UNIX_PATH_MAX
1696 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1697 self.assertRaises(socket.error, s.bind, address)
1698
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001699
Victor Stinner45df8202010-04-28 22:31:17 +00001700@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001701class BufferIOTest(SocketConnectedTest):
1702 """
1703 Test the buffer versions of socket.recv() and socket.send().
1704 """
1705 def __init__(self, methodName='runTest'):
1706 SocketConnectedTest.__init__(self, methodName=methodName)
1707
Antoine Pitrou25480782010-03-17 22:50:28 +00001708 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001709 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001710 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001711 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001712 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001713 self.assertEqual(msg, MSG)
1714
Antoine Pitrou25480782010-03-17 22:50:28 +00001715 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001716 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001717 self.serv_conn.send(buf)
1718
Antoine Pitrou25480782010-03-17 22:50:28 +00001719 def testRecvIntoBytearray(self):
1720 buf = bytearray(1024)
1721 nbytes = self.cli_conn.recv_into(buf)
1722 self.assertEqual(nbytes, len(MSG))
1723 msg = buf[:len(MSG)]
1724 self.assertEqual(msg, MSG)
1725
1726 _testRecvIntoBytearray = _testRecvIntoArray
1727
1728 def testRecvIntoMemoryview(self):
1729 buf = bytearray(1024)
1730 nbytes = self.cli_conn.recv_into(memoryview(buf))
1731 self.assertEqual(nbytes, len(MSG))
1732 msg = buf[:len(MSG)]
1733 self.assertEqual(msg, MSG)
1734
1735 _testRecvIntoMemoryview = _testRecvIntoArray
1736
1737 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001738 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001739 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001740 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001741 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001742 self.assertEqual(msg, MSG)
1743
Antoine Pitrou25480782010-03-17 22:50:28 +00001744 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001745 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001746 self.serv_conn.send(buf)
1747
Antoine Pitrou25480782010-03-17 22:50:28 +00001748 def testRecvFromIntoBytearray(self):
1749 buf = bytearray(1024)
1750 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1751 self.assertEqual(nbytes, len(MSG))
1752 msg = buf[:len(MSG)]
1753 self.assertEqual(msg, MSG)
1754
1755 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1756
1757 def testRecvFromIntoMemoryview(self):
1758 buf = bytearray(1024)
1759 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1760 self.assertEqual(nbytes, len(MSG))
1761 msg = buf[:len(MSG)]
1762 self.assertEqual(msg, MSG)
1763
1764 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1765
Christian Heimes043d6f62008-01-07 17:19:16 +00001766
1767TIPC_STYPE = 2000
1768TIPC_LOWER = 200
1769TIPC_UPPER = 210
1770
1771def isTipcAvailable():
1772 """Check if the TIPC module is loaded
1773
1774 The TIPC module is not loaded automatically on Ubuntu and probably
1775 other Linux distros.
1776 """
1777 if not hasattr(socket, "AF_TIPC"):
1778 return False
1779 if not os.path.isfile("/proc/modules"):
1780 return False
1781 with open("/proc/modules") as f:
1782 for line in f:
1783 if line.startswith("tipc "):
1784 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001785 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001786 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1787 return False
1788
1789class TIPCTest (unittest.TestCase):
1790 def testRDM(self):
1791 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1792 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1793
1794 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1795 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1796 TIPC_LOWER, TIPC_UPPER)
1797 srv.bind(srvaddr)
1798
1799 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1800 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1801 cli.sendto(MSG, sendaddr)
1802
1803 msg, recvaddr = srv.recvfrom(1024)
1804
1805 self.assertEqual(cli.getsockname(), recvaddr)
1806 self.assertEqual(msg, MSG)
1807
1808
1809class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1810 def __init__(self, methodName = 'runTest'):
1811 unittest.TestCase.__init__(self, methodName = methodName)
1812 ThreadableTest.__init__(self)
1813
1814 def setUp(self):
1815 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1816 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1817 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1818 TIPC_LOWER, TIPC_UPPER)
1819 self.srv.bind(srvaddr)
1820 self.srv.listen(5)
1821 self.serverExplicitReady()
1822 self.conn, self.connaddr = self.srv.accept()
1823
1824 def clientSetUp(self):
1825 # The is a hittable race between serverExplicitReady() and the
1826 # accept() call; sleep a little while to avoid it, otherwise
1827 # we could get an exception
1828 time.sleep(0.1)
1829 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1830 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1831 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1832 self.cli.connect(addr)
1833 self.cliaddr = self.cli.getsockname()
1834
1835 def testStream(self):
1836 msg = self.conn.recv(1024)
1837 self.assertEqual(msg, MSG)
1838 self.assertEqual(self.cliaddr, self.connaddr)
1839
1840 def _testStream(self):
1841 self.cli.send(MSG)
1842 self.cli.close()
1843
1844
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001845@unittest.skipUnless(thread, 'Threading required for this test.')
1846class ContextManagersTest(ThreadedTCPSocketTest):
1847
1848 def _testSocketClass(self):
1849 # base test
1850 with socket.socket() as sock:
1851 self.assertFalse(sock._closed)
1852 self.assertTrue(sock._closed)
1853 # close inside with block
1854 with socket.socket() as sock:
1855 sock.close()
1856 self.assertTrue(sock._closed)
1857 # exception inside with block
1858 with socket.socket() as sock:
1859 self.assertRaises(socket.error, sock.sendall, b'foo')
1860 self.assertTrue(sock._closed)
1861
1862 def testCreateConnectionBase(self):
1863 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001864 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001865 data = conn.recv(1024)
1866 conn.sendall(data)
1867
1868 def _testCreateConnectionBase(self):
1869 address = self.serv.getsockname()
1870 with socket.create_connection(address) as sock:
1871 self.assertFalse(sock._closed)
1872 sock.sendall(b'foo')
1873 self.assertEqual(sock.recv(1024), b'foo')
1874 self.assertTrue(sock._closed)
1875
1876 def testCreateConnectionClose(self):
1877 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001878 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001879 data = conn.recv(1024)
1880 conn.sendall(data)
1881
1882 def _testCreateConnectionClose(self):
1883 address = self.serv.getsockname()
1884 with socket.create_connection(address) as sock:
1885 sock.close()
1886 self.assertTrue(sock._closed)
1887 self.assertRaises(socket.error, sock.sendall, b'foo')
1888
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001889
Antoine Pitroub1c54962010-10-14 15:05:38 +00001890@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1891 "SOCK_CLOEXEC not defined")
1892@unittest.skipUnless(fcntl, "module fcntl not available")
1893class CloexecConstantTest(unittest.TestCase):
1894 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001895 v = linux_version()
1896 if v < (2, 6, 28):
1897 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1898 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001899 s = socket.socket(socket.AF_INET,
1900 socket.SOCK_STREAM | socket.SOCK_CLOEXEC)
1901 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1902 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
1903
1904
1905@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1906 "SOCK_NONBLOCK not defined")
1907class NonblockConstantTest(unittest.TestCase):
1908 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1909 if nonblock:
1910 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1911 self.assertEqual(s.gettimeout(), timeout)
1912 else:
1913 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1914 self.assertEqual(s.gettimeout(), None)
1915
1916 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001917 v = linux_version()
1918 if v < (2, 6, 28):
1919 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1920 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001921 # a lot of it seems silly and redundant, but I wanted to test that
1922 # changing back and forth worked ok
1923 s = socket.socket(socket.AF_INET,
1924 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
1925 self.checkNonblock(s)
1926 s.setblocking(1)
1927 self.checkNonblock(s, False)
1928 s.setblocking(0)
1929 self.checkNonblock(s)
1930 s.settimeout(None)
1931 self.checkNonblock(s, False)
1932 s.settimeout(2.0)
1933 self.checkNonblock(s, timeout=2.0)
1934 s.setblocking(1)
1935 self.checkNonblock(s, False)
1936 # defaulttimeout
1937 t = socket.getdefaulttimeout()
1938 socket.setdefaulttimeout(0.0)
1939 self.checkNonblock(socket.socket())
1940 socket.setdefaulttimeout(None)
1941 self.checkNonblock(socket.socket(), False)
1942 socket.setdefaulttimeout(2.0)
1943 self.checkNonblock(socket.socket(), timeout=2.0)
1944 socket.setdefaulttimeout(None)
1945 self.checkNonblock(socket.socket(), False)
1946 socket.setdefaulttimeout(t)
1947
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001948
Guido van Rossumb995eb72002-07-31 16:08:40 +00001949def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001950 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001951 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001952
1953 tests.extend([
1954 NonBlockingTCPTests,
1955 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001956 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001957 UnbufferedFileObjectClassTestCase,
1958 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001959 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001960 UnicodeReadFileObjectClassTestCase,
1961 UnicodeWriteFileObjectClassTestCase,
1962 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001963 NetworkConnectionNoServer,
1964 NetworkConnectionAttributesTest,
1965 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001966 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00001967 CloexecConstantTest,
1968 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00001969 ])
Dave Cole331708b2004-08-09 04:51:41 +00001970 if hasattr(socket, "socketpair"):
1971 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001972 if sys.platform == 'linux2':
1973 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001974 if isTipcAvailable():
1975 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001976 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001977
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001978 thread_info = support.threading_setup()
1979 support.run_unittest(*tests)
1980 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001981
1982if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001983 test_main()