blob: d761a73f2ff48e0d326ab2ebf40b8db2878b3592 [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
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000328 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
329 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
330 def test_sethostname(self):
331 oldhn = socket.gethostname()
332 try:
333 socket.sethostname('new')
334 except socket.error as e:
335 if e.errno == errno.EPERM:
336 self.skipTest("test should be run as root")
337 else:
338 raise
339 try:
340 # running test as root!
341 self.assertEqual(socket.gethostname(), 'new')
342 # Should work with bytes objects too
343 socket.sethostname(b'bar')
344 self.assertEqual(socket.gethostname(), 'bar')
345 finally:
346 socket.sethostname(oldhn)
347
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000348 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000349 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000350 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000351 try:
352 # On some versions, this loses a reference
353 orig = sys.getrefcount(__name__)
354 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000355 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000356 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000358
Guido van Rossum24e4af82002-06-12 19:18:08 +0000359 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000360 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361 try:
362 # On some versions, this crashes the interpreter.
363 socket.getnameinfo(('x', 0, 0, 0), 0)
364 except socket.error:
365 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000366
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000367 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000368 # This just checks that htons etc. are their own inverse,
369 # when looking at the lower 16 or 32 bits.
370 sizes = {socket.htonl: 32, socket.ntohl: 32,
371 socket.htons: 16, socket.ntohs: 16}
372 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000373 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000374 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
375 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000376
Guido van Rossuma2627af2002-09-14 00:58:46 +0000377 swapped = func(mask)
378 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000379 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000380
Guido van Rossum018919a2007-01-15 00:07:32 +0000381 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000382 good_values = [ 1, 2, 3, 1, 2, 3 ]
383 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000384 for k in good_values:
385 socket.ntohl(k)
386 socket.ntohs(k)
387 socket.htonl(k)
388 socket.htons(k)
389 for k in bad_values:
390 self.assertRaises(OverflowError, socket.ntohl, k)
391 self.assertRaises(OverflowError, socket.ntohs, k)
392 self.assertRaises(OverflowError, socket.htonl, k)
393 self.assertRaises(OverflowError, socket.htons, k)
394
Barry Warsaw11b91a02004-06-28 00:50:43 +0000395 def testGetServBy(self):
396 eq = self.assertEqual
397 # Find one service that exists, then check all the related interfaces.
398 # I've ordered this by protocols that have both a tcp and udp
399 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000400 if (sys.platform.startswith('linux') or
401 sys.platform.startswith('freebsd') or
402 sys.platform.startswith('netbsd') or
403 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000404 # avoid the 'echo' service on this platform, as there is an
405 # assumption breaking non-standard port/protocol entry
406 services = ('daytime', 'qotd', 'domain')
407 else:
408 services = ('echo', 'daytime', 'domain')
409 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000410 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000411 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000412 break
413 except socket.error:
414 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000415 else:
416 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000417 # Try same call with optional protocol omitted
418 port2 = socket.getservbyname(service)
419 eq(port, port2)
420 # Try udp, but don't barf it it doesn't exist
421 try:
422 udpport = socket.getservbyname(service, 'udp')
423 except socket.error:
424 udpport = None
425 else:
426 eq(udpport, port)
427 # Now make sure the lookup by port returns the same service name
428 eq(socket.getservbyport(port2), service)
429 eq(socket.getservbyport(port, 'tcp'), service)
430 if udpport is not None:
431 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000432 # Make sure getservbyport does not accept out of range ports.
433 self.assertRaises(OverflowError, socket.getservbyport, -1)
434 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000435
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000436 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000437 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000438 # The default timeout should initially be None
439 self.assertEqual(socket.getdefaulttimeout(), None)
440 s = socket.socket()
441 self.assertEqual(s.gettimeout(), None)
442 s.close()
443
444 # Set the default timeout to 10, and see if it propagates
445 socket.setdefaulttimeout(10)
446 self.assertEqual(socket.getdefaulttimeout(), 10)
447 s = socket.socket()
448 self.assertEqual(s.gettimeout(), 10)
449 s.close()
450
451 # Reset the default timeout to None, and see if it propagates
452 socket.setdefaulttimeout(None)
453 self.assertEqual(socket.getdefaulttimeout(), None)
454 s = socket.socket()
455 self.assertEqual(s.gettimeout(), None)
456 s.close()
457
458 # Check that setting it to an invalid value raises ValueError
459 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
460
461 # Check that setting it to an invalid type raises TypeError
462 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
463
Benjamin Petersonf91df042009-02-13 02:50:59 +0000464 def testIPv4_inet_aton_fourbytes(self):
465 if not hasattr(socket, 'inet_aton'):
466 return # No inet_aton, nothing to check
467 # Test that issue1008086 and issue767150 are fixed.
468 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000469 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
470 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000471
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000472 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000473 if not hasattr(socket, 'inet_pton'):
474 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000475 from socket import inet_aton as f, inet_pton, AF_INET
476 g = lambda a: inet_pton(AF_INET, a)
477
Ezio Melottib3aedd42010-11-20 19:04:17 +0000478 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
479 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
480 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
481 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
482 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000483
Ezio Melottib3aedd42010-11-20 19:04:17 +0000484 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
485 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
486 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
487 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000488
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000489 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000490 if not hasattr(socket, 'inet_pton'):
491 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000492 try:
493 from socket import inet_pton, AF_INET6, has_ipv6
494 if not has_ipv6:
495 return
496 except ImportError:
497 return
498 f = lambda a: inet_pton(AF_INET6, a)
499
Ezio Melottib3aedd42010-11-20 19:04:17 +0000500 self.assertEqual(b'\x00' * 16, f('::'))
501 self.assertEqual(b'\x00' * 16, f('0::0'))
502 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
503 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000504 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 +0000505 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
506 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000507
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000508 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000509 if not hasattr(socket, 'inet_ntop'):
510 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000511 from socket import inet_ntoa as f, inet_ntop, AF_INET
512 g = lambda a: inet_ntop(AF_INET, a)
513
Ezio Melottib3aedd42010-11-20 19:04:17 +0000514 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
515 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
516 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
517 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000518
Ezio Melottib3aedd42010-11-20 19:04:17 +0000519 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
520 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
521 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000522
523 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000524 if not hasattr(socket, 'inet_ntop'):
525 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000526 try:
527 from socket import inet_ntop, AF_INET6, has_ipv6
528 if not has_ipv6:
529 return
530 except ImportError:
531 return
532 f = lambda a: inet_ntop(AF_INET6, a)
533
Ezio Melottib3aedd42010-11-20 19:04:17 +0000534 self.assertEqual('::', f(b'\x00' * 16))
535 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
536 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000537 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000538 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 +0000539 )
540
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000541 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000542
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000543 def _get_unused_port(self, bind_address='0.0.0.0'):
544 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000545
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000546 Args:
547 bind_address: Hostname or IP address to search for a port on.
548
549 Returns: A most likely to be unused port.
550 """
551 tempsock = socket.socket()
552 tempsock.bind((bind_address, 0))
553 host, port = tempsock.getsockname()
554 tempsock.close()
555 return port
556
557 def testSockName(self):
558 # Testing getsockname()
559 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000561 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000562 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000564 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
565 # it reasonable to get the host's addr in addition to 0.0.0.0.
566 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000567 try:
568 my_ip_addr = socket.gethostbyname(socket.gethostname())
569 except socket.error:
570 # Probably name lookup wasn't set up right; skip this test
571 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000572 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000573 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000574
575 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000576 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000577 # We know a socket should start without reuse==0
578 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000579 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000580 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000581 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000582
583 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000584 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000585 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000586 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
588 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000589 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000591 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000592 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000593 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
594 sock.settimeout(1)
595 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000596 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000597
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000598 def testNewAttributes(self):
599 # testing .family, .type and .protocol
600 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
601 self.assertEqual(sock.family, socket.AF_INET)
602 self.assertEqual(sock.type, socket.SOCK_STREAM)
603 self.assertEqual(sock.proto, 0)
604 sock.close()
605
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000606 def test_getsockaddrarg(self):
607 host = '0.0.0.0'
608 port = self._get_unused_port(bind_address=host)
609 big_port = port + 65536
610 neg_port = port - 65536
611 sock = socket.socket()
612 try:
613 self.assertRaises(OverflowError, sock.bind, (host, big_port))
614 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
615 sock.bind((host, port))
616 finally:
617 sock.close()
618
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000619 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000620 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000621 self.assertTrue(hasattr(socket.socket, 'ioctl'))
622 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
623 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
624 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000625 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
626 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000627 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000628 self.assertRaises(ValueError, s.ioctl, -1, None)
629 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000630
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000631 def testGetaddrinfo(self):
632 try:
633 socket.getaddrinfo('localhost', 80)
634 except socket.gaierror as err:
635 if err.errno == socket.EAI_SERVICE:
636 # see http://bugs.python.org/issue1282647
637 self.skipTest("buggy libc version")
638 raise
639 # len of every sequence is supposed to be == 5
640 for info in socket.getaddrinfo(HOST, None):
641 self.assertEqual(len(info), 5)
642 # host can be a domain name, a string representation of an
643 # IPv4/v6 address or None
644 socket.getaddrinfo('localhost', 80)
645 socket.getaddrinfo('127.0.0.1', 80)
646 socket.getaddrinfo(None, 80)
647 if SUPPORTS_IPV6:
648 socket.getaddrinfo('::1', 80)
649 # port can be a string service name such as "http", a numeric
650 # port number or None
651 socket.getaddrinfo(HOST, "http")
652 socket.getaddrinfo(HOST, 80)
653 socket.getaddrinfo(HOST, None)
654 # test family and socktype filters
655 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
656 for family, _, _, _, _ in infos:
657 self.assertEqual(family, socket.AF_INET)
658 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
659 for _, socktype, _, _, _ in infos:
660 self.assertEqual(socktype, socket.SOCK_STREAM)
661 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000662 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000663 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
664 # a server willing to support both IPv4 and IPv6 will
665 # usually do this
666 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
667 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000668 # test keyword arguments
669 a = socket.getaddrinfo(HOST, None)
670 b = socket.getaddrinfo(host=HOST, port=None)
671 self.assertEqual(a, b)
672 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
673 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
674 self.assertEqual(a, b)
675 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
676 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
677 self.assertEqual(a, b)
678 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
679 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
680 self.assertEqual(a, b)
681 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
682 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
683 self.assertEqual(a, b)
684 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
685 socket.AI_PASSIVE)
686 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
687 type=socket.SOCK_STREAM, proto=0,
688 flags=socket.AI_PASSIVE)
689 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000690 # Issue #6697.
691 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000692
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000693 def test_getnameinfo(self):
694 # only IP addresses are allowed
695 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
696
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000697 @unittest.skipUnless(support.is_resource_enabled('network'),
698 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000699 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000700 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000701 # these should all be successful
702 socket.gethostbyname('испытание.python.org')
703 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000704 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
705 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
706 # have a reverse entry yet
707 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000708
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000709 def check_sendall_interrupted(self, with_timeout):
710 # socketpair() is not stricly required, but it makes things easier.
711 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
712 self.skipTest("signal.alarm and socket.socketpair required for this test")
713 # Our signal handlers clobber the C errno by calling a math function
714 # with an invalid domain value.
715 def ok_handler(*args):
716 self.assertRaises(ValueError, math.acosh, 0)
717 def raising_handler(*args):
718 self.assertRaises(ValueError, math.acosh, 0)
719 1 // 0
720 c, s = socket.socketpair()
721 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
722 try:
723 if with_timeout:
724 # Just above the one second minimum for signal.alarm
725 c.settimeout(1.5)
726 with self.assertRaises(ZeroDivisionError):
727 signal.alarm(1)
728 c.sendall(b"x" * (1024**2))
729 if with_timeout:
730 signal.signal(signal.SIGALRM, ok_handler)
731 signal.alarm(1)
732 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
733 finally:
734 signal.signal(signal.SIGALRM, old_alarm)
735 c.close()
736 s.close()
737
738 def test_sendall_interrupted(self):
739 self.check_sendall_interrupted(False)
740
741 def test_sendall_interrupted_with_timeout(self):
742 self.check_sendall_interrupted(True)
743
Antoine Pitroue033e062010-10-29 10:38:18 +0000744 def test_dealloc_warn(self):
745 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
746 r = repr(sock)
747 with self.assertWarns(ResourceWarning) as cm:
748 sock = None
749 support.gc_collect()
750 self.assertIn(r, str(cm.warning.args[0]))
751 # An open socket file object gets dereferenced after the socket
752 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
753 f = sock.makefile('rb')
754 r = repr(sock)
755 sock = None
756 support.gc_collect()
757 with self.assertWarns(ResourceWarning):
758 f = None
759 support.gc_collect()
760
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000761 def test_name_closed_socketio(self):
762 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
763 fp = sock.makefile("rb")
764 fp.close()
765 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
766
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000767
Victor Stinner45df8202010-04-28 22:31:17 +0000768@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000769class BasicTCPTest(SocketConnectedTest):
770
771 def __init__(self, methodName='runTest'):
772 SocketConnectedTest.__init__(self, methodName=methodName)
773
774 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000775 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000777 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778
779 def _testRecv(self):
780 self.serv_conn.send(MSG)
781
782 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000783 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 seg1 = self.cli_conn.recv(len(MSG) - 3)
785 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000786 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000787 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788
789 def _testOverFlowRecv(self):
790 self.serv_conn.send(MSG)
791
792 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000793 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000795 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000796
797 def _testRecvFrom(self):
798 self.serv_conn.send(MSG)
799
800 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000801 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
803 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000804 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000805 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000806
807 def _testOverFlowRecvFrom(self):
808 self.serv_conn.send(MSG)
809
810 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000811 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000812 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813 while 1:
814 read = self.cli_conn.recv(1024)
815 if not read:
816 break
Guido van Rossume531e292002-08-08 20:28:34 +0000817 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000818 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819
820 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000821 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822 self.serv_conn.sendall(big_chunk)
823
824 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000825 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826 fd = self.cli_conn.fileno()
827 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000828 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000829 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000831 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832
833 def _testFromFd(self):
834 self.serv_conn.send(MSG)
835
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000836 def testDup(self):
837 # Testing dup()
838 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000839 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000840 msg = sock.recv(1024)
841 self.assertEqual(msg, MSG)
842
843 def _testDup(self):
844 self.serv_conn.send(MSG)
845
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000847 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000849 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000850 # wait for _testShutdown to finish: on OS X, when the server
851 # closes the connection the client also becomes disconnected,
852 # and the client's shutdown call will fail. (Issue #4397.)
853 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854
855 def _testShutdown(self):
856 self.serv_conn.send(MSG)
857 self.serv_conn.shutdown(2)
858
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000859 def testDetach(self):
860 # Testing detach()
861 fileno = self.cli_conn.fileno()
862 f = self.cli_conn.detach()
863 self.assertEqual(f, fileno)
864 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000865 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
866 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000867 # ...but we can create another socket using the (still open)
868 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000869 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000870 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000871 msg = sock.recv(1024)
872 self.assertEqual(msg, MSG)
873
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000874 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000875 self.serv_conn.send(MSG)
876
Victor Stinner45df8202010-04-28 22:31:17 +0000877@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878class BasicUDPTest(ThreadedUDPSocketTest):
879
880 def __init__(self, methodName='runTest'):
881 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
882
883 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000884 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000885 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000886 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887
888 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000889 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890
Guido van Rossum1c938012002-06-12 21:17:20 +0000891 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000892 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000894 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895
Guido van Rossum1c938012002-06-12 21:17:20 +0000896 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000897 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000898
Guido van Rossumd8faa362007-04-27 19:54:29 +0000899 def testRecvFromNegative(self):
900 # Negative lengths passed to recvfrom should give ValueError.
901 self.assertRaises(ValueError, self.serv.recvfrom, -1)
902
903 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000904 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000905
Victor Stinner45df8202010-04-28 22:31:17 +0000906@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000907class TCPCloserTest(ThreadedTCPSocketTest):
908
909 def testClose(self):
910 conn, addr = self.serv.accept()
911 conn.close()
912
913 sd = self.cli
914 read, write, err = select.select([sd], [], [], 1.0)
915 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000916 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000917
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000918 # Calling close() many times should be safe.
919 conn.close()
920 conn.close()
921
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000922 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000923 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000924 time.sleep(1.0)
925
Victor Stinner45df8202010-04-28 22:31:17 +0000926@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000927class BasicSocketPairTest(SocketPairTest):
928
929 def __init__(self, methodName='runTest'):
930 SocketPairTest.__init__(self, methodName=methodName)
931
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000932 def _check_defaults(self, sock):
933 self.assertIsInstance(sock, socket.socket)
934 if hasattr(socket, 'AF_UNIX'):
935 self.assertEqual(sock.family, socket.AF_UNIX)
936 else:
937 self.assertEqual(sock.family, socket.AF_INET)
938 self.assertEqual(sock.type, socket.SOCK_STREAM)
939 self.assertEqual(sock.proto, 0)
940
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000941 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000942 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000943
944 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000945 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000946
Dave Cole331708b2004-08-09 04:51:41 +0000947 def testRecv(self):
948 msg = self.serv.recv(1024)
949 self.assertEqual(msg, MSG)
950
951 def _testRecv(self):
952 self.cli.send(MSG)
953
954 def testSend(self):
955 self.serv.send(MSG)
956
957 def _testSend(self):
958 msg = self.cli.recv(1024)
959 self.assertEqual(msg, MSG)
960
Victor Stinner45df8202010-04-28 22:31:17 +0000961@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000962class NonBlockingTCPTests(ThreadedTCPSocketTest):
963
964 def __init__(self, methodName='runTest'):
965 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
966
967 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000968 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000969 self.serv.setblocking(0)
970 start = time.time()
971 try:
972 self.serv.accept()
973 except socket.error:
974 pass
975 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000976 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977
978 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000979 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000980
Antoine Pitroub1c54962010-10-14 15:05:38 +0000981 if hasattr(socket, "SOCK_NONBLOCK"):
982 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000983 v = linux_version()
984 if v < (2, 6, 28):
985 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
986 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +0000987 # reinit server socket
988 self.serv.close()
989 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000990 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000991 self.port = support.bind_port(self.serv)
992 self.serv.listen(1)
993 # actual testing
994 start = time.time()
995 try:
996 self.serv.accept()
997 except socket.error:
998 pass
999 end = time.time()
1000 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1001
1002 def _testInitNonBlocking(self):
1003 pass
1004
Antoine Pitrou600232b2011-01-05 21:03:42 +00001005 def testInheritFlags(self):
1006 # Issue #7995: when calling accept() on a listening socket with a
1007 # timeout, the resulting socket should not be non-blocking.
1008 self.serv.settimeout(10)
1009 try:
1010 conn, addr = self.serv.accept()
1011 message = conn.recv(len(MSG))
1012 finally:
1013 conn.close()
1014 self.serv.settimeout(None)
1015
1016 def _testInheritFlags(self):
1017 time.sleep(0.1)
1018 self.cli.connect((HOST, self.port))
1019 time.sleep(0.5)
1020 self.cli.send(MSG)
1021
Guido van Rossum24e4af82002-06-12 19:18:08 +00001022 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001023 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001024 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001025 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001026 conn, addr = self.serv.accept()
1027 except socket.error:
1028 pass
1029 else:
1030 self.fail("Error trying to do non-blocking accept.")
1031 read, write, err = select.select([self.serv], [], [])
1032 if self.serv in read:
1033 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001034 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001035 else:
1036 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001037
Guido van Rossum24e4af82002-06-12 19:18:08 +00001038 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001039 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001040 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001041
1042 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001043 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001044 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001045 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001046
1047 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001048 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001049 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050
1051 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001052 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001053 conn, addr = self.serv.accept()
1054 conn.setblocking(0)
1055 try:
1056 msg = conn.recv(len(MSG))
1057 except socket.error:
1058 pass
1059 else:
1060 self.fail("Error trying to do non-blocking recv.")
1061 read, write, err = select.select([conn], [], [])
1062 if conn in read:
1063 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001064 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001065 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066 else:
1067 self.fail("Error during select call to non-blocking socket.")
1068
1069 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001070 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001071 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001072 self.cli.send(MSG)
1073
Victor Stinner45df8202010-04-28 22:31:17 +00001074@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001075class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001076 """Unit tests for the object returned by socket.makefile()
1077
Antoine Pitrou834bd812010-10-13 16:17:14 +00001078 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001079 the client connection. You can read from this file to
1080 get output from the server.
1081
Antoine Pitrou834bd812010-10-13 16:17:14 +00001082 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001083 server connection. You can write to this file to send output
1084 to the client.
1085 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001086
Guido van Rossume9f66142002-08-07 15:46:19 +00001087 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001088 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001089 errors = 'strict'
1090 newline = None
1091
1092 read_mode = 'rb'
1093 read_msg = MSG
1094 write_mode = 'wb'
1095 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001096
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097 def __init__(self, methodName='runTest'):
1098 SocketConnectedTest.__init__(self, methodName=methodName)
1099
1100 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001101 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1102 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001103 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001104 self.read_file = self.cli_conn.makefile(
1105 self.read_mode, self.bufsize,
1106 encoding = self.encoding,
1107 errors = self.errors,
1108 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001109
1110 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001111 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001112 self.read_file.close()
1113 self.assertTrue(self.read_file.closed)
1114 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001115 SocketConnectedTest.tearDown(self)
1116
1117 def clientSetUp(self):
1118 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001119 self.write_file = self.serv_conn.makefile(
1120 self.write_mode, self.bufsize,
1121 encoding = self.encoding,
1122 errors = self.errors,
1123 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001124
1125 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001126 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001127 self.write_file.close()
1128 self.assertTrue(self.write_file.closed)
1129 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001130 SocketConnectedTest.clientTearDown(self)
1131
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001132 def testReadAfterTimeout(self):
1133 # Issue #7322: A file object must disallow further reads
1134 # after a timeout has occurred.
1135 self.cli_conn.settimeout(1)
1136 self.read_file.read(3)
1137 # First read raises a timeout
1138 self.assertRaises(socket.timeout, self.read_file.read, 1)
1139 # Second read is disallowed
1140 with self.assertRaises(IOError) as ctx:
1141 self.read_file.read(1)
1142 self.assertIn("cannot read from timed out object", str(ctx.exception))
1143
1144 def _testReadAfterTimeout(self):
1145 self.write_file.write(self.write_msg[0:3])
1146 self.write_file.flush()
1147 self.serv_finished.wait()
1148
Guido van Rossum24e4af82002-06-12 19:18:08 +00001149 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001150 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001151 first_seg = self.read_file.read(len(self.read_msg)-3)
1152 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001153 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001154 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001155
1156 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001157 self.write_file.write(self.write_msg)
1158 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001159
Guido van Rossum8c943832002-08-08 01:00:28 +00001160 def testFullRead(self):
1161 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001162 msg = self.read_file.read()
1163 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001164
1165 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001166 self.write_file.write(self.write_msg)
1167 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001168
Guido van Rossum24e4af82002-06-12 19:18:08 +00001169 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001170 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001171 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001172 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001173 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001174 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001175 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001176 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001177 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001178
1179 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001180 self.write_file.write(self.write_msg)
1181 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001182
1183 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001184 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001185 line = self.read_file.readline()
1186 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001187
1188 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001189 self.write_file.write(self.write_msg)
1190 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001191
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001192 def testCloseAfterMakefile(self):
1193 # The file returned by makefile should keep the socket open.
1194 self.cli_conn.close()
1195 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001196 msg = self.read_file.read()
1197 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001198
1199 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001200 self.write_file.write(self.write_msg)
1201 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001202
1203 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001204 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001205 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001206 if isinstance(self.read_msg, str):
1207 msg = msg.decode()
1208 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001209
1210 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001211 self.write_file.write(self.write_msg)
1212 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001213
Tim Peters116d83c2004-03-28 02:20:45 +00001214 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001215 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001216
1217 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001218 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001219
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001220 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001221 self.assertEqual(self.read_file.mode, self.read_mode)
1222 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001223
1224 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001225 self.assertEqual(self.write_file.mode, self.write_mode)
1226 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001227
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001228 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001229 self.read_file.close()
1230 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001231 self.cli_conn.close()
1232 self.assertRaises(socket.error, self.cli_conn.getsockname)
1233
1234 def _testRealClose(self):
1235 pass
1236
1237
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001238class FileObjectInterruptedTestCase(unittest.TestCase):
1239 """Test that the file object correctly handles EINTR internally."""
1240
1241 class MockSocket(object):
1242 def __init__(self, recv_funcs=()):
1243 # A generator that returns callables that we'll call for each
1244 # call to recv().
1245 self._recv_step = iter(recv_funcs)
1246
1247 def recv_into(self, buffer):
1248 data = next(self._recv_step)()
1249 assert len(buffer) >= len(data)
1250 buffer[:len(data)] = data
1251 return len(data)
1252
1253 def _decref_socketios(self):
1254 pass
1255
1256 def _textiowrap_for_test(self, buffering=-1):
1257 raw = socket.SocketIO(self, "r")
1258 if buffering < 0:
1259 buffering = io.DEFAULT_BUFFER_SIZE
1260 if buffering == 0:
1261 return raw
1262 buffer = io.BufferedReader(raw, buffering)
1263 text = io.TextIOWrapper(buffer, None, None)
1264 text.mode = "rb"
1265 return text
1266
1267 @staticmethod
1268 def _raise_eintr():
1269 raise socket.error(errno.EINTR)
1270
1271 def _textiowrap_mock_socket(self, mock, buffering=-1):
1272 raw = socket.SocketIO(mock, "r")
1273 if buffering < 0:
1274 buffering = io.DEFAULT_BUFFER_SIZE
1275 if buffering == 0:
1276 return raw
1277 buffer = io.BufferedReader(raw, buffering)
1278 text = io.TextIOWrapper(buffer, None, None)
1279 text.mode = "rb"
1280 return text
1281
1282 def _test_readline(self, size=-1, buffering=-1):
1283 mock_sock = self.MockSocket(recv_funcs=[
1284 lambda : b"This is the first line\nAnd the sec",
1285 self._raise_eintr,
1286 lambda : b"ond line is here\n",
1287 lambda : b"",
1288 lambda : b"", # XXX(gps): io library does an extra EOF read
1289 ])
1290 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001291 self.assertEqual(fo.readline(size), "This is the first line\n")
1292 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001293
1294 def _test_read(self, size=-1, buffering=-1):
1295 mock_sock = self.MockSocket(recv_funcs=[
1296 lambda : b"This is the first line\nAnd the sec",
1297 self._raise_eintr,
1298 lambda : b"ond line is here\n",
1299 lambda : b"",
1300 lambda : b"", # XXX(gps): io library does an extra EOF read
1301 ])
1302 expecting = (b"This is the first line\n"
1303 b"And the second line is here\n")
1304 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1305 if buffering == 0:
1306 data = b''
1307 else:
1308 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001309 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001310 while len(data) != len(expecting):
1311 part = fo.read(size)
1312 if not part:
1313 break
1314 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001315 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001316
1317 def test_default(self):
1318 self._test_readline()
1319 self._test_readline(size=100)
1320 self._test_read()
1321 self._test_read(size=100)
1322
1323 def test_with_1k_buffer(self):
1324 self._test_readline(buffering=1024)
1325 self._test_readline(size=100, buffering=1024)
1326 self._test_read(buffering=1024)
1327 self._test_read(size=100, buffering=1024)
1328
1329 def _test_readline_no_buffer(self, size=-1):
1330 mock_sock = self.MockSocket(recv_funcs=[
1331 lambda : b"a",
1332 lambda : b"\n",
1333 lambda : b"B",
1334 self._raise_eintr,
1335 lambda : b"b",
1336 lambda : b"",
1337 ])
1338 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001339 self.assertEqual(fo.readline(size), b"a\n")
1340 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001341
1342 def test_no_buffer(self):
1343 self._test_readline_no_buffer()
1344 self._test_readline_no_buffer(size=4)
1345 self._test_read(buffering=0)
1346 self._test_read(size=100, buffering=0)
1347
1348
Guido van Rossume9f66142002-08-07 15:46:19 +00001349class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1350
1351 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001352
Guido van Rossume9f66142002-08-07 15:46:19 +00001353 In this case (and in this case only), it should be possible to
1354 create a file object, read a line from it, create another file
1355 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001356 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001357 when reading multiple requests from the same socket."""
1358
1359 bufsize = 0 # Use unbuffered mode
1360
1361 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001362 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001363 line = self.read_file.readline() # first line
1364 self.assertEqual(line, b"A. " + self.write_msg) # first line
1365 self.read_file = self.cli_conn.makefile('rb', 0)
1366 line = self.read_file.readline() # second line
1367 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001368
1369 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001370 self.write_file.write(b"A. " + self.write_msg)
1371 self.write_file.write(b"B. " + self.write_msg)
1372 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001373
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001374 def testMakefileClose(self):
1375 # The file returned by makefile should keep the socket open...
1376 self.cli_conn.close()
1377 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001378 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001379 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001380 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001381 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1382
1383 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001384 self.write_file.write(self.write_msg)
1385 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001386
1387 def testMakefileCloseSocketDestroy(self):
1388 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001389 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001390 refcount_after = sys.getrefcount(self.cli_conn)
1391 self.assertEqual(refcount_before - 1, refcount_after)
1392
1393 def _testMakefileCloseSocketDestroy(self):
1394 pass
1395
Antoine Pitrou98b46702010-09-18 22:59:00 +00001396 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001397 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001398 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1399
1400 def testSmallReadNonBlocking(self):
1401 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001402 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1403 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001404 self.evt1.set()
1405 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001406 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001407 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001408 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001409 self.assertEqual(n, 3)
1410 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001411 self.assertEqual(msg, self.read_msg)
1412 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1413 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001414
1415 def _testSmallReadNonBlocking(self):
1416 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001417 self.write_file.write(self.write_msg)
1418 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001419 self.evt2.set()
1420 # Avoid cloding the socket before the server test has finished,
1421 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1422 self.serv_finished.wait(5.0)
1423
1424 def testWriteNonBlocking(self):
1425 self.cli_finished.wait(5.0)
1426 # The client thread can't skip directly - the SkipTest exception
1427 # would appear as a failure.
1428 if self.serv_skipped:
1429 self.skipTest(self.serv_skipped)
1430
1431 def _testWriteNonBlocking(self):
1432 self.serv_skipped = None
1433 self.serv_conn.setblocking(False)
1434 # Try to saturate the socket buffer pipe with repeated large writes.
1435 BIG = b"x" * (1024 ** 2)
1436 LIMIT = 10
1437 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001438 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001439 self.assertGreater(n, 0)
1440 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001441 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001442 if n is None:
1443 # Succeeded
1444 break
1445 self.assertGreater(n, 0)
1446 else:
1447 # Let us know that this test didn't manage to establish
1448 # the expected conditions. This is not a failure in itself but,
1449 # if it happens repeatedly, the test should be fixed.
1450 self.serv_skipped = "failed to saturate the socket buffer"
1451
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001452
Guido van Rossum8c943832002-08-08 01:00:28 +00001453class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1454
1455 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1456
1457
1458class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1459
1460 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001461
Thomas Woutersb2137042007-02-01 18:02:27 +00001462
Antoine Pitrou834bd812010-10-13 16:17:14 +00001463class UnicodeReadFileObjectClassTestCase(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 = 'wb'
1469 write_msg = MSG
1470 newline = ''
1471
1472
1473class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1474 """Tests for socket.makefile() in text mode (rather than binary)"""
1475
1476 read_mode = 'rb'
1477 read_msg = MSG
1478 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001479 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001480 newline = ''
1481
1482
1483class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1484 """Tests for socket.makefile() in text mode (rather than binary)"""
1485
1486 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001487 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001488 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001489 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001490 newline = ''
1491
1492
Guido van Rossumd8faa362007-04-27 19:54:29 +00001493class NetworkConnectionTest(object):
1494 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001495
Guido van Rossumd8faa362007-04-27 19:54:29 +00001496 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001497 # We're inherited below by BasicTCPTest2, which also inherits
1498 # BasicTCPTest, which defines self.port referenced below.
1499 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001500 self.serv_conn = self.cli
1501
1502class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1503 """Tests that NetworkConnection does not break existing TCP functionality.
1504 """
1505
1506class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001507
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001508 class MockSocket(socket.socket):
1509 def connect(self, *args):
1510 raise socket.timeout('timed out')
1511
1512 @contextlib.contextmanager
1513 def mocked_socket_module(self):
1514 """Return a socket which times out on connect"""
1515 old_socket = socket.socket
1516 socket.socket = self.MockSocket
1517 try:
1518 yield
1519 finally:
1520 socket.socket = old_socket
1521
1522 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001523 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001524 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001525 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001526 with self.assertRaises(socket.error) as cm:
1527 cli.connect((HOST, port))
1528 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1529
1530 def test_create_connection(self):
1531 # Issue #9792: errors raised by create_connection() should have
1532 # a proper errno attribute.
1533 port = support.find_unused_port()
1534 with self.assertRaises(socket.error) as cm:
1535 socket.create_connection((HOST, port))
1536 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1537
1538 def test_create_connection_timeout(self):
1539 # Issue #9792: create_connection() should not recast timeout errors
1540 # as generic socket errors.
1541 with self.mocked_socket_module():
1542 with self.assertRaises(socket.timeout):
1543 socket.create_connection((HOST, 1234))
1544
Guido van Rossumd8faa362007-04-27 19:54:29 +00001545
Victor Stinner45df8202010-04-28 22:31:17 +00001546@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001547class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1548
1549 def __init__(self, methodName='runTest'):
1550 SocketTCPTest.__init__(self, methodName=methodName)
1551 ThreadableTest.__init__(self)
1552
1553 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001554 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001555
1556 def clientTearDown(self):
1557 self.cli.close()
1558 self.cli = None
1559 ThreadableTest.clientTearDown(self)
1560
1561 def _justAccept(self):
1562 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001563 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001564
1565 testFamily = _justAccept
1566 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001567 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001568 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001569 self.assertEqual(self.cli.family, 2)
1570
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001571 testSourceAddress = _justAccept
1572 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001573 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1574 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001575 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001576 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001577 # The port number being used is sufficient to show that the bind()
1578 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001579
Guido van Rossumd8faa362007-04-27 19:54:29 +00001580 testTimeoutDefault = _justAccept
1581 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001582 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001583 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001584 socket.setdefaulttimeout(42)
1585 try:
1586 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001587 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001588 finally:
1589 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001590 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001591
1592 testTimeoutNone = _justAccept
1593 def _testTimeoutNone(self):
1594 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001595 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001596 socket.setdefaulttimeout(30)
1597 try:
1598 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001599 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001600 finally:
1601 socket.setdefaulttimeout(None)
1602 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603
1604 testTimeoutValueNamed = _justAccept
1605 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001606 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001607 self.assertEqual(self.cli.gettimeout(), 30)
1608
1609 testTimeoutValueNonamed = _justAccept
1610 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001611 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001612 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001613 self.assertEqual(self.cli.gettimeout(), 30)
1614
Victor Stinner45df8202010-04-28 22:31:17 +00001615@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001616class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1617
1618 def __init__(self, methodName='runTest'):
1619 SocketTCPTest.__init__(self, methodName=methodName)
1620 ThreadableTest.__init__(self)
1621
1622 def clientSetUp(self):
1623 pass
1624
1625 def clientTearDown(self):
1626 self.cli.close()
1627 self.cli = None
1628 ThreadableTest.clientTearDown(self)
1629
1630 def testInsideTimeout(self):
1631 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001632 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001633 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001634 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001635 testOutsideTimeout = testInsideTimeout
1636
1637 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001638 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001639 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001640 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641
1642 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001643 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001644 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001645
1646
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001647class TCPTimeoutTest(SocketTCPTest):
1648
1649 def testTCPTimeout(self):
1650 def raise_timeout(*args, **kwargs):
1651 self.serv.settimeout(1.0)
1652 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001653 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001654 "Error generating a timeout exception (TCP)")
1655
1656 def testTimeoutZero(self):
1657 ok = False
1658 try:
1659 self.serv.settimeout(0.0)
1660 foo = self.serv.accept()
1661 except socket.timeout:
1662 self.fail("caught timeout instead of error (TCP)")
1663 except socket.error:
1664 ok = True
1665 except:
1666 self.fail("caught unexpected exception (TCP)")
1667 if not ok:
1668 self.fail("accept() returned success when we did not expect it")
1669
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001670 def testInterruptedTimeout(self):
1671 # XXX I don't know how to do this test on MSWindows or any other
1672 # plaform that doesn't support signal.alarm() or os.kill(), though
1673 # the bug should have existed on all platforms.
1674 if not hasattr(signal, "alarm"):
1675 return # can only test on *nix
1676 self.serv.settimeout(5.0) # must be longer than alarm
1677 class Alarm(Exception):
1678 pass
1679 def alarm_handler(signal, frame):
1680 raise Alarm
1681 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1682 try:
1683 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1684 try:
1685 foo = self.serv.accept()
1686 except socket.timeout:
1687 self.fail("caught timeout instead of Alarm")
1688 except Alarm:
1689 pass
1690 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001691 self.fail("caught other exception instead of Alarm:"
1692 " %s(%s):\n%s" %
1693 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001694 else:
1695 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001696 finally:
1697 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001698 except Alarm:
1699 self.fail("got Alarm in wrong place")
1700 finally:
1701 # no alarm can be pending. Safe to restore old handler.
1702 signal.signal(signal.SIGALRM, old_alarm)
1703
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001704class UDPTimeoutTest(SocketTCPTest):
1705
1706 def testUDPTimeout(self):
1707 def raise_timeout(*args, **kwargs):
1708 self.serv.settimeout(1.0)
1709 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001710 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001711 "Error generating a timeout exception (UDP)")
1712
1713 def testTimeoutZero(self):
1714 ok = False
1715 try:
1716 self.serv.settimeout(0.0)
1717 foo = self.serv.recv(1024)
1718 except socket.timeout:
1719 self.fail("caught timeout instead of error (UDP)")
1720 except socket.error:
1721 ok = True
1722 except:
1723 self.fail("caught unexpected exception (UDP)")
1724 if not ok:
1725 self.fail("recv() returned success when we did not expect it")
1726
1727class TestExceptions(unittest.TestCase):
1728
1729 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001730 self.assertTrue(issubclass(socket.error, Exception))
1731 self.assertTrue(issubclass(socket.herror, socket.error))
1732 self.assertTrue(issubclass(socket.gaierror, socket.error))
1733 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001734
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001735class TestLinuxAbstractNamespace(unittest.TestCase):
1736
1737 UNIX_PATH_MAX = 108
1738
1739 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001740 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001741 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1742 s1.bind(address)
1743 s1.listen(1)
1744 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1745 s2.connect(s1.getsockname())
1746 with s1.accept()[0] as s3:
1747 self.assertEqual(s1.getsockname(), address)
1748 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001749
1750 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001751 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001752 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1753 s.bind(address)
1754 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001755
1756 def testNameOverflow(self):
1757 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001758 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1759 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001760
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001761
Victor Stinner45df8202010-04-28 22:31:17 +00001762@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001763class BufferIOTest(SocketConnectedTest):
1764 """
1765 Test the buffer versions of socket.recv() and socket.send().
1766 """
1767 def __init__(self, methodName='runTest'):
1768 SocketConnectedTest.__init__(self, methodName=methodName)
1769
Antoine Pitrou25480782010-03-17 22:50:28 +00001770 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001771 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001772 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001773 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001774 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001775 self.assertEqual(msg, MSG)
1776
Antoine Pitrou25480782010-03-17 22:50:28 +00001777 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001778 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001779 self.serv_conn.send(buf)
1780
Antoine Pitrou25480782010-03-17 22:50:28 +00001781 def testRecvIntoBytearray(self):
1782 buf = bytearray(1024)
1783 nbytes = self.cli_conn.recv_into(buf)
1784 self.assertEqual(nbytes, len(MSG))
1785 msg = buf[:len(MSG)]
1786 self.assertEqual(msg, MSG)
1787
1788 _testRecvIntoBytearray = _testRecvIntoArray
1789
1790 def testRecvIntoMemoryview(self):
1791 buf = bytearray(1024)
1792 nbytes = self.cli_conn.recv_into(memoryview(buf))
1793 self.assertEqual(nbytes, len(MSG))
1794 msg = buf[:len(MSG)]
1795 self.assertEqual(msg, MSG)
1796
1797 _testRecvIntoMemoryview = _testRecvIntoArray
1798
1799 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001800 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001801 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001802 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001803 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001804 self.assertEqual(msg, MSG)
1805
Antoine Pitrou25480782010-03-17 22:50:28 +00001806 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001807 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808 self.serv_conn.send(buf)
1809
Antoine Pitrou25480782010-03-17 22:50:28 +00001810 def testRecvFromIntoBytearray(self):
1811 buf = bytearray(1024)
1812 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1813 self.assertEqual(nbytes, len(MSG))
1814 msg = buf[:len(MSG)]
1815 self.assertEqual(msg, MSG)
1816
1817 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1818
1819 def testRecvFromIntoMemoryview(self):
1820 buf = bytearray(1024)
1821 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1822 self.assertEqual(nbytes, len(MSG))
1823 msg = buf[:len(MSG)]
1824 self.assertEqual(msg, MSG)
1825
1826 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1827
Christian Heimes043d6f62008-01-07 17:19:16 +00001828
1829TIPC_STYPE = 2000
1830TIPC_LOWER = 200
1831TIPC_UPPER = 210
1832
1833def isTipcAvailable():
1834 """Check if the TIPC module is loaded
1835
1836 The TIPC module is not loaded automatically on Ubuntu and probably
1837 other Linux distros.
1838 """
1839 if not hasattr(socket, "AF_TIPC"):
1840 return False
1841 if not os.path.isfile("/proc/modules"):
1842 return False
1843 with open("/proc/modules") as f:
1844 for line in f:
1845 if line.startswith("tipc "):
1846 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001847 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001848 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1849 return False
1850
1851class TIPCTest (unittest.TestCase):
1852 def testRDM(self):
1853 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1854 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1855
1856 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1857 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1858 TIPC_LOWER, TIPC_UPPER)
1859 srv.bind(srvaddr)
1860
1861 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1862 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1863 cli.sendto(MSG, sendaddr)
1864
1865 msg, recvaddr = srv.recvfrom(1024)
1866
1867 self.assertEqual(cli.getsockname(), recvaddr)
1868 self.assertEqual(msg, MSG)
1869
1870
1871class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1872 def __init__(self, methodName = 'runTest'):
1873 unittest.TestCase.__init__(self, methodName = methodName)
1874 ThreadableTest.__init__(self)
1875
1876 def setUp(self):
1877 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1878 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1879 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1880 TIPC_LOWER, TIPC_UPPER)
1881 self.srv.bind(srvaddr)
1882 self.srv.listen(5)
1883 self.serverExplicitReady()
1884 self.conn, self.connaddr = self.srv.accept()
1885
1886 def clientSetUp(self):
1887 # The is a hittable race between serverExplicitReady() and the
1888 # accept() call; sleep a little while to avoid it, otherwise
1889 # we could get an exception
1890 time.sleep(0.1)
1891 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1892 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1893 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1894 self.cli.connect(addr)
1895 self.cliaddr = self.cli.getsockname()
1896
1897 def testStream(self):
1898 msg = self.conn.recv(1024)
1899 self.assertEqual(msg, MSG)
1900 self.assertEqual(self.cliaddr, self.connaddr)
1901
1902 def _testStream(self):
1903 self.cli.send(MSG)
1904 self.cli.close()
1905
1906
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001907@unittest.skipUnless(thread, 'Threading required for this test.')
1908class ContextManagersTest(ThreadedTCPSocketTest):
1909
1910 def _testSocketClass(self):
1911 # base test
1912 with socket.socket() as sock:
1913 self.assertFalse(sock._closed)
1914 self.assertTrue(sock._closed)
1915 # close inside with block
1916 with socket.socket() as sock:
1917 sock.close()
1918 self.assertTrue(sock._closed)
1919 # exception inside with block
1920 with socket.socket() as sock:
1921 self.assertRaises(socket.error, sock.sendall, b'foo')
1922 self.assertTrue(sock._closed)
1923
1924 def testCreateConnectionBase(self):
1925 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001926 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001927 data = conn.recv(1024)
1928 conn.sendall(data)
1929
1930 def _testCreateConnectionBase(self):
1931 address = self.serv.getsockname()
1932 with socket.create_connection(address) as sock:
1933 self.assertFalse(sock._closed)
1934 sock.sendall(b'foo')
1935 self.assertEqual(sock.recv(1024), b'foo')
1936 self.assertTrue(sock._closed)
1937
1938 def testCreateConnectionClose(self):
1939 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001940 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001941 data = conn.recv(1024)
1942 conn.sendall(data)
1943
1944 def _testCreateConnectionClose(self):
1945 address = self.serv.getsockname()
1946 with socket.create_connection(address) as sock:
1947 sock.close()
1948 self.assertTrue(sock._closed)
1949 self.assertRaises(socket.error, sock.sendall, b'foo')
1950
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001951
Antoine Pitroub1c54962010-10-14 15:05:38 +00001952@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1953 "SOCK_CLOEXEC not defined")
1954@unittest.skipUnless(fcntl, "module fcntl not available")
1955class CloexecConstantTest(unittest.TestCase):
1956 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001957 v = linux_version()
1958 if v < (2, 6, 28):
1959 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1960 % ".".join(map(str, v)))
Victor Stinner1d5eb342011-01-03 14:30:46 +00001961 with socket.socket(socket.AF_INET,
1962 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
1963 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1964 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001965
1966
1967@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1968 "SOCK_NONBLOCK not defined")
1969class NonblockConstantTest(unittest.TestCase):
1970 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1971 if nonblock:
1972 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1973 self.assertEqual(s.gettimeout(), timeout)
1974 else:
1975 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1976 self.assertEqual(s.gettimeout(), None)
1977
1978 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001979 v = linux_version()
1980 if v < (2, 6, 28):
1981 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1982 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001983 # a lot of it seems silly and redundant, but I wanted to test that
1984 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00001985 with socket.socket(socket.AF_INET,
1986 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
1987 self.checkNonblock(s)
1988 s.setblocking(1)
1989 self.checkNonblock(s, False)
1990 s.setblocking(0)
1991 self.checkNonblock(s)
1992 s.settimeout(None)
1993 self.checkNonblock(s, False)
1994 s.settimeout(2.0)
1995 self.checkNonblock(s, timeout=2.0)
1996 s.setblocking(1)
1997 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001998 # defaulttimeout
1999 t = socket.getdefaulttimeout()
2000 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002001 with socket.socket() as s:
2002 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002003 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002004 with socket.socket() as s:
2005 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002006 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002007 with socket.socket() as s:
2008 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002009 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002010 with socket.socket() as s:
2011 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002012 socket.setdefaulttimeout(t)
2013
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002014
Guido van Rossumb995eb72002-07-31 16:08:40 +00002015def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002016 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002017 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002018
2019 tests.extend([
2020 NonBlockingTCPTests,
2021 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002022 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002023 UnbufferedFileObjectClassTestCase,
2024 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002025 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002026 UnicodeReadFileObjectClassTestCase,
2027 UnicodeWriteFileObjectClassTestCase,
2028 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002029 NetworkConnectionNoServer,
2030 NetworkConnectionAttributesTest,
2031 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002032 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002033 CloexecConstantTest,
2034 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002035 ])
Dave Cole331708b2004-08-09 04:51:41 +00002036 if hasattr(socket, "socketpair"):
2037 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002038 if sys.platform == 'linux2':
2039 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002040 if isTipcAvailable():
2041 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002042 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002043
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002044 thread_info = support.threading_setup()
2045 support.run_unittest(*tests)
2046 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002047
2048if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002049 test_main()