blob: 5a5a214b9e3cf6fa9ff7d545c862eda04d7d7b36 [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
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000047MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000048SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Victor Stinner45df8202010-04-28 22:31:17 +000050try:
51 import _thread as thread
52 import threading
53except ImportError:
54 thread = None
55 threading = None
56
Guido van Rossum24e4af82002-06-12 19:18:08 +000057class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000058
Guido van Rossum24e4af82002-06-12 19:18:08 +000059 def setUp(self):
60 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000061 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000062 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000063
Guido van Rossum24e4af82002-06-12 19:18:08 +000064 def tearDown(self):
65 self.serv.close()
66 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000067
Guido van Rossum24e4af82002-06-12 19:18:08 +000068class SocketUDPTest(unittest.TestCase):
69
70 def setUp(self):
71 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000072 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000073
74 def tearDown(self):
75 self.serv.close()
76 self.serv = None
77
78class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000079 """Threadable Test class
80
81 The ThreadableTest class makes it easy to create a threaded
82 client/server pair from an existing unit test. To create a
83 new threaded class from an existing unit test, use multiple
84 inheritance:
85
86 class NewClass (OldClass, ThreadableTest):
87 pass
88
89 This class defines two new fixture functions with obvious
90 purposes for overriding:
91
92 clientSetUp ()
93 clientTearDown ()
94
95 Any new test functions within the class must then define
96 tests in pairs, where the test name is preceeded with a
97 '_' to indicate the client portion of the test. Ex:
98
99 def testFoo(self):
100 # Server portion
101
102 def _testFoo(self):
103 # Client portion
104
105 Any exceptions raised by the clients during their tests
106 are caught and transferred to the main thread to alert
107 the testing framework.
108
109 Note, the server setup function cannot call any blocking
110 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 the blocking call (such as in setting up a client/server
113 connection and performing the accept() in setUp().
114 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def __init__(self):
117 # Swap the true setup function
118 self.__setUp = self.setUp
119 self.__tearDown = self.tearDown
120 self.setUp = self._setUp
121 self.tearDown = self._tearDown
122
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 def serverExplicitReady(self):
124 """This method allows the server to explicitly indicate that
125 it wants the client thread to proceed. This is useful if the
126 server is about to execute a blocking routine that is
127 dependent upon the client thread during its setup routine."""
128 self.server_ready.set()
129
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000131 self.server_ready = threading.Event()
132 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000134 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000137 methodname = self.id()
138 i = methodname.rfind('.')
139 methodname = methodname[i+1:]
140 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000141 self.client_thread = thread.start_new_thread(
142 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000145 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.set()
147 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148
149 def _tearDown(self):
150 self.__tearDown()
151 self.done.wait()
152
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000153 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000154 exc = self.queue.get()
155 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000158 self.server_ready.wait()
159 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000161 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000162 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000163 try:
164 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000165 except BaseException as e:
166 self.queue.put(e)
167 finally:
168 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000169
170 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000171 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172
173 def clientTearDown(self):
174 self.done.set()
175 thread.exit()
176
177class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
178
179 def __init__(self, methodName='runTest'):
180 SocketTCPTest.__init__(self, methodName=methodName)
181 ThreadableTest.__init__(self)
182
183 def clientSetUp(self):
184 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
185
186 def clientTearDown(self):
187 self.cli.close()
188 self.cli = None
189 ThreadableTest.clientTearDown(self)
190
191class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
192
193 def __init__(self, methodName='runTest'):
194 SocketUDPTest.__init__(self, methodName=methodName)
195 ThreadableTest.__init__(self)
196
197 def clientSetUp(self):
198 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
199
Brian Curtin3beb38f2010-11-04 03:41:43 +0000200 def clientTearDown(self):
201 self.cli.close()
202 self.cli = None
203 ThreadableTest.clientTearDown(self)
204
Guido van Rossum24e4af82002-06-12 19:18:08 +0000205class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000206 """Socket tests for client-server connection.
207
208 self.cli_conn is a client socket connected to the server. The
209 setUp() method guarantees that it is connected to the server.
210 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211
212 def __init__(self, methodName='runTest'):
213 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
214
215 def setUp(self):
216 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000217 # Indicate explicitly we're ready for the client thread to
218 # proceed and then perform the blocking call to accept
219 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000220 conn, addr = self.serv.accept()
221 self.cli_conn = conn
222
223 def tearDown(self):
224 self.cli_conn.close()
225 self.cli_conn = None
226 ThreadedTCPSocketTest.tearDown(self)
227
228 def clientSetUp(self):
229 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000230 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 self.serv_conn = self.cli
232
233 def clientTearDown(self):
234 self.serv_conn.close()
235 self.serv_conn = None
236 ThreadedTCPSocketTest.clientTearDown(self)
237
Dave Cole331708b2004-08-09 04:51:41 +0000238class SocketPairTest(unittest.TestCase, ThreadableTest):
239
240 def __init__(self, methodName='runTest'):
241 unittest.TestCase.__init__(self, methodName=methodName)
242 ThreadableTest.__init__(self)
243
244 def setUp(self):
245 self.serv, self.cli = socket.socketpair()
246
247 def tearDown(self):
248 self.serv.close()
249 self.serv = None
250
251 def clientSetUp(self):
252 pass
253
254 def clientTearDown(self):
255 self.cli.close()
256 self.cli = None
257 ThreadableTest.clientTearDown(self)
258
Tim Peters494aaee2004-08-09 18:54:11 +0000259
Guido van Rossum24e4af82002-06-12 19:18:08 +0000260#######################################################################
261## Begin Tests
262
263class GeneralModuleTests(unittest.TestCase):
264
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000265 def test_repr(self):
266 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000267 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000269
Raymond Hettinger027bb632004-05-31 03:09:25 +0000270 def test_weakref(self):
271 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
272 p = proxy(s)
273 self.assertEqual(p.fileno(), s.fileno())
274 s.close()
275 s = None
276 try:
277 p.fileno()
278 except ReferenceError:
279 pass
280 else:
281 self.fail('Socket proxy still exists')
282
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000284 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000285 def raise_error(*args, **kwargs):
286 raise socket.error
287 def raise_herror(*args, **kwargs):
288 raise socket.herror
289 def raise_gaierror(*args, **kwargs):
290 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000291 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000293 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000295 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296 "Error raising socket exception.")
297
298 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000299 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000300 socket.AF_INET
301 socket.SOCK_STREAM
302 socket.SOCK_DGRAM
303 socket.SOCK_RAW
304 socket.SOCK_RDM
305 socket.SOCK_SEQPACKET
306 socket.SOL_SOCKET
307 socket.SO_REUSEADDR
308
Guido van Rossum654c11e2002-06-13 20:24:17 +0000309 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000310 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000311 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000312 try:
313 ip = socket.gethostbyname(hostname)
314 except socket.error:
315 # Probably name lookup wasn't set up right; skip this test
316 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000317 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000318 try:
319 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
320 except socket.error:
321 # Probably a similar problem as above; skip this test
322 return
Brett Cannon01668a12005-03-11 00:04:17 +0000323 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000324 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000325 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000326 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000327
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000328 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000329 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000330 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331 try:
332 # On some versions, this loses a reference
333 orig = sys.getrefcount(__name__)
334 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000335 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000336 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000337 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000338
Guido van Rossum24e4af82002-06-12 19:18:08 +0000339 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000340 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000341 try:
342 # On some versions, this crashes the interpreter.
343 socket.getnameinfo(('x', 0, 0, 0), 0)
344 except socket.error:
345 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000346
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000347 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000348 # This just checks that htons etc. are their own inverse,
349 # when looking at the lower 16 or 32 bits.
350 sizes = {socket.htonl: 32, socket.ntohl: 32,
351 socket.htons: 16, socket.ntohs: 16}
352 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000353 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000354 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
355 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000356
Guido van Rossuma2627af2002-09-14 00:58:46 +0000357 swapped = func(mask)
358 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000359 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000360
Guido van Rossum018919a2007-01-15 00:07:32 +0000361 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000362 good_values = [ 1, 2, 3, 1, 2, 3 ]
363 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000364 for k in good_values:
365 socket.ntohl(k)
366 socket.ntohs(k)
367 socket.htonl(k)
368 socket.htons(k)
369 for k in bad_values:
370 self.assertRaises(OverflowError, socket.ntohl, k)
371 self.assertRaises(OverflowError, socket.ntohs, k)
372 self.assertRaises(OverflowError, socket.htonl, k)
373 self.assertRaises(OverflowError, socket.htons, k)
374
Barry Warsaw11b91a02004-06-28 00:50:43 +0000375 def testGetServBy(self):
376 eq = self.assertEqual
377 # Find one service that exists, then check all the related interfaces.
378 # I've ordered this by protocols that have both a tcp and udp
379 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000380 if (sys.platform.startswith('linux') or
381 sys.platform.startswith('freebsd') or
382 sys.platform.startswith('netbsd') or
383 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000384 # avoid the 'echo' service on this platform, as there is an
385 # assumption breaking non-standard port/protocol entry
386 services = ('daytime', 'qotd', 'domain')
387 else:
388 services = ('echo', 'daytime', 'domain')
389 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000390 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000391 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000392 break
393 except socket.error:
394 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000395 else:
396 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000397 # Try same call with optional protocol omitted
398 port2 = socket.getservbyname(service)
399 eq(port, port2)
400 # Try udp, but don't barf it it doesn't exist
401 try:
402 udpport = socket.getservbyname(service, 'udp')
403 except socket.error:
404 udpport = None
405 else:
406 eq(udpport, port)
407 # Now make sure the lookup by port returns the same service name
408 eq(socket.getservbyport(port2), service)
409 eq(socket.getservbyport(port, 'tcp'), service)
410 if udpport is not None:
411 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000412 # Make sure getservbyport does not accept out of range ports.
413 self.assertRaises(OverflowError, socket.getservbyport, -1)
414 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000415
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000416 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000417 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000418 # The default timeout should initially be None
419 self.assertEqual(socket.getdefaulttimeout(), None)
420 s = socket.socket()
421 self.assertEqual(s.gettimeout(), None)
422 s.close()
423
424 # Set the default timeout to 10, and see if it propagates
425 socket.setdefaulttimeout(10)
426 self.assertEqual(socket.getdefaulttimeout(), 10)
427 s = socket.socket()
428 self.assertEqual(s.gettimeout(), 10)
429 s.close()
430
431 # Reset the default timeout to None, and see if it propagates
432 socket.setdefaulttimeout(None)
433 self.assertEqual(socket.getdefaulttimeout(), None)
434 s = socket.socket()
435 self.assertEqual(s.gettimeout(), None)
436 s.close()
437
438 # Check that setting it to an invalid value raises ValueError
439 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
440
441 # Check that setting it to an invalid type raises TypeError
442 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
443
Benjamin Petersonf91df042009-02-13 02:50:59 +0000444 def testIPv4_inet_aton_fourbytes(self):
445 if not hasattr(socket, 'inet_aton'):
446 return # No inet_aton, nothing to check
447 # Test that issue1008086 and issue767150 are fixed.
448 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000449 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
450 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000451
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000452 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000453 if not hasattr(socket, 'inet_pton'):
454 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000455 from socket import inet_aton as f, inet_pton, AF_INET
456 g = lambda a: inet_pton(AF_INET, a)
457
Ezio Melottib3aedd42010-11-20 19:04:17 +0000458 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
459 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
460 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
461 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
462 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000463
Ezio Melottib3aedd42010-11-20 19:04:17 +0000464 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
465 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
466 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
467 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000468
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000469 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000470 if not hasattr(socket, 'inet_pton'):
471 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000472 try:
473 from socket import inet_pton, AF_INET6, has_ipv6
474 if not has_ipv6:
475 return
476 except ImportError:
477 return
478 f = lambda a: inet_pton(AF_INET6, a)
479
Ezio Melottib3aedd42010-11-20 19:04:17 +0000480 self.assertEqual(b'\x00' * 16, f('::'))
481 self.assertEqual(b'\x00' * 16, f('0::0'))
482 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
483 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000484 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000485 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
486 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000487
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000488 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000489 if not hasattr(socket, 'inet_ntop'):
490 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000491 from socket import inet_ntoa as f, inet_ntop, AF_INET
492 g = lambda a: inet_ntop(AF_INET, a)
493
Ezio Melottib3aedd42010-11-20 19:04:17 +0000494 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
495 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
496 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
497 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000498
Ezio Melottib3aedd42010-11-20 19:04:17 +0000499 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
500 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
501 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000502
503 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000504 if not hasattr(socket, 'inet_ntop'):
505 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000506 try:
507 from socket import inet_ntop, AF_INET6, has_ipv6
508 if not has_ipv6:
509 return
510 except ImportError:
511 return
512 f = lambda a: inet_ntop(AF_INET6, a)
513
Ezio Melottib3aedd42010-11-20 19:04:17 +0000514 self.assertEqual('::', f(b'\x00' * 16))
515 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
516 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000517 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000518 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000519 )
520
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000521 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000522
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000523 def _get_unused_port(self, bind_address='0.0.0.0'):
524 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000525
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000526 Args:
527 bind_address: Hostname or IP address to search for a port on.
528
529 Returns: A most likely to be unused port.
530 """
531 tempsock = socket.socket()
532 tempsock.bind((bind_address, 0))
533 host, port = tempsock.getsockname()
534 tempsock.close()
535 return port
536
537 def testSockName(self):
538 # Testing getsockname()
539 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000541 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000542 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000543 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000544 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
545 # it reasonable to get the host's addr in addition to 0.0.0.0.
546 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000547 try:
548 my_ip_addr = socket.gethostbyname(socket.gethostname())
549 except socket.error:
550 # Probably name lookup wasn't set up right; skip this test
551 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000552 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000553 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000554
555 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000556 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557 # We know a socket should start without reuse==0
558 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000559 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000561 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562
563 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000564 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000566 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000567 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
568 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000569 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000570
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000571 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000572 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000573 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
574 sock.settimeout(1)
575 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000576 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000577
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000578 def testNewAttributes(self):
579 # testing .family, .type and .protocol
580 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
581 self.assertEqual(sock.family, socket.AF_INET)
582 self.assertEqual(sock.type, socket.SOCK_STREAM)
583 self.assertEqual(sock.proto, 0)
584 sock.close()
585
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000586 def test_getsockaddrarg(self):
587 host = '0.0.0.0'
588 port = self._get_unused_port(bind_address=host)
589 big_port = port + 65536
590 neg_port = port - 65536
591 sock = socket.socket()
592 try:
593 self.assertRaises(OverflowError, sock.bind, (host, big_port))
594 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
595 sock.bind((host, port))
596 finally:
597 sock.close()
598
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000599 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000600 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000601 self.assertTrue(hasattr(socket.socket, 'ioctl'))
602 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
603 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
604 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000605 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
606 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000607 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000608 self.assertRaises(ValueError, s.ioctl, -1, None)
609 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000610
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000611 def testGetaddrinfo(self):
612 try:
613 socket.getaddrinfo('localhost', 80)
614 except socket.gaierror as err:
615 if err.errno == socket.EAI_SERVICE:
616 # see http://bugs.python.org/issue1282647
617 self.skipTest("buggy libc version")
618 raise
619 # len of every sequence is supposed to be == 5
620 for info in socket.getaddrinfo(HOST, None):
621 self.assertEqual(len(info), 5)
622 # host can be a domain name, a string representation of an
623 # IPv4/v6 address or None
624 socket.getaddrinfo('localhost', 80)
625 socket.getaddrinfo('127.0.0.1', 80)
626 socket.getaddrinfo(None, 80)
627 if SUPPORTS_IPV6:
628 socket.getaddrinfo('::1', 80)
629 # port can be a string service name such as "http", a numeric
630 # port number or None
631 socket.getaddrinfo(HOST, "http")
632 socket.getaddrinfo(HOST, 80)
633 socket.getaddrinfo(HOST, None)
634 # test family and socktype filters
635 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
636 for family, _, _, _, _ in infos:
637 self.assertEqual(family, socket.AF_INET)
638 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
639 for _, socktype, _, _, _ in infos:
640 self.assertEqual(socktype, socket.SOCK_STREAM)
641 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000642 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000643 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
644 # a server willing to support both IPv4 and IPv6 will
645 # usually do this
646 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
647 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000648 # test keyword arguments
649 a = socket.getaddrinfo(HOST, None)
650 b = socket.getaddrinfo(host=HOST, port=None)
651 self.assertEqual(a, b)
652 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
653 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
654 self.assertEqual(a, b)
655 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
656 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
657 self.assertEqual(a, b)
658 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
659 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
660 self.assertEqual(a, b)
661 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
662 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
663 self.assertEqual(a, b)
664 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
665 socket.AI_PASSIVE)
666 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
667 type=socket.SOCK_STREAM, proto=0,
668 flags=socket.AI_PASSIVE)
669 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000670 # Issue #6697.
671 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000672
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000673 def test_getnameinfo(self):
674 # only IP addresses are allowed
675 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
676
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000677 @unittest.skipUnless(support.is_resource_enabled('network'),
678 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000679 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000680 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000681 # these should all be successful
682 socket.gethostbyname('испытание.python.org')
683 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000684 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
685 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
686 # have a reverse entry yet
687 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000688
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000689 def check_sendall_interrupted(self, with_timeout):
690 # socketpair() is not stricly required, but it makes things easier.
691 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
692 self.skipTest("signal.alarm and socket.socketpair required for this test")
693 # Our signal handlers clobber the C errno by calling a math function
694 # with an invalid domain value.
695 def ok_handler(*args):
696 self.assertRaises(ValueError, math.acosh, 0)
697 def raising_handler(*args):
698 self.assertRaises(ValueError, math.acosh, 0)
699 1 // 0
700 c, s = socket.socketpair()
701 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
702 try:
703 if with_timeout:
704 # Just above the one second minimum for signal.alarm
705 c.settimeout(1.5)
706 with self.assertRaises(ZeroDivisionError):
707 signal.alarm(1)
708 c.sendall(b"x" * (1024**2))
709 if with_timeout:
710 signal.signal(signal.SIGALRM, ok_handler)
711 signal.alarm(1)
712 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
713 finally:
714 signal.signal(signal.SIGALRM, old_alarm)
715 c.close()
716 s.close()
717
718 def test_sendall_interrupted(self):
719 self.check_sendall_interrupted(False)
720
721 def test_sendall_interrupted_with_timeout(self):
722 self.check_sendall_interrupted(True)
723
Antoine Pitroue033e062010-10-29 10:38:18 +0000724 def test_dealloc_warn(self):
725 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
726 r = repr(sock)
727 with self.assertWarns(ResourceWarning) as cm:
728 sock = None
729 support.gc_collect()
730 self.assertIn(r, str(cm.warning.args[0]))
731 # An open socket file object gets dereferenced after the socket
732 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
733 f = sock.makefile('rb')
734 r = repr(sock)
735 sock = None
736 support.gc_collect()
737 with self.assertWarns(ResourceWarning):
738 f = None
739 support.gc_collect()
740
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000741 def test_name_closed_socketio(self):
742 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
743 fp = sock.makefile("rb")
744 fp.close()
745 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
746
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000747
Victor Stinner45df8202010-04-28 22:31:17 +0000748@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749class BasicTCPTest(SocketConnectedTest):
750
751 def __init__(self, methodName='runTest'):
752 SocketConnectedTest.__init__(self, methodName=methodName)
753
754 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000755 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000757 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758
759 def _testRecv(self):
760 self.serv_conn.send(MSG)
761
762 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000763 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764 seg1 = self.cli_conn.recv(len(MSG) - 3)
765 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000766 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000767 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768
769 def _testOverFlowRecv(self):
770 self.serv_conn.send(MSG)
771
772 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000773 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000775 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776
777 def _testRecvFrom(self):
778 self.serv_conn.send(MSG)
779
780 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000781 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
783 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000784 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000785 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786
787 def _testOverFlowRecvFrom(self):
788 self.serv_conn.send(MSG)
789
790 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000791 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000792 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793 while 1:
794 read = self.cli_conn.recv(1024)
795 if not read:
796 break
Guido van Rossume531e292002-08-08 20:28:34 +0000797 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000798 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000799
800 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000801 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802 self.serv_conn.sendall(big_chunk)
803
804 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000805 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000806 fd = self.cli_conn.fileno()
807 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000808 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000809 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000810 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000811 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812
813 def _testFromFd(self):
814 self.serv_conn.send(MSG)
815
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000816 def testDup(self):
817 # Testing dup()
818 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000819 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000820 msg = sock.recv(1024)
821 self.assertEqual(msg, MSG)
822
823 def _testDup(self):
824 self.serv_conn.send(MSG)
825
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000827 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000829 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000830 # wait for _testShutdown to finish: on OS X, when the server
831 # closes the connection the client also becomes disconnected,
832 # and the client's shutdown call will fail. (Issue #4397.)
833 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834
835 def _testShutdown(self):
836 self.serv_conn.send(MSG)
837 self.serv_conn.shutdown(2)
838
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000839 def testDetach(self):
840 # Testing detach()
841 fileno = self.cli_conn.fileno()
842 f = self.cli_conn.detach()
843 self.assertEqual(f, fileno)
844 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000845 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
846 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000847 # ...but we can create another socket using the (still open)
848 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000849 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000850 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000851 msg = sock.recv(1024)
852 self.assertEqual(msg, MSG)
853
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000854 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000855 self.serv_conn.send(MSG)
856
Victor Stinner45df8202010-04-28 22:31:17 +0000857@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858class BasicUDPTest(ThreadedUDPSocketTest):
859
860 def __init__(self, methodName='runTest'):
861 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
862
863 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000864 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000866 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867
868 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000869 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870
Guido van Rossum1c938012002-06-12 21:17:20 +0000871 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000872 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000873 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000874 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000875
Guido van Rossum1c938012002-06-12 21:17:20 +0000876 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000877 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878
Guido van Rossumd8faa362007-04-27 19:54:29 +0000879 def testRecvFromNegative(self):
880 # Negative lengths passed to recvfrom should give ValueError.
881 self.assertRaises(ValueError, self.serv.recvfrom, -1)
882
883 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000884 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000885
Victor Stinner45df8202010-04-28 22:31:17 +0000886@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000887class TCPCloserTest(ThreadedTCPSocketTest):
888
889 def testClose(self):
890 conn, addr = self.serv.accept()
891 conn.close()
892
893 sd = self.cli
894 read, write, err = select.select([sd], [], [], 1.0)
895 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000896 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000897
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000898 # Calling close() many times should be safe.
899 conn.close()
900 conn.close()
901
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000902 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000903 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000904 time.sleep(1.0)
905
Victor Stinner45df8202010-04-28 22:31:17 +0000906@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000907class BasicSocketPairTest(SocketPairTest):
908
909 def __init__(self, methodName='runTest'):
910 SocketPairTest.__init__(self, methodName=methodName)
911
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000912 def _check_defaults(self, sock):
913 self.assertIsInstance(sock, socket.socket)
914 if hasattr(socket, 'AF_UNIX'):
915 self.assertEqual(sock.family, socket.AF_UNIX)
916 else:
917 self.assertEqual(sock.family, socket.AF_INET)
918 self.assertEqual(sock.type, socket.SOCK_STREAM)
919 self.assertEqual(sock.proto, 0)
920
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000921 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000922 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000923
924 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000925 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000926
Dave Cole331708b2004-08-09 04:51:41 +0000927 def testRecv(self):
928 msg = self.serv.recv(1024)
929 self.assertEqual(msg, MSG)
930
931 def _testRecv(self):
932 self.cli.send(MSG)
933
934 def testSend(self):
935 self.serv.send(MSG)
936
937 def _testSend(self):
938 msg = self.cli.recv(1024)
939 self.assertEqual(msg, MSG)
940
Victor Stinner45df8202010-04-28 22:31:17 +0000941@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942class NonBlockingTCPTests(ThreadedTCPSocketTest):
943
944 def __init__(self, methodName='runTest'):
945 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
946
947 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000948 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000949 self.serv.setblocking(0)
950 start = time.time()
951 try:
952 self.serv.accept()
953 except socket.error:
954 pass
955 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000956 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000957
958 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000959 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000960
Antoine Pitroub1c54962010-10-14 15:05:38 +0000961 if hasattr(socket, "SOCK_NONBLOCK"):
962 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000963 v = linux_version()
964 if v < (2, 6, 28):
965 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
966 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +0000967 # reinit server socket
968 self.serv.close()
969 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000970 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000971 self.port = support.bind_port(self.serv)
972 self.serv.listen(1)
973 # actual testing
974 start = time.time()
975 try:
976 self.serv.accept()
977 except socket.error:
978 pass
979 end = time.time()
980 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
981
982 def _testInitNonBlocking(self):
983 pass
984
Antoine Pitrou600232b2011-01-05 21:03:42 +0000985 def testInheritFlags(self):
986 # Issue #7995: when calling accept() on a listening socket with a
987 # timeout, the resulting socket should not be non-blocking.
988 self.serv.settimeout(10)
989 try:
990 conn, addr = self.serv.accept()
991 message = conn.recv(len(MSG))
992 finally:
993 conn.close()
994 self.serv.settimeout(None)
995
996 def _testInheritFlags(self):
997 time.sleep(0.1)
998 self.cli.connect((HOST, self.port))
999 time.sleep(0.5)
1000 self.cli.send(MSG)
1001
Guido van Rossum24e4af82002-06-12 19:18:08 +00001002 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001003 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001005 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001006 conn, addr = self.serv.accept()
1007 except socket.error:
1008 pass
1009 else:
1010 self.fail("Error trying to do non-blocking accept.")
1011 read, write, err = select.select([self.serv], [], [])
1012 if self.serv in read:
1013 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001014 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001015 else:
1016 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001017
Guido van Rossum24e4af82002-06-12 19:18:08 +00001018 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001019 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001020 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001021
1022 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001023 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001024 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001025 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001026
1027 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001028 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001029 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001030
1031 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001032 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001033 conn, addr = self.serv.accept()
1034 conn.setblocking(0)
1035 try:
1036 msg = conn.recv(len(MSG))
1037 except socket.error:
1038 pass
1039 else:
1040 self.fail("Error trying to do non-blocking recv.")
1041 read, write, err = select.select([conn], [], [])
1042 if conn in read:
1043 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001044 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001045 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001046 else:
1047 self.fail("Error during select call to non-blocking socket.")
1048
1049 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001050 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001051 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001052 self.cli.send(MSG)
1053
Victor Stinner45df8202010-04-28 22:31:17 +00001054@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001056 """Unit tests for the object returned by socket.makefile()
1057
Antoine Pitrou834bd812010-10-13 16:17:14 +00001058 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001059 the client connection. You can read from this file to
1060 get output from the server.
1061
Antoine Pitrou834bd812010-10-13 16:17:14 +00001062 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001063 server connection. You can write to this file to send output
1064 to the client.
1065 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066
Guido van Rossume9f66142002-08-07 15:46:19 +00001067 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001068 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001069 errors = 'strict'
1070 newline = None
1071
1072 read_mode = 'rb'
1073 read_msg = MSG
1074 write_mode = 'wb'
1075 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001076
Guido van Rossum24e4af82002-06-12 19:18:08 +00001077 def __init__(self, methodName='runTest'):
1078 SocketConnectedTest.__init__(self, methodName=methodName)
1079
1080 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001081 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1082 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001083 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001084 self.read_file = self.cli_conn.makefile(
1085 self.read_mode, self.bufsize,
1086 encoding = self.encoding,
1087 errors = self.errors,
1088 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089
1090 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001091 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001092 self.read_file.close()
1093 self.assertTrue(self.read_file.closed)
1094 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001095 SocketConnectedTest.tearDown(self)
1096
1097 def clientSetUp(self):
1098 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001099 self.write_file = self.serv_conn.makefile(
1100 self.write_mode, self.bufsize,
1101 encoding = self.encoding,
1102 errors = self.errors,
1103 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001104
1105 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001106 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001107 self.write_file.close()
1108 self.assertTrue(self.write_file.closed)
1109 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001110 SocketConnectedTest.clientTearDown(self)
1111
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001112 def testReadAfterTimeout(self):
1113 # Issue #7322: A file object must disallow further reads
1114 # after a timeout has occurred.
1115 self.cli_conn.settimeout(1)
1116 self.read_file.read(3)
1117 # First read raises a timeout
1118 self.assertRaises(socket.timeout, self.read_file.read, 1)
1119 # Second read is disallowed
1120 with self.assertRaises(IOError) as ctx:
1121 self.read_file.read(1)
1122 self.assertIn("cannot read from timed out object", str(ctx.exception))
1123
1124 def _testReadAfterTimeout(self):
1125 self.write_file.write(self.write_msg[0:3])
1126 self.write_file.flush()
1127 self.serv_finished.wait()
1128
Guido van Rossum24e4af82002-06-12 19:18:08 +00001129 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001130 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001131 first_seg = self.read_file.read(len(self.read_msg)-3)
1132 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001133 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001134 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001135
1136 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001137 self.write_file.write(self.write_msg)
1138 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001139
Guido van Rossum8c943832002-08-08 01:00:28 +00001140 def testFullRead(self):
1141 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001142 msg = self.read_file.read()
1143 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001144
1145 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001146 self.write_file.write(self.write_msg)
1147 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001148
Guido van Rossum24e4af82002-06-12 19:18:08 +00001149 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001150 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001151 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001152 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001153 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001154 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001156 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001157 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001158
1159 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001160 self.write_file.write(self.write_msg)
1161 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001162
1163 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001164 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001165 line = self.read_file.readline()
1166 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001167
1168 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001169 self.write_file.write(self.write_msg)
1170 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001171
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001172 def testCloseAfterMakefile(self):
1173 # The file returned by makefile should keep the socket open.
1174 self.cli_conn.close()
1175 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001176 msg = self.read_file.read()
1177 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001178
1179 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001180 self.write_file.write(self.write_msg)
1181 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001182
1183 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001184 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001185 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001186 if isinstance(self.read_msg, str):
1187 msg = msg.decode()
1188 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001189
1190 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001191 self.write_file.write(self.write_msg)
1192 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001193
Tim Peters116d83c2004-03-28 02:20:45 +00001194 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001195 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001196
1197 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001198 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001199
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001200 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001201 self.assertEqual(self.read_file.mode, self.read_mode)
1202 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001203
1204 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001205 self.assertEqual(self.write_file.mode, self.write_mode)
1206 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001207
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001208 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001209 self.read_file.close()
1210 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001211 self.cli_conn.close()
1212 self.assertRaises(socket.error, self.cli_conn.getsockname)
1213
1214 def _testRealClose(self):
1215 pass
1216
1217
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001218class FileObjectInterruptedTestCase(unittest.TestCase):
1219 """Test that the file object correctly handles EINTR internally."""
1220
1221 class MockSocket(object):
1222 def __init__(self, recv_funcs=()):
1223 # A generator that returns callables that we'll call for each
1224 # call to recv().
1225 self._recv_step = iter(recv_funcs)
1226
1227 def recv_into(self, buffer):
1228 data = next(self._recv_step)()
1229 assert len(buffer) >= len(data)
1230 buffer[:len(data)] = data
1231 return len(data)
1232
1233 def _decref_socketios(self):
1234 pass
1235
1236 def _textiowrap_for_test(self, buffering=-1):
1237 raw = socket.SocketIO(self, "r")
1238 if buffering < 0:
1239 buffering = io.DEFAULT_BUFFER_SIZE
1240 if buffering == 0:
1241 return raw
1242 buffer = io.BufferedReader(raw, buffering)
1243 text = io.TextIOWrapper(buffer, None, None)
1244 text.mode = "rb"
1245 return text
1246
1247 @staticmethod
1248 def _raise_eintr():
1249 raise socket.error(errno.EINTR)
1250
1251 def _textiowrap_mock_socket(self, mock, buffering=-1):
1252 raw = socket.SocketIO(mock, "r")
1253 if buffering < 0:
1254 buffering = io.DEFAULT_BUFFER_SIZE
1255 if buffering == 0:
1256 return raw
1257 buffer = io.BufferedReader(raw, buffering)
1258 text = io.TextIOWrapper(buffer, None, None)
1259 text.mode = "rb"
1260 return text
1261
1262 def _test_readline(self, size=-1, buffering=-1):
1263 mock_sock = self.MockSocket(recv_funcs=[
1264 lambda : b"This is the first line\nAnd the sec",
1265 self._raise_eintr,
1266 lambda : b"ond line is here\n",
1267 lambda : b"",
1268 lambda : b"", # XXX(gps): io library does an extra EOF read
1269 ])
1270 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001271 self.assertEqual(fo.readline(size), "This is the first line\n")
1272 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001273
1274 def _test_read(self, size=-1, buffering=-1):
1275 mock_sock = self.MockSocket(recv_funcs=[
1276 lambda : b"This is the first line\nAnd the sec",
1277 self._raise_eintr,
1278 lambda : b"ond line is here\n",
1279 lambda : b"",
1280 lambda : b"", # XXX(gps): io library does an extra EOF read
1281 ])
1282 expecting = (b"This is the first line\n"
1283 b"And the second line is here\n")
1284 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1285 if buffering == 0:
1286 data = b''
1287 else:
1288 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001289 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001290 while len(data) != len(expecting):
1291 part = fo.read(size)
1292 if not part:
1293 break
1294 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001295 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001296
1297 def test_default(self):
1298 self._test_readline()
1299 self._test_readline(size=100)
1300 self._test_read()
1301 self._test_read(size=100)
1302
1303 def test_with_1k_buffer(self):
1304 self._test_readline(buffering=1024)
1305 self._test_readline(size=100, buffering=1024)
1306 self._test_read(buffering=1024)
1307 self._test_read(size=100, buffering=1024)
1308
1309 def _test_readline_no_buffer(self, size=-1):
1310 mock_sock = self.MockSocket(recv_funcs=[
1311 lambda : b"a",
1312 lambda : b"\n",
1313 lambda : b"B",
1314 self._raise_eintr,
1315 lambda : b"b",
1316 lambda : b"",
1317 ])
1318 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001319 self.assertEqual(fo.readline(size), b"a\n")
1320 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001321
1322 def test_no_buffer(self):
1323 self._test_readline_no_buffer()
1324 self._test_readline_no_buffer(size=4)
1325 self._test_read(buffering=0)
1326 self._test_read(size=100, buffering=0)
1327
1328
Guido van Rossume9f66142002-08-07 15:46:19 +00001329class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1330
1331 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001332
Guido van Rossume9f66142002-08-07 15:46:19 +00001333 In this case (and in this case only), it should be possible to
1334 create a file object, read a line from it, create another file
1335 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001336 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001337 when reading multiple requests from the same socket."""
1338
1339 bufsize = 0 # Use unbuffered mode
1340
1341 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001342 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001343 line = self.read_file.readline() # first line
1344 self.assertEqual(line, b"A. " + self.write_msg) # first line
1345 self.read_file = self.cli_conn.makefile('rb', 0)
1346 line = self.read_file.readline() # second line
1347 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001348
1349 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001350 self.write_file.write(b"A. " + self.write_msg)
1351 self.write_file.write(b"B. " + self.write_msg)
1352 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001353
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001354 def testMakefileClose(self):
1355 # The file returned by makefile should keep the socket open...
1356 self.cli_conn.close()
1357 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001358 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001359 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001360 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001361 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1362
1363 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001364 self.write_file.write(self.write_msg)
1365 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001366
1367 def testMakefileCloseSocketDestroy(self):
1368 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001369 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001370 refcount_after = sys.getrefcount(self.cli_conn)
1371 self.assertEqual(refcount_before - 1, refcount_after)
1372
1373 def _testMakefileCloseSocketDestroy(self):
1374 pass
1375
Antoine Pitrou98b46702010-09-18 22:59:00 +00001376 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001377 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001378 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1379
1380 def testSmallReadNonBlocking(self):
1381 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001382 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1383 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001384 self.evt1.set()
1385 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001386 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001387 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001388 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001389 self.assertEqual(n, 3)
1390 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001391 self.assertEqual(msg, self.read_msg)
1392 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1393 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001394
1395 def _testSmallReadNonBlocking(self):
1396 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001397 self.write_file.write(self.write_msg)
1398 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001399 self.evt2.set()
1400 # Avoid cloding the socket before the server test has finished,
1401 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1402 self.serv_finished.wait(5.0)
1403
1404 def testWriteNonBlocking(self):
1405 self.cli_finished.wait(5.0)
1406 # The client thread can't skip directly - the SkipTest exception
1407 # would appear as a failure.
1408 if self.serv_skipped:
1409 self.skipTest(self.serv_skipped)
1410
1411 def _testWriteNonBlocking(self):
1412 self.serv_skipped = None
1413 self.serv_conn.setblocking(False)
1414 # Try to saturate the socket buffer pipe with repeated large writes.
1415 BIG = b"x" * (1024 ** 2)
1416 LIMIT = 10
1417 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001418 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001419 self.assertGreater(n, 0)
1420 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001421 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001422 if n is None:
1423 # Succeeded
1424 break
1425 self.assertGreater(n, 0)
1426 else:
1427 # Let us know that this test didn't manage to establish
1428 # the expected conditions. This is not a failure in itself but,
1429 # if it happens repeatedly, the test should be fixed.
1430 self.serv_skipped = "failed to saturate the socket buffer"
1431
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001432
Guido van Rossum8c943832002-08-08 01:00:28 +00001433class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1434
1435 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1436
1437
1438class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1439
1440 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001441
Thomas Woutersb2137042007-02-01 18:02:27 +00001442
Antoine Pitrou834bd812010-10-13 16:17:14 +00001443class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1444 """Tests for socket.makefile() in text mode (rather than binary)"""
1445
1446 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001447 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001448 write_mode = 'wb'
1449 write_msg = MSG
1450 newline = ''
1451
1452
1453class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1454 """Tests for socket.makefile() in text mode (rather than binary)"""
1455
1456 read_mode = 'rb'
1457 read_msg = MSG
1458 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001459 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001460 newline = ''
1461
1462
1463class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1464 """Tests for socket.makefile() in text mode (rather than binary)"""
1465
1466 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001467 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001468 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001469 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001470 newline = ''
1471
1472
Guido van Rossumd8faa362007-04-27 19:54:29 +00001473class NetworkConnectionTest(object):
1474 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001475
Guido van Rossumd8faa362007-04-27 19:54:29 +00001476 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001477 # We're inherited below by BasicTCPTest2, which also inherits
1478 # BasicTCPTest, which defines self.port referenced below.
1479 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001480 self.serv_conn = self.cli
1481
1482class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1483 """Tests that NetworkConnection does not break existing TCP functionality.
1484 """
1485
1486class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001487
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001488 class MockSocket(socket.socket):
1489 def connect(self, *args):
1490 raise socket.timeout('timed out')
1491
1492 @contextlib.contextmanager
1493 def mocked_socket_module(self):
1494 """Return a socket which times out on connect"""
1495 old_socket = socket.socket
1496 socket.socket = self.MockSocket
1497 try:
1498 yield
1499 finally:
1500 socket.socket = old_socket
1501
1502 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001503 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001504 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001505 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001506 with self.assertRaises(socket.error) as cm:
1507 cli.connect((HOST, port))
1508 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1509
1510 def test_create_connection(self):
1511 # Issue #9792: errors raised by create_connection() should have
1512 # a proper errno attribute.
1513 port = support.find_unused_port()
1514 with self.assertRaises(socket.error) as cm:
1515 socket.create_connection((HOST, port))
1516 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1517
1518 def test_create_connection_timeout(self):
1519 # Issue #9792: create_connection() should not recast timeout errors
1520 # as generic socket errors.
1521 with self.mocked_socket_module():
1522 with self.assertRaises(socket.timeout):
1523 socket.create_connection((HOST, 1234))
1524
Guido van Rossumd8faa362007-04-27 19:54:29 +00001525
Victor Stinner45df8202010-04-28 22:31:17 +00001526@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001527class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1528
1529 def __init__(self, methodName='runTest'):
1530 SocketTCPTest.__init__(self, methodName=methodName)
1531 ThreadableTest.__init__(self)
1532
1533 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001534 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001535
1536 def clientTearDown(self):
1537 self.cli.close()
1538 self.cli = None
1539 ThreadableTest.clientTearDown(self)
1540
1541 def _justAccept(self):
1542 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001543 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001544
1545 testFamily = _justAccept
1546 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001547 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001548 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001549 self.assertEqual(self.cli.family, 2)
1550
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001551 testSourceAddress = _justAccept
1552 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001553 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1554 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001555 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001556 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001557 # The port number being used is sufficient to show that the bind()
1558 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001559
Guido van Rossumd8faa362007-04-27 19:54:29 +00001560 testTimeoutDefault = _justAccept
1561 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001562 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001563 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001564 socket.setdefaulttimeout(42)
1565 try:
1566 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001567 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001568 finally:
1569 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001570 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001571
1572 testTimeoutNone = _justAccept
1573 def _testTimeoutNone(self):
1574 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001575 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001576 socket.setdefaulttimeout(30)
1577 try:
1578 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001579 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001580 finally:
1581 socket.setdefaulttimeout(None)
1582 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001583
1584 testTimeoutValueNamed = _justAccept
1585 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001586 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001587 self.assertEqual(self.cli.gettimeout(), 30)
1588
1589 testTimeoutValueNonamed = _justAccept
1590 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001591 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001592 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001593 self.assertEqual(self.cli.gettimeout(), 30)
1594
Victor Stinner45df8202010-04-28 22:31:17 +00001595@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001596class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1597
1598 def __init__(self, methodName='runTest'):
1599 SocketTCPTest.__init__(self, methodName=methodName)
1600 ThreadableTest.__init__(self)
1601
1602 def clientSetUp(self):
1603 pass
1604
1605 def clientTearDown(self):
1606 self.cli.close()
1607 self.cli = None
1608 ThreadableTest.clientTearDown(self)
1609
1610 def testInsideTimeout(self):
1611 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001612 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001613 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001614 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001615 testOutsideTimeout = testInsideTimeout
1616
1617 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001618 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001619 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001620 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001621
1622 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001623 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001624 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001625
1626
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001627class TCPTimeoutTest(SocketTCPTest):
1628
1629 def testTCPTimeout(self):
1630 def raise_timeout(*args, **kwargs):
1631 self.serv.settimeout(1.0)
1632 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001633 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001634 "Error generating a timeout exception (TCP)")
1635
1636 def testTimeoutZero(self):
1637 ok = False
1638 try:
1639 self.serv.settimeout(0.0)
1640 foo = self.serv.accept()
1641 except socket.timeout:
1642 self.fail("caught timeout instead of error (TCP)")
1643 except socket.error:
1644 ok = True
1645 except:
1646 self.fail("caught unexpected exception (TCP)")
1647 if not ok:
1648 self.fail("accept() returned success when we did not expect it")
1649
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001650 def testInterruptedTimeout(self):
1651 # XXX I don't know how to do this test on MSWindows or any other
1652 # plaform that doesn't support signal.alarm() or os.kill(), though
1653 # the bug should have existed on all platforms.
1654 if not hasattr(signal, "alarm"):
1655 return # can only test on *nix
1656 self.serv.settimeout(5.0) # must be longer than alarm
1657 class Alarm(Exception):
1658 pass
1659 def alarm_handler(signal, frame):
1660 raise Alarm
1661 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1662 try:
1663 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1664 try:
1665 foo = self.serv.accept()
1666 except socket.timeout:
1667 self.fail("caught timeout instead of Alarm")
1668 except Alarm:
1669 pass
1670 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001671 self.fail("caught other exception instead of Alarm:"
1672 " %s(%s):\n%s" %
1673 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001674 else:
1675 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001676 finally:
1677 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001678 except Alarm:
1679 self.fail("got Alarm in wrong place")
1680 finally:
1681 # no alarm can be pending. Safe to restore old handler.
1682 signal.signal(signal.SIGALRM, old_alarm)
1683
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001684class UDPTimeoutTest(SocketTCPTest):
1685
1686 def testUDPTimeout(self):
1687 def raise_timeout(*args, **kwargs):
1688 self.serv.settimeout(1.0)
1689 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001690 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001691 "Error generating a timeout exception (UDP)")
1692
1693 def testTimeoutZero(self):
1694 ok = False
1695 try:
1696 self.serv.settimeout(0.0)
1697 foo = self.serv.recv(1024)
1698 except socket.timeout:
1699 self.fail("caught timeout instead of error (UDP)")
1700 except socket.error:
1701 ok = True
1702 except:
1703 self.fail("caught unexpected exception (UDP)")
1704 if not ok:
1705 self.fail("recv() returned success when we did not expect it")
1706
1707class TestExceptions(unittest.TestCase):
1708
1709 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001710 self.assertTrue(issubclass(socket.error, Exception))
1711 self.assertTrue(issubclass(socket.herror, socket.error))
1712 self.assertTrue(issubclass(socket.gaierror, socket.error))
1713 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001714
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001715class TestLinuxAbstractNamespace(unittest.TestCase):
1716
1717 UNIX_PATH_MAX = 108
1718
1719 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001720 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001721 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1722 s1.bind(address)
1723 s1.listen(1)
1724 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1725 s2.connect(s1.getsockname())
1726 with s1.accept()[0] as s3:
1727 self.assertEqual(s1.getsockname(), address)
1728 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001729
1730 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001731 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001732 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1733 s.bind(address)
1734 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001735
1736 def testNameOverflow(self):
1737 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001738 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1739 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001740
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001741
Victor Stinner45df8202010-04-28 22:31:17 +00001742@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001743class BufferIOTest(SocketConnectedTest):
1744 """
1745 Test the buffer versions of socket.recv() and socket.send().
1746 """
1747 def __init__(self, methodName='runTest'):
1748 SocketConnectedTest.__init__(self, methodName=methodName)
1749
Antoine Pitrou25480782010-03-17 22:50:28 +00001750 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001751 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001752 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001753 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001754 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001755 self.assertEqual(msg, MSG)
1756
Antoine Pitrou25480782010-03-17 22:50:28 +00001757 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001758 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001759 self.serv_conn.send(buf)
1760
Antoine Pitrou25480782010-03-17 22:50:28 +00001761 def testRecvIntoBytearray(self):
1762 buf = bytearray(1024)
1763 nbytes = self.cli_conn.recv_into(buf)
1764 self.assertEqual(nbytes, len(MSG))
1765 msg = buf[:len(MSG)]
1766 self.assertEqual(msg, MSG)
1767
1768 _testRecvIntoBytearray = _testRecvIntoArray
1769
1770 def testRecvIntoMemoryview(self):
1771 buf = bytearray(1024)
1772 nbytes = self.cli_conn.recv_into(memoryview(buf))
1773 self.assertEqual(nbytes, len(MSG))
1774 msg = buf[:len(MSG)]
1775 self.assertEqual(msg, MSG)
1776
1777 _testRecvIntoMemoryview = _testRecvIntoArray
1778
1779 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001780 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001781 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001782 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001783 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001784 self.assertEqual(msg, MSG)
1785
Antoine Pitrou25480782010-03-17 22:50:28 +00001786 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001787 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001788 self.serv_conn.send(buf)
1789
Antoine Pitrou25480782010-03-17 22:50:28 +00001790 def testRecvFromIntoBytearray(self):
1791 buf = bytearray(1024)
1792 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1793 self.assertEqual(nbytes, len(MSG))
1794 msg = buf[:len(MSG)]
1795 self.assertEqual(msg, MSG)
1796
1797 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1798
1799 def testRecvFromIntoMemoryview(self):
1800 buf = bytearray(1024)
1801 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1802 self.assertEqual(nbytes, len(MSG))
1803 msg = buf[:len(MSG)]
1804 self.assertEqual(msg, MSG)
1805
1806 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1807
Christian Heimes043d6f62008-01-07 17:19:16 +00001808
1809TIPC_STYPE = 2000
1810TIPC_LOWER = 200
1811TIPC_UPPER = 210
1812
1813def isTipcAvailable():
1814 """Check if the TIPC module is loaded
1815
1816 The TIPC module is not loaded automatically on Ubuntu and probably
1817 other Linux distros.
1818 """
1819 if not hasattr(socket, "AF_TIPC"):
1820 return False
1821 if not os.path.isfile("/proc/modules"):
1822 return False
1823 with open("/proc/modules") as f:
1824 for line in f:
1825 if line.startswith("tipc "):
1826 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001827 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001828 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1829 return False
1830
1831class TIPCTest (unittest.TestCase):
1832 def testRDM(self):
1833 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1834 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1835
1836 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1837 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1838 TIPC_LOWER, TIPC_UPPER)
1839 srv.bind(srvaddr)
1840
1841 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1842 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1843 cli.sendto(MSG, sendaddr)
1844
1845 msg, recvaddr = srv.recvfrom(1024)
1846
1847 self.assertEqual(cli.getsockname(), recvaddr)
1848 self.assertEqual(msg, MSG)
1849
1850
1851class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1852 def __init__(self, methodName = 'runTest'):
1853 unittest.TestCase.__init__(self, methodName = methodName)
1854 ThreadableTest.__init__(self)
1855
1856 def setUp(self):
1857 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1858 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1859 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1860 TIPC_LOWER, TIPC_UPPER)
1861 self.srv.bind(srvaddr)
1862 self.srv.listen(5)
1863 self.serverExplicitReady()
1864 self.conn, self.connaddr = self.srv.accept()
1865
1866 def clientSetUp(self):
1867 # The is a hittable race between serverExplicitReady() and the
1868 # accept() call; sleep a little while to avoid it, otherwise
1869 # we could get an exception
1870 time.sleep(0.1)
1871 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1872 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1873 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1874 self.cli.connect(addr)
1875 self.cliaddr = self.cli.getsockname()
1876
1877 def testStream(self):
1878 msg = self.conn.recv(1024)
1879 self.assertEqual(msg, MSG)
1880 self.assertEqual(self.cliaddr, self.connaddr)
1881
1882 def _testStream(self):
1883 self.cli.send(MSG)
1884 self.cli.close()
1885
1886
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001887@unittest.skipUnless(thread, 'Threading required for this test.')
1888class ContextManagersTest(ThreadedTCPSocketTest):
1889
1890 def _testSocketClass(self):
1891 # base test
1892 with socket.socket() as sock:
1893 self.assertFalse(sock._closed)
1894 self.assertTrue(sock._closed)
1895 # close inside with block
1896 with socket.socket() as sock:
1897 sock.close()
1898 self.assertTrue(sock._closed)
1899 # exception inside with block
1900 with socket.socket() as sock:
1901 self.assertRaises(socket.error, sock.sendall, b'foo')
1902 self.assertTrue(sock._closed)
1903
1904 def testCreateConnectionBase(self):
1905 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001906 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001907 data = conn.recv(1024)
1908 conn.sendall(data)
1909
1910 def _testCreateConnectionBase(self):
1911 address = self.serv.getsockname()
1912 with socket.create_connection(address) as sock:
1913 self.assertFalse(sock._closed)
1914 sock.sendall(b'foo')
1915 self.assertEqual(sock.recv(1024), b'foo')
1916 self.assertTrue(sock._closed)
1917
1918 def testCreateConnectionClose(self):
1919 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001920 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001921 data = conn.recv(1024)
1922 conn.sendall(data)
1923
1924 def _testCreateConnectionClose(self):
1925 address = self.serv.getsockname()
1926 with socket.create_connection(address) as sock:
1927 sock.close()
1928 self.assertTrue(sock._closed)
1929 self.assertRaises(socket.error, sock.sendall, b'foo')
1930
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001931
Antoine Pitroub1c54962010-10-14 15:05:38 +00001932@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1933 "SOCK_CLOEXEC not defined")
1934@unittest.skipUnless(fcntl, "module fcntl not available")
1935class CloexecConstantTest(unittest.TestCase):
1936 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001937 v = linux_version()
1938 if v < (2, 6, 28):
1939 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1940 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00001941 with socket.socket(socket.AF_INET,
1942 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
1943 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1944 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001945
1946
1947@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1948 "SOCK_NONBLOCK not defined")
1949class NonblockConstantTest(unittest.TestCase):
1950 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1951 if nonblock:
1952 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1953 self.assertEqual(s.gettimeout(), timeout)
1954 else:
1955 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1956 self.assertEqual(s.gettimeout(), None)
1957
1958 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001959 v = linux_version()
1960 if v < (2, 6, 28):
1961 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1962 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001963 # a lot of it seems silly and redundant, but I wanted to test that
1964 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00001965 with socket.socket(socket.AF_INET,
1966 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
1967 self.checkNonblock(s)
1968 s.setblocking(1)
1969 self.checkNonblock(s, False)
1970 s.setblocking(0)
1971 self.checkNonblock(s)
1972 s.settimeout(None)
1973 self.checkNonblock(s, False)
1974 s.settimeout(2.0)
1975 self.checkNonblock(s, timeout=2.0)
1976 s.setblocking(1)
1977 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001978 # defaulttimeout
1979 t = socket.getdefaulttimeout()
1980 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001981 with socket.socket() as s:
1982 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001983 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001984 with socket.socket() as s:
1985 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001986 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001987 with socket.socket() as s:
1988 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001989 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001990 with socket.socket() as s:
1991 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001992 socket.setdefaulttimeout(t)
1993
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001994
Guido van Rossumb995eb72002-07-31 16:08:40 +00001995def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001996 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001997 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001998
1999 tests.extend([
2000 NonBlockingTCPTests,
2001 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002002 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002003 UnbufferedFileObjectClassTestCase,
2004 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002005 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002006 UnicodeReadFileObjectClassTestCase,
2007 UnicodeWriteFileObjectClassTestCase,
2008 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002009 NetworkConnectionNoServer,
2010 NetworkConnectionAttributesTest,
2011 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002012 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002013 CloexecConstantTest,
2014 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002015 ])
Dave Cole331708b2004-08-09 04:51:41 +00002016 if hasattr(socket, "socketpair"):
2017 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002018 if sys.platform == 'linux2':
2019 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002020 if isTipcAvailable():
2021 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002022 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002023
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002024 thread_info = support.threading_setup()
2025 support.run_unittest(*tests)
2026 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002027
2028if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002029 test_main()