blob: facb0651e5784a26108eba11473af93d18e56c2f [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.
547 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000548 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000549 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000550
551 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000552 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000553 # We know a socket should start without reuse==0
554 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000555 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000556 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000557 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000558
559 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000560 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000561 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000562 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
564 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000565 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000566
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000567 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000568 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000569 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
570 sock.settimeout(1)
571 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000572 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000573
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000574 def testNewAttributes(self):
575 # testing .family, .type and .protocol
576 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
577 self.assertEqual(sock.family, socket.AF_INET)
578 self.assertEqual(sock.type, socket.SOCK_STREAM)
579 self.assertEqual(sock.proto, 0)
580 sock.close()
581
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000582 def test_getsockaddrarg(self):
583 host = '0.0.0.0'
584 port = self._get_unused_port(bind_address=host)
585 big_port = port + 65536
586 neg_port = port - 65536
587 sock = socket.socket()
588 try:
589 self.assertRaises(OverflowError, sock.bind, (host, big_port))
590 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
591 sock.bind((host, port))
592 finally:
593 sock.close()
594
Christian Heimesfaf2f632008-01-06 16:59:19 +0000595 def test_sock_ioctl(self):
596 if os.name != "nt":
597 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000598 self.assertTrue(hasattr(socket.socket, 'ioctl'))
599 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
600 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
601 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000602 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
603 s = socket.socket()
604 self.assertRaises(ValueError, s.ioctl, -1, None)
605 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000606
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000607 def testGetaddrinfo(self):
608 try:
609 socket.getaddrinfo('localhost', 80)
610 except socket.gaierror as err:
611 if err.errno == socket.EAI_SERVICE:
612 # see http://bugs.python.org/issue1282647
613 self.skipTest("buggy libc version")
614 raise
615 # len of every sequence is supposed to be == 5
616 for info in socket.getaddrinfo(HOST, None):
617 self.assertEqual(len(info), 5)
618 # host can be a domain name, a string representation of an
619 # IPv4/v6 address or None
620 socket.getaddrinfo('localhost', 80)
621 socket.getaddrinfo('127.0.0.1', 80)
622 socket.getaddrinfo(None, 80)
623 if SUPPORTS_IPV6:
624 socket.getaddrinfo('::1', 80)
625 # port can be a string service name such as "http", a numeric
626 # port number or None
627 socket.getaddrinfo(HOST, "http")
628 socket.getaddrinfo(HOST, 80)
629 socket.getaddrinfo(HOST, None)
630 # test family and socktype filters
631 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
632 for family, _, _, _, _ in infos:
633 self.assertEqual(family, socket.AF_INET)
634 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
635 for _, socktype, _, _, _ in infos:
636 self.assertEqual(socktype, socket.SOCK_STREAM)
637 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000638 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000639 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
640 # a server willing to support both IPv4 and IPv6 will
641 # usually do this
642 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
643 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000644 # test keyword arguments
645 a = socket.getaddrinfo(HOST, None)
646 b = socket.getaddrinfo(host=HOST, port=None)
647 self.assertEqual(a, b)
648 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
649 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
650 self.assertEqual(a, b)
651 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
652 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
653 self.assertEqual(a, b)
654 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
655 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
656 self.assertEqual(a, b)
657 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
658 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
659 self.assertEqual(a, b)
660 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
661 socket.AI_PASSIVE)
662 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
663 type=socket.SOCK_STREAM, proto=0,
664 flags=socket.AI_PASSIVE)
665 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000666
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000667 def test_getnameinfo(self):
668 # only IP addresses are allowed
669 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
670
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000671 @unittest.skipUnless(support.is_resource_enabled('network'),
672 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000673 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000674 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000675 # these should all be successful
676 socket.gethostbyname('испытание.python.org')
677 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000678 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
679 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
680 # have a reverse entry yet
681 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000682
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000683 def check_sendall_interrupted(self, with_timeout):
684 # socketpair() is not stricly required, but it makes things easier.
685 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
686 self.skipTest("signal.alarm and socket.socketpair required for this test")
687 # Our signal handlers clobber the C errno by calling a math function
688 # with an invalid domain value.
689 def ok_handler(*args):
690 self.assertRaises(ValueError, math.acosh, 0)
691 def raising_handler(*args):
692 self.assertRaises(ValueError, math.acosh, 0)
693 1 // 0
694 c, s = socket.socketpair()
695 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
696 try:
697 if with_timeout:
698 # Just above the one second minimum for signal.alarm
699 c.settimeout(1.5)
700 with self.assertRaises(ZeroDivisionError):
701 signal.alarm(1)
702 c.sendall(b"x" * (1024**2))
703 if with_timeout:
704 signal.signal(signal.SIGALRM, ok_handler)
705 signal.alarm(1)
706 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
707 finally:
708 signal.signal(signal.SIGALRM, old_alarm)
709 c.close()
710 s.close()
711
712 def test_sendall_interrupted(self):
713 self.check_sendall_interrupted(False)
714
715 def test_sendall_interrupted_with_timeout(self):
716 self.check_sendall_interrupted(True)
717
Antoine Pitroue033e062010-10-29 10:38:18 +0000718 def test_dealloc_warn(self):
719 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
720 r = repr(sock)
721 with self.assertWarns(ResourceWarning) as cm:
722 sock = None
723 support.gc_collect()
724 self.assertIn(r, str(cm.warning.args[0]))
725 # An open socket file object gets dereferenced after the socket
726 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
727 f = sock.makefile('rb')
728 r = repr(sock)
729 sock = None
730 support.gc_collect()
731 with self.assertWarns(ResourceWarning):
732 f = None
733 support.gc_collect()
734
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000735
Victor Stinner45df8202010-04-28 22:31:17 +0000736@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737class BasicTCPTest(SocketConnectedTest):
738
739 def __init__(self, methodName='runTest'):
740 SocketConnectedTest.__init__(self, methodName=methodName)
741
742 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000743 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000744 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000745 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000746
747 def _testRecv(self):
748 self.serv_conn.send(MSG)
749
750 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000751 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000752 seg1 = self.cli_conn.recv(len(MSG) - 3)
753 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000754 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000755 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756
757 def _testOverFlowRecv(self):
758 self.serv_conn.send(MSG)
759
760 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000761 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000763 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764
765 def _testRecvFrom(self):
766 self.serv_conn.send(MSG)
767
768 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000769 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000770 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
771 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000772 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000773 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774
775 def _testOverFlowRecvFrom(self):
776 self.serv_conn.send(MSG)
777
778 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000779 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000780 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 while 1:
782 read = self.cli_conn.recv(1024)
783 if not read:
784 break
Guido van Rossume531e292002-08-08 20:28:34 +0000785 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000786 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787
788 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000789 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790 self.serv_conn.sendall(big_chunk)
791
792 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000793 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 fd = self.cli_conn.fileno()
795 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000796 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000797 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000799 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800
801 def _testFromFd(self):
802 self.serv_conn.send(MSG)
803
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000804 def testDup(self):
805 # Testing dup()
806 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000807 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000808 msg = sock.recv(1024)
809 self.assertEqual(msg, MSG)
810
811 def _testDup(self):
812 self.serv_conn.send(MSG)
813
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000815 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000817 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000818 # wait for _testShutdown to finish: on OS X, when the server
819 # closes the connection the client also becomes disconnected,
820 # and the client's shutdown call will fail. (Issue #4397.)
821 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822
823 def _testShutdown(self):
824 self.serv_conn.send(MSG)
825 self.serv_conn.shutdown(2)
826
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000827 def testDetach(self):
828 # Testing detach()
829 fileno = self.cli_conn.fileno()
830 f = self.cli_conn.detach()
831 self.assertEqual(f, fileno)
832 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000833 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
834 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000835 # ...but we can create another socket using the (still open)
836 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000837 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000838 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000839 msg = sock.recv(1024)
840 self.assertEqual(msg, MSG)
841
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000842 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000843 self.serv_conn.send(MSG)
844
Victor Stinner45df8202010-04-28 22:31:17 +0000845@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846class BasicUDPTest(ThreadedUDPSocketTest):
847
848 def __init__(self, methodName='runTest'):
849 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
850
851 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000852 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000854 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855
856 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000857 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858
Guido van Rossum1c938012002-06-12 21:17:20 +0000859 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000860 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000862 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863
Guido van Rossum1c938012002-06-12 21:17:20 +0000864 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000865 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866
Guido van Rossumd8faa362007-04-27 19:54:29 +0000867 def testRecvFromNegative(self):
868 # Negative lengths passed to recvfrom should give ValueError.
869 self.assertRaises(ValueError, self.serv.recvfrom, -1)
870
871 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000872 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000873
Victor Stinner45df8202010-04-28 22:31:17 +0000874@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000875class TCPCloserTest(ThreadedTCPSocketTest):
876
877 def testClose(self):
878 conn, addr = self.serv.accept()
879 conn.close()
880
881 sd = self.cli
882 read, write, err = select.select([sd], [], [], 1.0)
883 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000884 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000885
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000886 # Calling close() many times should be safe.
887 conn.close()
888 conn.close()
889
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000890 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000891 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000892 time.sleep(1.0)
893
Victor Stinner45df8202010-04-28 22:31:17 +0000894@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000895class BasicSocketPairTest(SocketPairTest):
896
897 def __init__(self, methodName='runTest'):
898 SocketPairTest.__init__(self, methodName=methodName)
899
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000900 def _check_defaults(self, sock):
901 self.assertIsInstance(sock, socket.socket)
902 if hasattr(socket, 'AF_UNIX'):
903 self.assertEqual(sock.family, socket.AF_UNIX)
904 else:
905 self.assertEqual(sock.family, socket.AF_INET)
906 self.assertEqual(sock.type, socket.SOCK_STREAM)
907 self.assertEqual(sock.proto, 0)
908
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000909 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000910 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000911
912 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000913 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000914
Dave Cole331708b2004-08-09 04:51:41 +0000915 def testRecv(self):
916 msg = self.serv.recv(1024)
917 self.assertEqual(msg, MSG)
918
919 def _testRecv(self):
920 self.cli.send(MSG)
921
922 def testSend(self):
923 self.serv.send(MSG)
924
925 def _testSend(self):
926 msg = self.cli.recv(1024)
927 self.assertEqual(msg, MSG)
928
Victor Stinner45df8202010-04-28 22:31:17 +0000929@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930class NonBlockingTCPTests(ThreadedTCPSocketTest):
931
932 def __init__(self, methodName='runTest'):
933 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
934
935 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000936 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 self.serv.setblocking(0)
938 start = time.time()
939 try:
940 self.serv.accept()
941 except socket.error:
942 pass
943 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000944 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000945
946 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000947 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000948
Antoine Pitroub1c54962010-10-14 15:05:38 +0000949 if hasattr(socket, "SOCK_NONBLOCK"):
950 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000951 v = linux_version()
952 if v < (2, 6, 28):
953 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
954 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +0000955 # reinit server socket
956 self.serv.close()
957 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000958 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000959 self.port = support.bind_port(self.serv)
960 self.serv.listen(1)
961 # actual testing
962 start = time.time()
963 try:
964 self.serv.accept()
965 except socket.error:
966 pass
967 end = time.time()
968 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
969
970 def _testInitNonBlocking(self):
971 pass
972
Guido van Rossum24e4af82002-06-12 19:18:08 +0000973 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000974 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000975 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000976 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977 conn, addr = self.serv.accept()
978 except socket.error:
979 pass
980 else:
981 self.fail("Error trying to do non-blocking accept.")
982 read, write, err = select.select([self.serv], [], [])
983 if self.serv in read:
984 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000985 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986 else:
987 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000988
Guido van Rossum24e4af82002-06-12 19:18:08 +0000989 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000990 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000991 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000992
993 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000994 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000995 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000996 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000997
998 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000999 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001000 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001001
1002 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001003 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004 conn, addr = self.serv.accept()
1005 conn.setblocking(0)
1006 try:
1007 msg = conn.recv(len(MSG))
1008 except socket.error:
1009 pass
1010 else:
1011 self.fail("Error trying to do non-blocking recv.")
1012 read, write, err = select.select([conn], [], [])
1013 if conn in read:
1014 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001015 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001016 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001017 else:
1018 self.fail("Error during select call to non-blocking socket.")
1019
1020 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001021 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001022 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001023 self.cli.send(MSG)
1024
Victor Stinner45df8202010-04-28 22:31:17 +00001025@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001026class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001027 """Unit tests for the object returned by socket.makefile()
1028
Antoine Pitrou834bd812010-10-13 16:17:14 +00001029 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001030 the client connection. You can read from this file to
1031 get output from the server.
1032
Antoine Pitrou834bd812010-10-13 16:17:14 +00001033 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001034 server connection. You can write to this file to send output
1035 to the client.
1036 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001037
Guido van Rossume9f66142002-08-07 15:46:19 +00001038 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001039 encoding = 'utf8'
1040 errors = 'strict'
1041 newline = None
1042
1043 read_mode = 'rb'
1044 read_msg = MSG
1045 write_mode = 'wb'
1046 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001047
Guido van Rossum24e4af82002-06-12 19:18:08 +00001048 def __init__(self, methodName='runTest'):
1049 SocketConnectedTest.__init__(self, methodName=methodName)
1050
1051 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001052 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1053 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001054 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001055 self.read_file = self.cli_conn.makefile(
1056 self.read_mode, self.bufsize,
1057 encoding = self.encoding,
1058 errors = self.errors,
1059 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001060
1061 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001062 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001063 self.read_file.close()
1064 self.assertTrue(self.read_file.closed)
1065 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066 SocketConnectedTest.tearDown(self)
1067
1068 def clientSetUp(self):
1069 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001070 self.write_file = self.serv_conn.makefile(
1071 self.write_mode, self.bufsize,
1072 encoding = self.encoding,
1073 errors = self.errors,
1074 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001075
1076 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001077 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001078 self.write_file.close()
1079 self.assertTrue(self.write_file.closed)
1080 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001081 SocketConnectedTest.clientTearDown(self)
1082
1083 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001084 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001085 first_seg = self.read_file.read(len(self.read_msg)-3)
1086 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001087 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001088 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089
1090 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001091 self.write_file.write(self.write_msg)
1092 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001093
Guido van Rossum8c943832002-08-08 01:00:28 +00001094 def testFullRead(self):
1095 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001096 msg = self.read_file.read()
1097 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001098
1099 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001100 self.write_file.write(self.write_msg)
1101 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001102
Guido van Rossum24e4af82002-06-12 19:18:08 +00001103 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001104 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001105 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001106 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001107 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001108 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001109 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001110 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001111 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001112
1113 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001114 self.write_file.write(self.write_msg)
1115 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001116
1117 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001118 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001119 line = self.read_file.readline()
1120 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001121
1122 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001123 self.write_file.write(self.write_msg)
1124 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001125
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001126 def testCloseAfterMakefile(self):
1127 # The file returned by makefile should keep the socket open.
1128 self.cli_conn.close()
1129 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001130 msg = self.read_file.read()
1131 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001132
1133 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001134 self.write_file.write(self.write_msg)
1135 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001136
1137 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001138 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001139 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001140 if isinstance(self.read_msg, str):
1141 msg = msg.decode()
1142 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001143
1144 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001145 self.write_file.write(self.write_msg)
1146 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001147
Tim Peters116d83c2004-03-28 02:20:45 +00001148 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001149 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001150
1151 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001152 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001153
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001154 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001155 self.assertEqual(self.read_file.mode, self.read_mode)
1156 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001157
1158 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001159 self.assertEqual(self.write_file.mode, self.write_mode)
1160 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001161
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001162 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001163 self.read_file.close()
1164 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001165 self.cli_conn.close()
1166 self.assertRaises(socket.error, self.cli_conn.getsockname)
1167
1168 def _testRealClose(self):
1169 pass
1170
1171
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001172class FileObjectInterruptedTestCase(unittest.TestCase):
1173 """Test that the file object correctly handles EINTR internally."""
1174
1175 class MockSocket(object):
1176 def __init__(self, recv_funcs=()):
1177 # A generator that returns callables that we'll call for each
1178 # call to recv().
1179 self._recv_step = iter(recv_funcs)
1180
1181 def recv_into(self, buffer):
1182 data = next(self._recv_step)()
1183 assert len(buffer) >= len(data)
1184 buffer[:len(data)] = data
1185 return len(data)
1186
1187 def _decref_socketios(self):
1188 pass
1189
1190 def _textiowrap_for_test(self, buffering=-1):
1191 raw = socket.SocketIO(self, "r")
1192 if buffering < 0:
1193 buffering = io.DEFAULT_BUFFER_SIZE
1194 if buffering == 0:
1195 return raw
1196 buffer = io.BufferedReader(raw, buffering)
1197 text = io.TextIOWrapper(buffer, None, None)
1198 text.mode = "rb"
1199 return text
1200
1201 @staticmethod
1202 def _raise_eintr():
1203 raise socket.error(errno.EINTR)
1204
1205 def _textiowrap_mock_socket(self, mock, buffering=-1):
1206 raw = socket.SocketIO(mock, "r")
1207 if buffering < 0:
1208 buffering = io.DEFAULT_BUFFER_SIZE
1209 if buffering == 0:
1210 return raw
1211 buffer = io.BufferedReader(raw, buffering)
1212 text = io.TextIOWrapper(buffer, None, None)
1213 text.mode = "rb"
1214 return text
1215
1216 def _test_readline(self, size=-1, buffering=-1):
1217 mock_sock = self.MockSocket(recv_funcs=[
1218 lambda : b"This is the first line\nAnd the sec",
1219 self._raise_eintr,
1220 lambda : b"ond line is here\n",
1221 lambda : b"",
1222 lambda : b"", # XXX(gps): io library does an extra EOF read
1223 ])
1224 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1225 self.assertEquals(fo.readline(size), "This is the first line\n")
1226 self.assertEquals(fo.readline(size), "And the second line is here\n")
1227
1228 def _test_read(self, size=-1, buffering=-1):
1229 mock_sock = self.MockSocket(recv_funcs=[
1230 lambda : b"This is the first line\nAnd the sec",
1231 self._raise_eintr,
1232 lambda : b"ond line is here\n",
1233 lambda : b"",
1234 lambda : b"", # XXX(gps): io library does an extra EOF read
1235 ])
1236 expecting = (b"This is the first line\n"
1237 b"And the second line is here\n")
1238 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1239 if buffering == 0:
1240 data = b''
1241 else:
1242 data = ''
1243 expecting = expecting.decode('utf8')
1244 while len(data) != len(expecting):
1245 part = fo.read(size)
1246 if not part:
1247 break
1248 data += part
1249 self.assertEquals(data, expecting)
1250
1251 def test_default(self):
1252 self._test_readline()
1253 self._test_readline(size=100)
1254 self._test_read()
1255 self._test_read(size=100)
1256
1257 def test_with_1k_buffer(self):
1258 self._test_readline(buffering=1024)
1259 self._test_readline(size=100, buffering=1024)
1260 self._test_read(buffering=1024)
1261 self._test_read(size=100, buffering=1024)
1262
1263 def _test_readline_no_buffer(self, size=-1):
1264 mock_sock = self.MockSocket(recv_funcs=[
1265 lambda : b"a",
1266 lambda : b"\n",
1267 lambda : b"B",
1268 self._raise_eintr,
1269 lambda : b"b",
1270 lambda : b"",
1271 ])
1272 fo = mock_sock._textiowrap_for_test(buffering=0)
1273 self.assertEquals(fo.readline(size), b"a\n")
1274 self.assertEquals(fo.readline(size), b"Bb")
1275
1276 def test_no_buffer(self):
1277 self._test_readline_no_buffer()
1278 self._test_readline_no_buffer(size=4)
1279 self._test_read(buffering=0)
1280 self._test_read(size=100, buffering=0)
1281
1282
Guido van Rossume9f66142002-08-07 15:46:19 +00001283class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1284
1285 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001286
Guido van Rossume9f66142002-08-07 15:46:19 +00001287 In this case (and in this case only), it should be possible to
1288 create a file object, read a line from it, create another file
1289 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001290 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001291 when reading multiple requests from the same socket."""
1292
1293 bufsize = 0 # Use unbuffered mode
1294
1295 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001296 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001297 line = self.read_file.readline() # first line
1298 self.assertEqual(line, b"A. " + self.write_msg) # first line
1299 self.read_file = self.cli_conn.makefile('rb', 0)
1300 line = self.read_file.readline() # second line
1301 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001302
1303 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001304 self.write_file.write(b"A. " + self.write_msg)
1305 self.write_file.write(b"B. " + self.write_msg)
1306 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001307
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001308 def testMakefileClose(self):
1309 # The file returned by makefile should keep the socket open...
1310 self.cli_conn.close()
1311 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001312 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001313 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001314 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001315 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1316
1317 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001318 self.write_file.write(self.write_msg)
1319 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001320
1321 def testMakefileCloseSocketDestroy(self):
1322 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001323 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001324 refcount_after = sys.getrefcount(self.cli_conn)
1325 self.assertEqual(refcount_before - 1, refcount_after)
1326
1327 def _testMakefileCloseSocketDestroy(self):
1328 pass
1329
Antoine Pitrou98b46702010-09-18 22:59:00 +00001330 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001331 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001332 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1333
1334 def testSmallReadNonBlocking(self):
1335 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001336 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1337 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001338 self.evt1.set()
1339 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001340 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001341 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001342 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001343 self.assertEqual(n, 3)
1344 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001345 self.assertEqual(msg, self.read_msg)
1346 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1347 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001348
1349 def _testSmallReadNonBlocking(self):
1350 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001351 self.write_file.write(self.write_msg)
1352 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001353 self.evt2.set()
1354 # Avoid cloding the socket before the server test has finished,
1355 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1356 self.serv_finished.wait(5.0)
1357
1358 def testWriteNonBlocking(self):
1359 self.cli_finished.wait(5.0)
1360 # The client thread can't skip directly - the SkipTest exception
1361 # would appear as a failure.
1362 if self.serv_skipped:
1363 self.skipTest(self.serv_skipped)
1364
1365 def _testWriteNonBlocking(self):
1366 self.serv_skipped = None
1367 self.serv_conn.setblocking(False)
1368 # Try to saturate the socket buffer pipe with repeated large writes.
1369 BIG = b"x" * (1024 ** 2)
1370 LIMIT = 10
1371 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001372 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001373 self.assertGreater(n, 0)
1374 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001375 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001376 if n is None:
1377 # Succeeded
1378 break
1379 self.assertGreater(n, 0)
1380 else:
1381 # Let us know that this test didn't manage to establish
1382 # the expected conditions. This is not a failure in itself but,
1383 # if it happens repeatedly, the test should be fixed.
1384 self.serv_skipped = "failed to saturate the socket buffer"
1385
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001386
Guido van Rossum8c943832002-08-08 01:00:28 +00001387class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1388
1389 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1390
1391
1392class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1393
1394 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001395
Thomas Woutersb2137042007-02-01 18:02:27 +00001396
Antoine Pitrou834bd812010-10-13 16:17:14 +00001397class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1398 """Tests for socket.makefile() in text mode (rather than binary)"""
1399
1400 read_mode = 'r'
1401 read_msg = MSG.decode('utf8')
1402 write_mode = 'wb'
1403 write_msg = MSG
1404 newline = ''
1405
1406
1407class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1408 """Tests for socket.makefile() in text mode (rather than binary)"""
1409
1410 read_mode = 'rb'
1411 read_msg = MSG
1412 write_mode = 'w'
1413 write_msg = MSG.decode('utf8')
1414 newline = ''
1415
1416
1417class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1418 """Tests for socket.makefile() in text mode (rather than binary)"""
1419
1420 read_mode = 'r'
1421 read_msg = MSG.decode('utf8')
1422 write_mode = 'w'
1423 write_msg = MSG.decode('utf8')
1424 newline = ''
1425
1426
Guido van Rossumd8faa362007-04-27 19:54:29 +00001427class NetworkConnectionTest(object):
1428 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001429
Guido van Rossumd8faa362007-04-27 19:54:29 +00001430 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001431 # We're inherited below by BasicTCPTest2, which also inherits
1432 # BasicTCPTest, which defines self.port referenced below.
1433 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001434 self.serv_conn = self.cli
1435
1436class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1437 """Tests that NetworkConnection does not break existing TCP functionality.
1438 """
1439
1440class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001441
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001442 class MockSocket(socket.socket):
1443 def connect(self, *args):
1444 raise socket.timeout('timed out')
1445
1446 @contextlib.contextmanager
1447 def mocked_socket_module(self):
1448 """Return a socket which times out on connect"""
1449 old_socket = socket.socket
1450 socket.socket = self.MockSocket
1451 try:
1452 yield
1453 finally:
1454 socket.socket = old_socket
1455
1456 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001457 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001458 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001459 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001460 with self.assertRaises(socket.error) as cm:
1461 cli.connect((HOST, port))
1462 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1463
1464 def test_create_connection(self):
1465 # Issue #9792: errors raised by create_connection() should have
1466 # a proper errno attribute.
1467 port = support.find_unused_port()
1468 with self.assertRaises(socket.error) as cm:
1469 socket.create_connection((HOST, port))
1470 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1471
1472 def test_create_connection_timeout(self):
1473 # Issue #9792: create_connection() should not recast timeout errors
1474 # as generic socket errors.
1475 with self.mocked_socket_module():
1476 with self.assertRaises(socket.timeout):
1477 socket.create_connection((HOST, 1234))
1478
Guido van Rossumd8faa362007-04-27 19:54:29 +00001479
Victor Stinner45df8202010-04-28 22:31:17 +00001480@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001481class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1482
1483 def __init__(self, methodName='runTest'):
1484 SocketTCPTest.__init__(self, methodName=methodName)
1485 ThreadableTest.__init__(self)
1486
1487 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001488 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001489
1490 def clientTearDown(self):
1491 self.cli.close()
1492 self.cli = None
1493 ThreadableTest.clientTearDown(self)
1494
1495 def _justAccept(self):
1496 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001497 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001498
1499 testFamily = _justAccept
1500 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001501 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001502 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001503 self.assertEqual(self.cli.family, 2)
1504
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001505 testSourceAddress = _justAccept
1506 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001507 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1508 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001509 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001510 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001511 # The port number being used is sufficient to show that the bind()
1512 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001513
Guido van Rossumd8faa362007-04-27 19:54:29 +00001514 testTimeoutDefault = _justAccept
1515 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001516 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001517 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001518 socket.setdefaulttimeout(42)
1519 try:
1520 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001521 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001522 finally:
1523 socket.setdefaulttimeout(None)
1524 self.assertEquals(self.cli.gettimeout(), 42)
1525
1526 testTimeoutNone = _justAccept
1527 def _testTimeoutNone(self):
1528 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001529 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001530 socket.setdefaulttimeout(30)
1531 try:
1532 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001533 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001534 finally:
1535 socket.setdefaulttimeout(None)
1536 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001537
1538 testTimeoutValueNamed = _justAccept
1539 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001540 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001541 self.assertEqual(self.cli.gettimeout(), 30)
1542
1543 testTimeoutValueNonamed = _justAccept
1544 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001545 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001546 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001547 self.assertEqual(self.cli.gettimeout(), 30)
1548
Victor Stinner45df8202010-04-28 22:31:17 +00001549@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001550class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1551
1552 def __init__(self, methodName='runTest'):
1553 SocketTCPTest.__init__(self, methodName=methodName)
1554 ThreadableTest.__init__(self)
1555
1556 def clientSetUp(self):
1557 pass
1558
1559 def clientTearDown(self):
1560 self.cli.close()
1561 self.cli = None
1562 ThreadableTest.clientTearDown(self)
1563
1564 def testInsideTimeout(self):
1565 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001566 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001567 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001568 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001569 testOutsideTimeout = testInsideTimeout
1570
1571 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001572 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001573 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001574 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575
1576 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001577 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001578 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001579
1580
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001581class TCPTimeoutTest(SocketTCPTest):
1582
1583 def testTCPTimeout(self):
1584 def raise_timeout(*args, **kwargs):
1585 self.serv.settimeout(1.0)
1586 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001587 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001588 "Error generating a timeout exception (TCP)")
1589
1590 def testTimeoutZero(self):
1591 ok = False
1592 try:
1593 self.serv.settimeout(0.0)
1594 foo = self.serv.accept()
1595 except socket.timeout:
1596 self.fail("caught timeout instead of error (TCP)")
1597 except socket.error:
1598 ok = True
1599 except:
1600 self.fail("caught unexpected exception (TCP)")
1601 if not ok:
1602 self.fail("accept() returned success when we did not expect it")
1603
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001604 def testInterruptedTimeout(self):
1605 # XXX I don't know how to do this test on MSWindows or any other
1606 # plaform that doesn't support signal.alarm() or os.kill(), though
1607 # the bug should have existed on all platforms.
1608 if not hasattr(signal, "alarm"):
1609 return # can only test on *nix
1610 self.serv.settimeout(5.0) # must be longer than alarm
1611 class Alarm(Exception):
1612 pass
1613 def alarm_handler(signal, frame):
1614 raise Alarm
1615 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1616 try:
1617 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1618 try:
1619 foo = self.serv.accept()
1620 except socket.timeout:
1621 self.fail("caught timeout instead of Alarm")
1622 except Alarm:
1623 pass
1624 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001625 self.fail("caught other exception instead of Alarm:"
1626 " %s(%s):\n%s" %
1627 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001628 else:
1629 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001630 finally:
1631 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001632 except Alarm:
1633 self.fail("got Alarm in wrong place")
1634 finally:
1635 # no alarm can be pending. Safe to restore old handler.
1636 signal.signal(signal.SIGALRM, old_alarm)
1637
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001638class UDPTimeoutTest(SocketTCPTest):
1639
1640 def testUDPTimeout(self):
1641 def raise_timeout(*args, **kwargs):
1642 self.serv.settimeout(1.0)
1643 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001644 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001645 "Error generating a timeout exception (UDP)")
1646
1647 def testTimeoutZero(self):
1648 ok = False
1649 try:
1650 self.serv.settimeout(0.0)
1651 foo = self.serv.recv(1024)
1652 except socket.timeout:
1653 self.fail("caught timeout instead of error (UDP)")
1654 except socket.error:
1655 ok = True
1656 except:
1657 self.fail("caught unexpected exception (UDP)")
1658 if not ok:
1659 self.fail("recv() returned success when we did not expect it")
1660
1661class TestExceptions(unittest.TestCase):
1662
1663 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001664 self.assertTrue(issubclass(socket.error, Exception))
1665 self.assertTrue(issubclass(socket.herror, socket.error))
1666 self.assertTrue(issubclass(socket.gaierror, socket.error))
1667 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001668
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001669class TestLinuxAbstractNamespace(unittest.TestCase):
1670
1671 UNIX_PATH_MAX = 108
1672
1673 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001674 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001675 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1676 s1.bind(address)
1677 s1.listen(1)
1678 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1679 s2.connect(s1.getsockname())
1680 s1.accept()
1681 self.assertEqual(s1.getsockname(), address)
1682 self.assertEqual(s2.getpeername(), address)
1683
1684 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001685 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001686 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1687 s.bind(address)
1688 self.assertEqual(s.getsockname(), address)
1689
1690 def testNameOverflow(self):
1691 address = "\x00" + "h" * self.UNIX_PATH_MAX
1692 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1693 self.assertRaises(socket.error, s.bind, address)
1694
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001695
Victor Stinner45df8202010-04-28 22:31:17 +00001696@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001697class BufferIOTest(SocketConnectedTest):
1698 """
1699 Test the buffer versions of socket.recv() and socket.send().
1700 """
1701 def __init__(self, methodName='runTest'):
1702 SocketConnectedTest.__init__(self, methodName=methodName)
1703
Antoine Pitrou25480782010-03-17 22:50:28 +00001704 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001705 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001706 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001707 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001708 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001709 self.assertEqual(msg, MSG)
1710
Antoine Pitrou25480782010-03-17 22:50:28 +00001711 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001712 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001713 self.serv_conn.send(buf)
1714
Antoine Pitrou25480782010-03-17 22:50:28 +00001715 def testRecvIntoBytearray(self):
1716 buf = bytearray(1024)
1717 nbytes = self.cli_conn.recv_into(buf)
1718 self.assertEqual(nbytes, len(MSG))
1719 msg = buf[:len(MSG)]
1720 self.assertEqual(msg, MSG)
1721
1722 _testRecvIntoBytearray = _testRecvIntoArray
1723
1724 def testRecvIntoMemoryview(self):
1725 buf = bytearray(1024)
1726 nbytes = self.cli_conn.recv_into(memoryview(buf))
1727 self.assertEqual(nbytes, len(MSG))
1728 msg = buf[:len(MSG)]
1729 self.assertEqual(msg, MSG)
1730
1731 _testRecvIntoMemoryview = _testRecvIntoArray
1732
1733 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001734 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001735 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001736 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001737 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001738 self.assertEqual(msg, MSG)
1739
Antoine Pitrou25480782010-03-17 22:50:28 +00001740 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001741 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001742 self.serv_conn.send(buf)
1743
Antoine Pitrou25480782010-03-17 22:50:28 +00001744 def testRecvFromIntoBytearray(self):
1745 buf = bytearray(1024)
1746 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1747 self.assertEqual(nbytes, len(MSG))
1748 msg = buf[:len(MSG)]
1749 self.assertEqual(msg, MSG)
1750
1751 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1752
1753 def testRecvFromIntoMemoryview(self):
1754 buf = bytearray(1024)
1755 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1756 self.assertEqual(nbytes, len(MSG))
1757 msg = buf[:len(MSG)]
1758 self.assertEqual(msg, MSG)
1759
1760 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1761
Christian Heimes043d6f62008-01-07 17:19:16 +00001762
1763TIPC_STYPE = 2000
1764TIPC_LOWER = 200
1765TIPC_UPPER = 210
1766
1767def isTipcAvailable():
1768 """Check if the TIPC module is loaded
1769
1770 The TIPC module is not loaded automatically on Ubuntu and probably
1771 other Linux distros.
1772 """
1773 if not hasattr(socket, "AF_TIPC"):
1774 return False
1775 if not os.path.isfile("/proc/modules"):
1776 return False
1777 with open("/proc/modules") as f:
1778 for line in f:
1779 if line.startswith("tipc "):
1780 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001781 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001782 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1783 return False
1784
1785class TIPCTest (unittest.TestCase):
1786 def testRDM(self):
1787 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1788 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1789
1790 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1791 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1792 TIPC_LOWER, TIPC_UPPER)
1793 srv.bind(srvaddr)
1794
1795 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1796 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1797 cli.sendto(MSG, sendaddr)
1798
1799 msg, recvaddr = srv.recvfrom(1024)
1800
1801 self.assertEqual(cli.getsockname(), recvaddr)
1802 self.assertEqual(msg, MSG)
1803
1804
1805class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1806 def __init__(self, methodName = 'runTest'):
1807 unittest.TestCase.__init__(self, methodName = methodName)
1808 ThreadableTest.__init__(self)
1809
1810 def setUp(self):
1811 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1812 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1813 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1814 TIPC_LOWER, TIPC_UPPER)
1815 self.srv.bind(srvaddr)
1816 self.srv.listen(5)
1817 self.serverExplicitReady()
1818 self.conn, self.connaddr = self.srv.accept()
1819
1820 def clientSetUp(self):
1821 # The is a hittable race between serverExplicitReady() and the
1822 # accept() call; sleep a little while to avoid it, otherwise
1823 # we could get an exception
1824 time.sleep(0.1)
1825 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1826 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1827 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1828 self.cli.connect(addr)
1829 self.cliaddr = self.cli.getsockname()
1830
1831 def testStream(self):
1832 msg = self.conn.recv(1024)
1833 self.assertEqual(msg, MSG)
1834 self.assertEqual(self.cliaddr, self.connaddr)
1835
1836 def _testStream(self):
1837 self.cli.send(MSG)
1838 self.cli.close()
1839
1840
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001841@unittest.skipUnless(thread, 'Threading required for this test.')
1842class ContextManagersTest(ThreadedTCPSocketTest):
1843
1844 def _testSocketClass(self):
1845 # base test
1846 with socket.socket() as sock:
1847 self.assertFalse(sock._closed)
1848 self.assertTrue(sock._closed)
1849 # close inside with block
1850 with socket.socket() as sock:
1851 sock.close()
1852 self.assertTrue(sock._closed)
1853 # exception inside with block
1854 with socket.socket() as sock:
1855 self.assertRaises(socket.error, sock.sendall, b'foo')
1856 self.assertTrue(sock._closed)
1857
1858 def testCreateConnectionBase(self):
1859 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001860 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001861 data = conn.recv(1024)
1862 conn.sendall(data)
1863
1864 def _testCreateConnectionBase(self):
1865 address = self.serv.getsockname()
1866 with socket.create_connection(address) as sock:
1867 self.assertFalse(sock._closed)
1868 sock.sendall(b'foo')
1869 self.assertEqual(sock.recv(1024), b'foo')
1870 self.assertTrue(sock._closed)
1871
1872 def testCreateConnectionClose(self):
1873 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001874 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001875 data = conn.recv(1024)
1876 conn.sendall(data)
1877
1878 def _testCreateConnectionClose(self):
1879 address = self.serv.getsockname()
1880 with socket.create_connection(address) as sock:
1881 sock.close()
1882 self.assertTrue(sock._closed)
1883 self.assertRaises(socket.error, sock.sendall, b'foo')
1884
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001885
Antoine Pitroub1c54962010-10-14 15:05:38 +00001886@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1887 "SOCK_CLOEXEC not defined")
1888@unittest.skipUnless(fcntl, "module fcntl not available")
1889class CloexecConstantTest(unittest.TestCase):
1890 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001891 v = linux_version()
1892 if v < (2, 6, 28):
1893 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1894 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001895 s = socket.socket(socket.AF_INET,
1896 socket.SOCK_STREAM | socket.SOCK_CLOEXEC)
1897 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1898 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
1899
1900
1901@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1902 "SOCK_NONBLOCK not defined")
1903class NonblockConstantTest(unittest.TestCase):
1904 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1905 if nonblock:
1906 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1907 self.assertEqual(s.gettimeout(), timeout)
1908 else:
1909 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1910 self.assertEqual(s.gettimeout(), None)
1911
1912 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001913 v = linux_version()
1914 if v < (2, 6, 28):
1915 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1916 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001917 # a lot of it seems silly and redundant, but I wanted to test that
1918 # changing back and forth worked ok
1919 s = socket.socket(socket.AF_INET,
1920 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
1921 self.checkNonblock(s)
1922 s.setblocking(1)
1923 self.checkNonblock(s, False)
1924 s.setblocking(0)
1925 self.checkNonblock(s)
1926 s.settimeout(None)
1927 self.checkNonblock(s, False)
1928 s.settimeout(2.0)
1929 self.checkNonblock(s, timeout=2.0)
1930 s.setblocking(1)
1931 self.checkNonblock(s, False)
1932 # defaulttimeout
1933 t = socket.getdefaulttimeout()
1934 socket.setdefaulttimeout(0.0)
1935 self.checkNonblock(socket.socket())
1936 socket.setdefaulttimeout(None)
1937 self.checkNonblock(socket.socket(), False)
1938 socket.setdefaulttimeout(2.0)
1939 self.checkNonblock(socket.socket(), timeout=2.0)
1940 socket.setdefaulttimeout(None)
1941 self.checkNonblock(socket.socket(), False)
1942 socket.setdefaulttimeout(t)
1943
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001944
Guido van Rossumb995eb72002-07-31 16:08:40 +00001945def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001946 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001947 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001948
1949 tests.extend([
1950 NonBlockingTCPTests,
1951 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001952 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001953 UnbufferedFileObjectClassTestCase,
1954 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001955 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001956 UnicodeReadFileObjectClassTestCase,
1957 UnicodeWriteFileObjectClassTestCase,
1958 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001959 NetworkConnectionNoServer,
1960 NetworkConnectionAttributesTest,
1961 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001962 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00001963 CloexecConstantTest,
1964 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00001965 ])
Dave Cole331708b2004-08-09 04:51:41 +00001966 if hasattr(socket, "socketpair"):
1967 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001968 if sys.platform == 'linux2':
1969 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001970 if isTipcAvailable():
1971 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001972 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001973
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001974 thread_info = support.threading_setup()
1975 support.run_unittest(*tests)
1976 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001977
1978if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001979 test_main()