blob: 704d46e672234c7733b1655b96c87ee4b95e9afc [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitroub1c54962010-10-14 15:05:38 +000021try:
22 import fcntl
23except ImportError:
24 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000026def try_address(host, port=0, family=socket.AF_INET):
27 """Try to bind a socket on the given host:port and return True
28 if that has been possible."""
29 try:
30 sock = socket.socket(family, socket.SOCK_STREAM)
31 sock.bind((host, port))
32 except (socket.error, socket.gaierror):
33 return False
34 else:
35 sock.close()
36 return True
37
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000038def linux_version():
39 try:
40 # platform.release() is something like '2.6.33.7-desktop-2mnb'
41 version_string = platform.release().split('-')[0]
42 return tuple(map(int, version_string.split('.')))
43 except ValueError:
44 return 0, 0, 0
45
Benjamin Petersonee8712c2008-05-20 21:35:26 +000046HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000047MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000048SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Victor Stinner45df8202010-04-28 22:31:17 +000050try:
51 import _thread as thread
52 import threading
53except ImportError:
54 thread = None
55 threading = None
56
Guido van Rossum24e4af82002-06-12 19:18:08 +000057class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000058
Guido van Rossum24e4af82002-06-12 19:18:08 +000059 def setUp(self):
60 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000061 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000062 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000063
Guido van Rossum24e4af82002-06-12 19:18:08 +000064 def tearDown(self):
65 self.serv.close()
66 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000067
Guido van Rossum24e4af82002-06-12 19:18:08 +000068class SocketUDPTest(unittest.TestCase):
69
70 def setUp(self):
71 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000072 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000073
74 def tearDown(self):
75 self.serv.close()
76 self.serv = None
77
78class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000079 """Threadable Test class
80
81 The ThreadableTest class makes it easy to create a threaded
82 client/server pair from an existing unit test. To create a
83 new threaded class from an existing unit test, use multiple
84 inheritance:
85
86 class NewClass (OldClass, ThreadableTest):
87 pass
88
89 This class defines two new fixture functions with obvious
90 purposes for overriding:
91
92 clientSetUp ()
93 clientTearDown ()
94
95 Any new test functions within the class must then define
96 tests in pairs, where the test name is preceeded with a
97 '_' to indicate the client portion of the test. Ex:
98
99 def testFoo(self):
100 # Server portion
101
102 def _testFoo(self):
103 # Client portion
104
105 Any exceptions raised by the clients during their tests
106 are caught and transferred to the main thread to alert
107 the testing framework.
108
109 Note, the server setup function cannot call any blocking
110 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 the blocking call (such as in setting up a client/server
113 connection and performing the accept() in setUp().
114 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def __init__(self):
117 # Swap the true setup function
118 self.__setUp = self.setUp
119 self.__tearDown = self.tearDown
120 self.setUp = self._setUp
121 self.tearDown = self._tearDown
122
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 def serverExplicitReady(self):
124 """This method allows the server to explicitly indicate that
125 it wants the client thread to proceed. This is useful if the
126 server is about to execute a blocking routine that is
127 dependent upon the client thread during its setup routine."""
128 self.server_ready.set()
129
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000131 self.server_ready = threading.Event()
132 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000134 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000137 methodname = self.id()
138 i = methodname.rfind('.')
139 methodname = methodname[i+1:]
140 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000141 self.client_thread = thread.start_new_thread(
142 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000145 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.set()
147 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148
149 def _tearDown(self):
150 self.__tearDown()
151 self.done.wait()
152
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000153 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000154 exc = self.queue.get()
155 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000158 self.server_ready.wait()
159 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000161 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000162 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000163 try:
164 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000165 except BaseException as e:
166 self.queue.put(e)
167 finally:
168 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000169
170 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000171 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172
173 def clientTearDown(self):
174 self.done.set()
175 thread.exit()
176
177class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
178
179 def __init__(self, methodName='runTest'):
180 SocketTCPTest.__init__(self, methodName=methodName)
181 ThreadableTest.__init__(self)
182
183 def clientSetUp(self):
184 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
185
186 def clientTearDown(self):
187 self.cli.close()
188 self.cli = None
189 ThreadableTest.clientTearDown(self)
190
191class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
192
193 def __init__(self, methodName='runTest'):
194 SocketUDPTest.__init__(self, methodName=methodName)
195 ThreadableTest.__init__(self)
196
197 def clientSetUp(self):
198 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
199
200class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000201 """Socket tests for client-server connection.
202
203 self.cli_conn is a client socket connected to the server. The
204 setUp() method guarantees that it is connected to the server.
205 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000206
207 def __init__(self, methodName='runTest'):
208 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
209
210 def setUp(self):
211 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000212 # Indicate explicitly we're ready for the client thread to
213 # proceed and then perform the blocking call to accept
214 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215 conn, addr = self.serv.accept()
216 self.cli_conn = conn
217
218 def tearDown(self):
219 self.cli_conn.close()
220 self.cli_conn = None
221 ThreadedTCPSocketTest.tearDown(self)
222
223 def clientSetUp(self):
224 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000225 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000226 self.serv_conn = self.cli
227
228 def clientTearDown(self):
229 self.serv_conn.close()
230 self.serv_conn = None
231 ThreadedTCPSocketTest.clientTearDown(self)
232
Dave Cole331708b2004-08-09 04:51:41 +0000233class SocketPairTest(unittest.TestCase, ThreadableTest):
234
235 def __init__(self, methodName='runTest'):
236 unittest.TestCase.__init__(self, methodName=methodName)
237 ThreadableTest.__init__(self)
238
239 def setUp(self):
240 self.serv, self.cli = socket.socketpair()
241
242 def tearDown(self):
243 self.serv.close()
244 self.serv = None
245
246 def clientSetUp(self):
247 pass
248
249 def clientTearDown(self):
250 self.cli.close()
251 self.cli = None
252 ThreadableTest.clientTearDown(self)
253
Tim Peters494aaee2004-08-09 18:54:11 +0000254
Guido van Rossum24e4af82002-06-12 19:18:08 +0000255#######################################################################
256## Begin Tests
257
258class GeneralModuleTests(unittest.TestCase):
259
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000260 def test_repr(self):
261 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000262 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000263 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000264
Raymond Hettinger027bb632004-05-31 03:09:25 +0000265 def test_weakref(self):
266 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
267 p = proxy(s)
268 self.assertEqual(p.fileno(), s.fileno())
269 s.close()
270 s = None
271 try:
272 p.fileno()
273 except ReferenceError:
274 pass
275 else:
276 self.fail('Socket proxy still exists')
277
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000279 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 def raise_error(*args, **kwargs):
281 raise socket.error
282 def raise_herror(*args, **kwargs):
283 raise socket.herror
284 def raise_gaierror(*args, **kwargs):
285 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000286 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000288 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000290 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000291 "Error raising socket exception.")
292
293 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000294 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000295 socket.AF_INET
296 socket.SOCK_STREAM
297 socket.SOCK_DGRAM
298 socket.SOCK_RAW
299 socket.SOCK_RDM
300 socket.SOCK_SEQPACKET
301 socket.SOL_SOCKET
302 socket.SO_REUSEADDR
303
Guido van Rossum654c11e2002-06-13 20:24:17 +0000304 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000305 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000306 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000307 try:
308 ip = socket.gethostbyname(hostname)
309 except socket.error:
310 # Probably name lookup wasn't set up right; skip this test
311 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000312 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000313 try:
314 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
315 except socket.error:
316 # Probably a similar problem as above; skip this test
317 return
Brett Cannon01668a12005-03-11 00:04:17 +0000318 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000319 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000320 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000321 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000322
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000323 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000324 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000325 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000326 try:
327 # On some versions, this loses a reference
328 orig = sys.getrefcount(__name__)
329 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000330 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000331 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000333
Guido van Rossum24e4af82002-06-12 19:18:08 +0000334 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000335 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000336 try:
337 # On some versions, this crashes the interpreter.
338 socket.getnameinfo(('x', 0, 0, 0), 0)
339 except socket.error:
340 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000341
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000342 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000343 # This just checks that htons etc. are their own inverse,
344 # when looking at the lower 16 or 32 bits.
345 sizes = {socket.htonl: 32, socket.ntohl: 32,
346 socket.htons: 16, socket.ntohs: 16}
347 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000348 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000349 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
350 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000351
Guido van Rossuma2627af2002-09-14 00:58:46 +0000352 swapped = func(mask)
353 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000354 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000355
Guido van Rossum018919a2007-01-15 00:07:32 +0000356 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000357 good_values = [ 1, 2, 3, 1, 2, 3 ]
358 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000359 for k in good_values:
360 socket.ntohl(k)
361 socket.ntohs(k)
362 socket.htonl(k)
363 socket.htons(k)
364 for k in bad_values:
365 self.assertRaises(OverflowError, socket.ntohl, k)
366 self.assertRaises(OverflowError, socket.ntohs, k)
367 self.assertRaises(OverflowError, socket.htonl, k)
368 self.assertRaises(OverflowError, socket.htons, k)
369
Barry Warsaw11b91a02004-06-28 00:50:43 +0000370 def testGetServBy(self):
371 eq = self.assertEqual
372 # Find one service that exists, then check all the related interfaces.
373 # I've ordered this by protocols that have both a tcp and udp
374 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000375 if (sys.platform.startswith('linux') or
376 sys.platform.startswith('freebsd') or
377 sys.platform.startswith('netbsd') or
378 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000379 # avoid the 'echo' service on this platform, as there is an
380 # assumption breaking non-standard port/protocol entry
381 services = ('daytime', 'qotd', 'domain')
382 else:
383 services = ('echo', 'daytime', 'domain')
384 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000385 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000386 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000387 break
388 except socket.error:
389 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000390 else:
391 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000392 # Try same call with optional protocol omitted
393 port2 = socket.getservbyname(service)
394 eq(port, port2)
395 # Try udp, but don't barf it it doesn't exist
396 try:
397 udpport = socket.getservbyname(service, 'udp')
398 except socket.error:
399 udpport = None
400 else:
401 eq(udpport, port)
402 # Now make sure the lookup by port returns the same service name
403 eq(socket.getservbyport(port2), service)
404 eq(socket.getservbyport(port, 'tcp'), service)
405 if udpport is not None:
406 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000407 # Make sure getservbyport does not accept out of range ports.
408 self.assertRaises(OverflowError, socket.getservbyport, -1)
409 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000410
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000411 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000412 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000413 # The default timeout should initially be None
414 self.assertEqual(socket.getdefaulttimeout(), None)
415 s = socket.socket()
416 self.assertEqual(s.gettimeout(), None)
417 s.close()
418
419 # Set the default timeout to 10, and see if it propagates
420 socket.setdefaulttimeout(10)
421 self.assertEqual(socket.getdefaulttimeout(), 10)
422 s = socket.socket()
423 self.assertEqual(s.gettimeout(), 10)
424 s.close()
425
426 # Reset the default timeout to None, and see if it propagates
427 socket.setdefaulttimeout(None)
428 self.assertEqual(socket.getdefaulttimeout(), None)
429 s = socket.socket()
430 self.assertEqual(s.gettimeout(), None)
431 s.close()
432
433 # Check that setting it to an invalid value raises ValueError
434 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
435
436 # Check that setting it to an invalid type raises TypeError
437 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
438
Benjamin Petersonf91df042009-02-13 02:50:59 +0000439 def testIPv4_inet_aton_fourbytes(self):
440 if not hasattr(socket, 'inet_aton'):
441 return # No inet_aton, nothing to check
442 # Test that issue1008086 and issue767150 are fixed.
443 # It must return 4 bytes.
444 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
445 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
446
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000447 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000448 if not hasattr(socket, 'inet_pton'):
449 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000450 from socket import inet_aton as f, inet_pton, AF_INET
451 g = lambda a: inet_pton(AF_INET, a)
452
Guido van Rossumb5b22702007-05-18 18:55:53 +0000453 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
454 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
455 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
456 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
457 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000458
Guido van Rossumb5b22702007-05-18 18:55:53 +0000459 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
460 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
461 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
462 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000463
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000464 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000465 if not hasattr(socket, 'inet_pton'):
466 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000467 try:
468 from socket import inet_pton, AF_INET6, has_ipv6
469 if not has_ipv6:
470 return
471 except ImportError:
472 return
473 f = lambda a: inet_pton(AF_INET6, a)
474
Guido van Rossum540d9872007-08-17 03:51:09 +0000475 self.assertEquals(b'\x00' * 16, f('::'))
476 self.assertEquals(b'\x00' * 16, f('0::0'))
477 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000478 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000479 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 +0000480 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
481 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000482
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000483 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000484 if not hasattr(socket, 'inet_ntop'):
485 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000486 from socket import inet_ntoa as f, inet_ntop, AF_INET
487 g = lambda a: inet_ntop(AF_INET, a)
488
Guido van Rossumb5b22702007-05-18 18:55:53 +0000489 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
490 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
491 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
492 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000493
Guido van Rossumb5b22702007-05-18 18:55:53 +0000494 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
495 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
496 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000497
498 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000499 if not hasattr(socket, 'inet_ntop'):
500 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000501 try:
502 from socket import inet_ntop, AF_INET6, has_ipv6
503 if not has_ipv6:
504 return
505 except ImportError:
506 return
507 f = lambda a: inet_ntop(AF_INET6, a)
508
Guido van Rossum540d9872007-08-17 03:51:09 +0000509 self.assertEquals('::', f(b'\x00' * 16))
510 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000511 self.assertEquals(
512 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000513 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 +0000514 )
515
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000516 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000517
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000518 def _get_unused_port(self, bind_address='0.0.0.0'):
519 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000520
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000521 Args:
522 bind_address: Hostname or IP address to search for a port on.
523
524 Returns: A most likely to be unused port.
525 """
526 tempsock = socket.socket()
527 tempsock.bind((bind_address, 0))
528 host, port = tempsock.getsockname()
529 tempsock.close()
530 return port
531
532 def testSockName(self):
533 # Testing getsockname()
534 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000536 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000537 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000539 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
540 # it reasonable to get the host's addr in addition to 0.0.0.0.
541 # At least for eCos. This is required for the S/390 to pass.
542 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000543 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000544 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000545
546 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000547 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000548 # We know a socket should start without reuse==0
549 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000550 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000551 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000552 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000553
554 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000555 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000556 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000557 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000558 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
559 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000560 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000561
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000562 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000563 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000564 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
565 sock.settimeout(1)
566 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000567 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000568
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000569 def testNewAttributes(self):
570 # testing .family, .type and .protocol
571 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
572 self.assertEqual(sock.family, socket.AF_INET)
573 self.assertEqual(sock.type, socket.SOCK_STREAM)
574 self.assertEqual(sock.proto, 0)
575 sock.close()
576
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000577 def test_getsockaddrarg(self):
578 host = '0.0.0.0'
579 port = self._get_unused_port(bind_address=host)
580 big_port = port + 65536
581 neg_port = port - 65536
582 sock = socket.socket()
583 try:
584 self.assertRaises(OverflowError, sock.bind, (host, big_port))
585 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
586 sock.bind((host, port))
587 finally:
588 sock.close()
589
Christian Heimesfaf2f632008-01-06 16:59:19 +0000590 def test_sock_ioctl(self):
591 if os.name != "nt":
592 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000593 self.assertTrue(hasattr(socket.socket, 'ioctl'))
594 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
595 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
596 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000597 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
598 s = socket.socket()
599 self.assertRaises(ValueError, s.ioctl, -1, None)
600 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000601
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000602 def testGetaddrinfo(self):
603 try:
604 socket.getaddrinfo('localhost', 80)
605 except socket.gaierror as err:
606 if err.errno == socket.EAI_SERVICE:
607 # see http://bugs.python.org/issue1282647
608 self.skipTest("buggy libc version")
609 raise
610 # len of every sequence is supposed to be == 5
611 for info in socket.getaddrinfo(HOST, None):
612 self.assertEqual(len(info), 5)
613 # host can be a domain name, a string representation of an
614 # IPv4/v6 address or None
615 socket.getaddrinfo('localhost', 80)
616 socket.getaddrinfo('127.0.0.1', 80)
617 socket.getaddrinfo(None, 80)
618 if SUPPORTS_IPV6:
619 socket.getaddrinfo('::1', 80)
620 # port can be a string service name such as "http", a numeric
621 # port number or None
622 socket.getaddrinfo(HOST, "http")
623 socket.getaddrinfo(HOST, 80)
624 socket.getaddrinfo(HOST, None)
625 # test family and socktype filters
626 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
627 for family, _, _, _, _ in infos:
628 self.assertEqual(family, socket.AF_INET)
629 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
630 for _, socktype, _, _, _ in infos:
631 self.assertEqual(socktype, socket.SOCK_STREAM)
632 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000633 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000634 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
635 # a server willing to support both IPv4 and IPv6 will
636 # usually do this
637 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
638 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000639 # test keyword arguments
640 a = socket.getaddrinfo(HOST, None)
641 b = socket.getaddrinfo(host=HOST, port=None)
642 self.assertEqual(a, b)
643 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
644 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
645 self.assertEqual(a, b)
646 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
647 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
648 self.assertEqual(a, b)
649 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
650 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
651 self.assertEqual(a, b)
652 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
653 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
654 self.assertEqual(a, b)
655 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
656 socket.AI_PASSIVE)
657 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
658 type=socket.SOCK_STREAM, proto=0,
659 flags=socket.AI_PASSIVE)
660 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000661
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000662 def test_getnameinfo(self):
663 # only IP addresses are allowed
664 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
665
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000666 @unittest.skipUnless(support.is_resource_enabled('network'),
667 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000668 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000669 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000670 # these should all be successful
671 socket.gethostbyname('испытание.python.org')
672 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000673 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
674 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
675 # have a reverse entry yet
676 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000677
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000678 def check_sendall_interrupted(self, with_timeout):
679 # socketpair() is not stricly required, but it makes things easier.
680 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
681 self.skipTest("signal.alarm and socket.socketpair required for this test")
682 # Our signal handlers clobber the C errno by calling a math function
683 # with an invalid domain value.
684 def ok_handler(*args):
685 self.assertRaises(ValueError, math.acosh, 0)
686 def raising_handler(*args):
687 self.assertRaises(ValueError, math.acosh, 0)
688 1 // 0
689 c, s = socket.socketpair()
690 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
691 try:
692 if with_timeout:
693 # Just above the one second minimum for signal.alarm
694 c.settimeout(1.5)
695 with self.assertRaises(ZeroDivisionError):
696 signal.alarm(1)
697 c.sendall(b"x" * (1024**2))
698 if with_timeout:
699 signal.signal(signal.SIGALRM, ok_handler)
700 signal.alarm(1)
701 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
702 finally:
703 signal.signal(signal.SIGALRM, old_alarm)
704 c.close()
705 s.close()
706
707 def test_sendall_interrupted(self):
708 self.check_sendall_interrupted(False)
709
710 def test_sendall_interrupted_with_timeout(self):
711 self.check_sendall_interrupted(True)
712
Antoine Pitroue033e062010-10-29 10:38:18 +0000713 def test_dealloc_warn(self):
714 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
715 r = repr(sock)
716 with self.assertWarns(ResourceWarning) as cm:
717 sock = None
718 support.gc_collect()
719 self.assertIn(r, str(cm.warning.args[0]))
720 # An open socket file object gets dereferenced after the socket
721 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
722 f = sock.makefile('rb')
723 r = repr(sock)
724 sock = None
725 support.gc_collect()
726 with self.assertWarns(ResourceWarning):
727 f = None
728 support.gc_collect()
729
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000730
Victor Stinner45df8202010-04-28 22:31:17 +0000731@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732class BasicTCPTest(SocketConnectedTest):
733
734 def __init__(self, methodName='runTest'):
735 SocketConnectedTest.__init__(self, methodName=methodName)
736
737 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000738 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000739 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000740 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741
742 def _testRecv(self):
743 self.serv_conn.send(MSG)
744
745 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000746 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747 seg1 = self.cli_conn.recv(len(MSG) - 3)
748 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000749 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000750 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000751
752 def _testOverFlowRecv(self):
753 self.serv_conn.send(MSG)
754
755 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000758 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000759
760 def _testRecvFrom(self):
761 self.serv_conn.send(MSG)
762
763 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000764 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
766 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000767 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000768 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000769
770 def _testOverFlowRecvFrom(self):
771 self.serv_conn.send(MSG)
772
773 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000774 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000775 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776 while 1:
777 read = self.cli_conn.recv(1024)
778 if not read:
779 break
Guido van Rossume531e292002-08-08 20:28:34 +0000780 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000781 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782
783 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000784 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785 self.serv_conn.sendall(big_chunk)
786
787 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000788 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000789 fd = self.cli_conn.fileno()
790 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000791 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000792 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000794 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000795
796 def _testFromFd(self):
797 self.serv_conn.send(MSG)
798
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000799 def testDup(self):
800 # Testing dup()
801 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000802 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000803 msg = sock.recv(1024)
804 self.assertEqual(msg, MSG)
805
806 def _testDup(self):
807 self.serv_conn.send(MSG)
808
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000810 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000812 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000813 # wait for _testShutdown to finish: on OS X, when the server
814 # closes the connection the client also becomes disconnected,
815 # and the client's shutdown call will fail. (Issue #4397.)
816 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817
818 def _testShutdown(self):
819 self.serv_conn.send(MSG)
820 self.serv_conn.shutdown(2)
821
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000822 def testDetach(self):
823 # Testing detach()
824 fileno = self.cli_conn.fileno()
825 f = self.cli_conn.detach()
826 self.assertEqual(f, fileno)
827 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000828 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
829 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000830 # ...but we can create another socket using the (still open)
831 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000832 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000833 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000834 msg = sock.recv(1024)
835 self.assertEqual(msg, MSG)
836
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000837 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000838 self.serv_conn.send(MSG)
839
Victor Stinner45df8202010-04-28 22:31:17 +0000840@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000841class BasicUDPTest(ThreadedUDPSocketTest):
842
843 def __init__(self, methodName='runTest'):
844 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
845
846 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000847 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000849 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850
851 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000852 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853
Guido van Rossum1c938012002-06-12 21:17:20 +0000854 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000855 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000857 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858
Guido van Rossum1c938012002-06-12 21:17:20 +0000859 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000860 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861
Guido van Rossumd8faa362007-04-27 19:54:29 +0000862 def testRecvFromNegative(self):
863 # Negative lengths passed to recvfrom should give ValueError.
864 self.assertRaises(ValueError, self.serv.recvfrom, -1)
865
866 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000867 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000868
Victor Stinner45df8202010-04-28 22:31:17 +0000869@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000870class TCPCloserTest(ThreadedTCPSocketTest):
871
872 def testClose(self):
873 conn, addr = self.serv.accept()
874 conn.close()
875
876 sd = self.cli
877 read, write, err = select.select([sd], [], [], 1.0)
878 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000879 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000880
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000881 # Calling close() many times should be safe.
882 conn.close()
883 conn.close()
884
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000885 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000886 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000887 time.sleep(1.0)
888
Victor Stinner45df8202010-04-28 22:31:17 +0000889@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000890class BasicSocketPairTest(SocketPairTest):
891
892 def __init__(self, methodName='runTest'):
893 SocketPairTest.__init__(self, methodName=methodName)
894
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000895 def _check_defaults(self, sock):
896 self.assertIsInstance(sock, socket.socket)
897 if hasattr(socket, 'AF_UNIX'):
898 self.assertEqual(sock.family, socket.AF_UNIX)
899 else:
900 self.assertEqual(sock.family, socket.AF_INET)
901 self.assertEqual(sock.type, socket.SOCK_STREAM)
902 self.assertEqual(sock.proto, 0)
903
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000904 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000905 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000906
907 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000908 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000909
Dave Cole331708b2004-08-09 04:51:41 +0000910 def testRecv(self):
911 msg = self.serv.recv(1024)
912 self.assertEqual(msg, MSG)
913
914 def _testRecv(self):
915 self.cli.send(MSG)
916
917 def testSend(self):
918 self.serv.send(MSG)
919
920 def _testSend(self):
921 msg = self.cli.recv(1024)
922 self.assertEqual(msg, MSG)
923
Victor Stinner45df8202010-04-28 22:31:17 +0000924@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000925class NonBlockingTCPTests(ThreadedTCPSocketTest):
926
927 def __init__(self, methodName='runTest'):
928 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
929
930 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000931 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 self.serv.setblocking(0)
933 start = time.time()
934 try:
935 self.serv.accept()
936 except socket.error:
937 pass
938 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000939 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000940
941 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000942 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000943
Antoine Pitroub1c54962010-10-14 15:05:38 +0000944 if hasattr(socket, "SOCK_NONBLOCK"):
945 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000946 v = linux_version()
947 if v < (2, 6, 28):
948 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
949 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +0000950 # reinit server socket
951 self.serv.close()
952 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000953 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000954 self.port = support.bind_port(self.serv)
955 self.serv.listen(1)
956 # actual testing
957 start = time.time()
958 try:
959 self.serv.accept()
960 except socket.error:
961 pass
962 end = time.time()
963 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
964
965 def _testInitNonBlocking(self):
966 pass
967
Guido van Rossum24e4af82002-06-12 19:18:08 +0000968 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000969 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000970 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000971 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000972 conn, addr = self.serv.accept()
973 except socket.error:
974 pass
975 else:
976 self.fail("Error trying to do non-blocking accept.")
977 read, write, err = select.select([self.serv], [], [])
978 if self.serv in read:
979 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000980 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000981 else:
982 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000983
Guido van Rossum24e4af82002-06-12 19:18:08 +0000984 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000985 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000986 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000987
988 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000989 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000990 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000991 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000992
993 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000994 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000995 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000996
997 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000998 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000999 conn, addr = self.serv.accept()
1000 conn.setblocking(0)
1001 try:
1002 msg = conn.recv(len(MSG))
1003 except socket.error:
1004 pass
1005 else:
1006 self.fail("Error trying to do non-blocking recv.")
1007 read, write, err = select.select([conn], [], [])
1008 if conn in read:
1009 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001010 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001011 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001012 else:
1013 self.fail("Error during select call to non-blocking socket.")
1014
1015 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001016 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001017 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001018 self.cli.send(MSG)
1019
Victor Stinner45df8202010-04-28 22:31:17 +00001020@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001021class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001022 """Unit tests for the object returned by socket.makefile()
1023
Antoine Pitrou834bd812010-10-13 16:17:14 +00001024 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001025 the client connection. You can read from this file to
1026 get output from the server.
1027
Antoine Pitrou834bd812010-10-13 16:17:14 +00001028 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001029 server connection. You can write to this file to send output
1030 to the client.
1031 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001032
Guido van Rossume9f66142002-08-07 15:46:19 +00001033 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001034 encoding = 'utf8'
1035 errors = 'strict'
1036 newline = None
1037
1038 read_mode = 'rb'
1039 read_msg = MSG
1040 write_mode = 'wb'
1041 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001042
Guido van Rossum24e4af82002-06-12 19:18:08 +00001043 def __init__(self, methodName='runTest'):
1044 SocketConnectedTest.__init__(self, methodName=methodName)
1045
1046 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001047 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1048 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001049 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001050 self.read_file = self.cli_conn.makefile(
1051 self.read_mode, self.bufsize,
1052 encoding = self.encoding,
1053 errors = self.errors,
1054 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055
1056 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001057 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001058 self.read_file.close()
1059 self.assertTrue(self.read_file.closed)
1060 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061 SocketConnectedTest.tearDown(self)
1062
1063 def clientSetUp(self):
1064 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001065 self.write_file = self.serv_conn.makefile(
1066 self.write_mode, self.bufsize,
1067 encoding = self.encoding,
1068 errors = self.errors,
1069 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001070
1071 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001072 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001073 self.write_file.close()
1074 self.assertTrue(self.write_file.closed)
1075 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001076 SocketConnectedTest.clientTearDown(self)
1077
1078 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001079 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001080 first_seg = self.read_file.read(len(self.read_msg)-3)
1081 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001082 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001083 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084
1085 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001086 self.write_file.write(self.write_msg)
1087 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001088
Guido van Rossum8c943832002-08-08 01:00:28 +00001089 def testFullRead(self):
1090 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001091 msg = self.read_file.read()
1092 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001093
1094 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001095 self.write_file.write(self.write_msg)
1096 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001097
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001099 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001100 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001101 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001102 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001103 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001104 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001105 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001106 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001107
1108 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001109 self.write_file.write(self.write_msg)
1110 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001111
1112 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001113 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001114 line = self.read_file.readline()
1115 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001116
1117 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001118 self.write_file.write(self.write_msg)
1119 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001120
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001121 def testCloseAfterMakefile(self):
1122 # The file returned by makefile should keep the socket open.
1123 self.cli_conn.close()
1124 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001125 msg = self.read_file.read()
1126 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001127
1128 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001129 self.write_file.write(self.write_msg)
1130 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001131
1132 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001133 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001134 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001135 if isinstance(self.read_msg, str):
1136 msg = msg.decode()
1137 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001138
1139 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001140 self.write_file.write(self.write_msg)
1141 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001142
Tim Peters116d83c2004-03-28 02:20:45 +00001143 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001144 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001145
1146 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001147 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001148
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001149 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001150 self.assertEqual(self.read_file.mode, self.read_mode)
1151 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001152
1153 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001154 self.assertEqual(self.write_file.mode, self.write_mode)
1155 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001156
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001157 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001158 self.read_file.close()
1159 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001160 self.cli_conn.close()
1161 self.assertRaises(socket.error, self.cli_conn.getsockname)
1162
1163 def _testRealClose(self):
1164 pass
1165
1166
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001167class FileObjectInterruptedTestCase(unittest.TestCase):
1168 """Test that the file object correctly handles EINTR internally."""
1169
1170 class MockSocket(object):
1171 def __init__(self, recv_funcs=()):
1172 # A generator that returns callables that we'll call for each
1173 # call to recv().
1174 self._recv_step = iter(recv_funcs)
1175
1176 def recv_into(self, buffer):
1177 data = next(self._recv_step)()
1178 assert len(buffer) >= len(data)
1179 buffer[:len(data)] = data
1180 return len(data)
1181
1182 def _decref_socketios(self):
1183 pass
1184
1185 def _textiowrap_for_test(self, buffering=-1):
1186 raw = socket.SocketIO(self, "r")
1187 if buffering < 0:
1188 buffering = io.DEFAULT_BUFFER_SIZE
1189 if buffering == 0:
1190 return raw
1191 buffer = io.BufferedReader(raw, buffering)
1192 text = io.TextIOWrapper(buffer, None, None)
1193 text.mode = "rb"
1194 return text
1195
1196 @staticmethod
1197 def _raise_eintr():
1198 raise socket.error(errno.EINTR)
1199
1200 def _textiowrap_mock_socket(self, mock, buffering=-1):
1201 raw = socket.SocketIO(mock, "r")
1202 if buffering < 0:
1203 buffering = io.DEFAULT_BUFFER_SIZE
1204 if buffering == 0:
1205 return raw
1206 buffer = io.BufferedReader(raw, buffering)
1207 text = io.TextIOWrapper(buffer, None, None)
1208 text.mode = "rb"
1209 return text
1210
1211 def _test_readline(self, size=-1, buffering=-1):
1212 mock_sock = self.MockSocket(recv_funcs=[
1213 lambda : b"This is the first line\nAnd the sec",
1214 self._raise_eintr,
1215 lambda : b"ond line is here\n",
1216 lambda : b"",
1217 lambda : b"", # XXX(gps): io library does an extra EOF read
1218 ])
1219 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1220 self.assertEquals(fo.readline(size), "This is the first line\n")
1221 self.assertEquals(fo.readline(size), "And the second line is here\n")
1222
1223 def _test_read(self, size=-1, buffering=-1):
1224 mock_sock = self.MockSocket(recv_funcs=[
1225 lambda : b"This is the first line\nAnd the sec",
1226 self._raise_eintr,
1227 lambda : b"ond line is here\n",
1228 lambda : b"",
1229 lambda : b"", # XXX(gps): io library does an extra EOF read
1230 ])
1231 expecting = (b"This is the first line\n"
1232 b"And the second line is here\n")
1233 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1234 if buffering == 0:
1235 data = b''
1236 else:
1237 data = ''
1238 expecting = expecting.decode('utf8')
1239 while len(data) != len(expecting):
1240 part = fo.read(size)
1241 if not part:
1242 break
1243 data += part
1244 self.assertEquals(data, expecting)
1245
1246 def test_default(self):
1247 self._test_readline()
1248 self._test_readline(size=100)
1249 self._test_read()
1250 self._test_read(size=100)
1251
1252 def test_with_1k_buffer(self):
1253 self._test_readline(buffering=1024)
1254 self._test_readline(size=100, buffering=1024)
1255 self._test_read(buffering=1024)
1256 self._test_read(size=100, buffering=1024)
1257
1258 def _test_readline_no_buffer(self, size=-1):
1259 mock_sock = self.MockSocket(recv_funcs=[
1260 lambda : b"a",
1261 lambda : b"\n",
1262 lambda : b"B",
1263 self._raise_eintr,
1264 lambda : b"b",
1265 lambda : b"",
1266 ])
1267 fo = mock_sock._textiowrap_for_test(buffering=0)
1268 self.assertEquals(fo.readline(size), b"a\n")
1269 self.assertEquals(fo.readline(size), b"Bb")
1270
1271 def test_no_buffer(self):
1272 self._test_readline_no_buffer()
1273 self._test_readline_no_buffer(size=4)
1274 self._test_read(buffering=0)
1275 self._test_read(size=100, buffering=0)
1276
1277
Guido van Rossume9f66142002-08-07 15:46:19 +00001278class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1279
1280 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001281
Guido van Rossume9f66142002-08-07 15:46:19 +00001282 In this case (and in this case only), it should be possible to
1283 create a file object, read a line from it, create another file
1284 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001285 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001286 when reading multiple requests from the same socket."""
1287
1288 bufsize = 0 # Use unbuffered mode
1289
1290 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001291 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001292 line = self.read_file.readline() # first line
1293 self.assertEqual(line, b"A. " + self.write_msg) # first line
1294 self.read_file = self.cli_conn.makefile('rb', 0)
1295 line = self.read_file.readline() # second line
1296 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001297
1298 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001299 self.write_file.write(b"A. " + self.write_msg)
1300 self.write_file.write(b"B. " + self.write_msg)
1301 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001302
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001303 def testMakefileClose(self):
1304 # The file returned by makefile should keep the socket open...
1305 self.cli_conn.close()
1306 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001307 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001308 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001309 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001310 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1311
1312 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001313 self.write_file.write(self.write_msg)
1314 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001315
1316 def testMakefileCloseSocketDestroy(self):
1317 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001318 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001319 refcount_after = sys.getrefcount(self.cli_conn)
1320 self.assertEqual(refcount_before - 1, refcount_after)
1321
1322 def _testMakefileCloseSocketDestroy(self):
1323 pass
1324
Antoine Pitrou98b46702010-09-18 22:59:00 +00001325 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001326 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001327 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1328
1329 def testSmallReadNonBlocking(self):
1330 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001331 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1332 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001333 self.evt1.set()
1334 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001335 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001336 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001337 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001338 self.assertEqual(n, 3)
1339 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001340 self.assertEqual(msg, self.read_msg)
1341 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1342 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001343
1344 def _testSmallReadNonBlocking(self):
1345 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001346 self.write_file.write(self.write_msg)
1347 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001348 self.evt2.set()
1349 # Avoid cloding the socket before the server test has finished,
1350 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1351 self.serv_finished.wait(5.0)
1352
1353 def testWriteNonBlocking(self):
1354 self.cli_finished.wait(5.0)
1355 # The client thread can't skip directly - the SkipTest exception
1356 # would appear as a failure.
1357 if self.serv_skipped:
1358 self.skipTest(self.serv_skipped)
1359
1360 def _testWriteNonBlocking(self):
1361 self.serv_skipped = None
1362 self.serv_conn.setblocking(False)
1363 # Try to saturate the socket buffer pipe with repeated large writes.
1364 BIG = b"x" * (1024 ** 2)
1365 LIMIT = 10
1366 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001367 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001368 self.assertGreater(n, 0)
1369 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001370 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001371 if n is None:
1372 # Succeeded
1373 break
1374 self.assertGreater(n, 0)
1375 else:
1376 # Let us know that this test didn't manage to establish
1377 # the expected conditions. This is not a failure in itself but,
1378 # if it happens repeatedly, the test should be fixed.
1379 self.serv_skipped = "failed to saturate the socket buffer"
1380
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001381
Guido van Rossum8c943832002-08-08 01:00:28 +00001382class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1383
1384 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1385
1386
1387class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1388
1389 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001390
Thomas Woutersb2137042007-02-01 18:02:27 +00001391
Antoine Pitrou834bd812010-10-13 16:17:14 +00001392class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1393 """Tests for socket.makefile() in text mode (rather than binary)"""
1394
1395 read_mode = 'r'
1396 read_msg = MSG.decode('utf8')
1397 write_mode = 'wb'
1398 write_msg = MSG
1399 newline = ''
1400
1401
1402class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1403 """Tests for socket.makefile() in text mode (rather than binary)"""
1404
1405 read_mode = 'rb'
1406 read_msg = MSG
1407 write_mode = 'w'
1408 write_msg = MSG.decode('utf8')
1409 newline = ''
1410
1411
1412class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1413 """Tests for socket.makefile() in text mode (rather than binary)"""
1414
1415 read_mode = 'r'
1416 read_msg = MSG.decode('utf8')
1417 write_mode = 'w'
1418 write_msg = MSG.decode('utf8')
1419 newline = ''
1420
1421
Guido van Rossumd8faa362007-04-27 19:54:29 +00001422class NetworkConnectionTest(object):
1423 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001424
Guido van Rossumd8faa362007-04-27 19:54:29 +00001425 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001426 # We're inherited below by BasicTCPTest2, which also inherits
1427 # BasicTCPTest, which defines self.port referenced below.
1428 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001429 self.serv_conn = self.cli
1430
1431class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1432 """Tests that NetworkConnection does not break existing TCP functionality.
1433 """
1434
1435class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001436
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001437 class MockSocket(socket.socket):
1438 def connect(self, *args):
1439 raise socket.timeout('timed out')
1440
1441 @contextlib.contextmanager
1442 def mocked_socket_module(self):
1443 """Return a socket which times out on connect"""
1444 old_socket = socket.socket
1445 socket.socket = self.MockSocket
1446 try:
1447 yield
1448 finally:
1449 socket.socket = old_socket
1450
1451 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001452 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001453 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001454 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001455 with self.assertRaises(socket.error) as cm:
1456 cli.connect((HOST, port))
1457 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1458
1459 def test_create_connection(self):
1460 # Issue #9792: errors raised by create_connection() should have
1461 # a proper errno attribute.
1462 port = support.find_unused_port()
1463 with self.assertRaises(socket.error) as cm:
1464 socket.create_connection((HOST, port))
1465 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1466
1467 def test_create_connection_timeout(self):
1468 # Issue #9792: create_connection() should not recast timeout errors
1469 # as generic socket errors.
1470 with self.mocked_socket_module():
1471 with self.assertRaises(socket.timeout):
1472 socket.create_connection((HOST, 1234))
1473
Guido van Rossumd8faa362007-04-27 19:54:29 +00001474
Victor Stinner45df8202010-04-28 22:31:17 +00001475@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001476class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1477
1478 def __init__(self, methodName='runTest'):
1479 SocketTCPTest.__init__(self, methodName=methodName)
1480 ThreadableTest.__init__(self)
1481
1482 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001483 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001484
1485 def clientTearDown(self):
1486 self.cli.close()
1487 self.cli = None
1488 ThreadableTest.clientTearDown(self)
1489
1490 def _justAccept(self):
1491 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001492 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001493
1494 testFamily = _justAccept
1495 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001496 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001497 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001498 self.assertEqual(self.cli.family, 2)
1499
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001500 testSourceAddress = _justAccept
1501 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001502 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1503 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001504 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001505 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001506 # The port number being used is sufficient to show that the bind()
1507 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001508
Guido van Rossumd8faa362007-04-27 19:54:29 +00001509 testTimeoutDefault = _justAccept
1510 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001511 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001512 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001513 socket.setdefaulttimeout(42)
1514 try:
1515 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001516 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001517 finally:
1518 socket.setdefaulttimeout(None)
1519 self.assertEquals(self.cli.gettimeout(), 42)
1520
1521 testTimeoutNone = _justAccept
1522 def _testTimeoutNone(self):
1523 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001524 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001525 socket.setdefaulttimeout(30)
1526 try:
1527 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001528 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001529 finally:
1530 socket.setdefaulttimeout(None)
1531 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001532
1533 testTimeoutValueNamed = _justAccept
1534 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001535 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001536 self.assertEqual(self.cli.gettimeout(), 30)
1537
1538 testTimeoutValueNonamed = _justAccept
1539 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001540 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001541 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001542 self.assertEqual(self.cli.gettimeout(), 30)
1543
Victor Stinner45df8202010-04-28 22:31:17 +00001544@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001545class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1546
1547 def __init__(self, methodName='runTest'):
1548 SocketTCPTest.__init__(self, methodName=methodName)
1549 ThreadableTest.__init__(self)
1550
1551 def clientSetUp(self):
1552 pass
1553
1554 def clientTearDown(self):
1555 self.cli.close()
1556 self.cli = None
1557 ThreadableTest.clientTearDown(self)
1558
1559 def testInsideTimeout(self):
1560 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001561 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001562 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001563 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001564 testOutsideTimeout = testInsideTimeout
1565
1566 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001567 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001568 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001569 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001570
1571 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001572 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001573 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001574
1575
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001576class TCPTimeoutTest(SocketTCPTest):
1577
1578 def testTCPTimeout(self):
1579 def raise_timeout(*args, **kwargs):
1580 self.serv.settimeout(1.0)
1581 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001582 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001583 "Error generating a timeout exception (TCP)")
1584
1585 def testTimeoutZero(self):
1586 ok = False
1587 try:
1588 self.serv.settimeout(0.0)
1589 foo = self.serv.accept()
1590 except socket.timeout:
1591 self.fail("caught timeout instead of error (TCP)")
1592 except socket.error:
1593 ok = True
1594 except:
1595 self.fail("caught unexpected exception (TCP)")
1596 if not ok:
1597 self.fail("accept() returned success when we did not expect it")
1598
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001599 def testInterruptedTimeout(self):
1600 # XXX I don't know how to do this test on MSWindows or any other
1601 # plaform that doesn't support signal.alarm() or os.kill(), though
1602 # the bug should have existed on all platforms.
1603 if not hasattr(signal, "alarm"):
1604 return # can only test on *nix
1605 self.serv.settimeout(5.0) # must be longer than alarm
1606 class Alarm(Exception):
1607 pass
1608 def alarm_handler(signal, frame):
1609 raise Alarm
1610 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1611 try:
1612 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1613 try:
1614 foo = self.serv.accept()
1615 except socket.timeout:
1616 self.fail("caught timeout instead of Alarm")
1617 except Alarm:
1618 pass
1619 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001620 self.fail("caught other exception instead of Alarm:"
1621 " %s(%s):\n%s" %
1622 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001623 else:
1624 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001625 finally:
1626 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001627 except Alarm:
1628 self.fail("got Alarm in wrong place")
1629 finally:
1630 # no alarm can be pending. Safe to restore old handler.
1631 signal.signal(signal.SIGALRM, old_alarm)
1632
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001633class UDPTimeoutTest(SocketTCPTest):
1634
1635 def testUDPTimeout(self):
1636 def raise_timeout(*args, **kwargs):
1637 self.serv.settimeout(1.0)
1638 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001639 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001640 "Error generating a timeout exception (UDP)")
1641
1642 def testTimeoutZero(self):
1643 ok = False
1644 try:
1645 self.serv.settimeout(0.0)
1646 foo = self.serv.recv(1024)
1647 except socket.timeout:
1648 self.fail("caught timeout instead of error (UDP)")
1649 except socket.error:
1650 ok = True
1651 except:
1652 self.fail("caught unexpected exception (UDP)")
1653 if not ok:
1654 self.fail("recv() returned success when we did not expect it")
1655
1656class TestExceptions(unittest.TestCase):
1657
1658 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001659 self.assertTrue(issubclass(socket.error, Exception))
1660 self.assertTrue(issubclass(socket.herror, socket.error))
1661 self.assertTrue(issubclass(socket.gaierror, socket.error))
1662 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001663
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001664class TestLinuxAbstractNamespace(unittest.TestCase):
1665
1666 UNIX_PATH_MAX = 108
1667
1668 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001669 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001670 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1671 s1.bind(address)
1672 s1.listen(1)
1673 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1674 s2.connect(s1.getsockname())
1675 s1.accept()
1676 self.assertEqual(s1.getsockname(), address)
1677 self.assertEqual(s2.getpeername(), address)
1678
1679 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001680 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001681 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1682 s.bind(address)
1683 self.assertEqual(s.getsockname(), address)
1684
1685 def testNameOverflow(self):
1686 address = "\x00" + "h" * self.UNIX_PATH_MAX
1687 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1688 self.assertRaises(socket.error, s.bind, address)
1689
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001690
Victor Stinner45df8202010-04-28 22:31:17 +00001691@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001692class BufferIOTest(SocketConnectedTest):
1693 """
1694 Test the buffer versions of socket.recv() and socket.send().
1695 """
1696 def __init__(self, methodName='runTest'):
1697 SocketConnectedTest.__init__(self, methodName=methodName)
1698
Antoine Pitrou25480782010-03-17 22:50:28 +00001699 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001700 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001701 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001702 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001703 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001704 self.assertEqual(msg, MSG)
1705
Antoine Pitrou25480782010-03-17 22:50:28 +00001706 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001707 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001708 self.serv_conn.send(buf)
1709
Antoine Pitrou25480782010-03-17 22:50:28 +00001710 def testRecvIntoBytearray(self):
1711 buf = bytearray(1024)
1712 nbytes = self.cli_conn.recv_into(buf)
1713 self.assertEqual(nbytes, len(MSG))
1714 msg = buf[:len(MSG)]
1715 self.assertEqual(msg, MSG)
1716
1717 _testRecvIntoBytearray = _testRecvIntoArray
1718
1719 def testRecvIntoMemoryview(self):
1720 buf = bytearray(1024)
1721 nbytes = self.cli_conn.recv_into(memoryview(buf))
1722 self.assertEqual(nbytes, len(MSG))
1723 msg = buf[:len(MSG)]
1724 self.assertEqual(msg, MSG)
1725
1726 _testRecvIntoMemoryview = _testRecvIntoArray
1727
1728 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001729 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001730 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001731 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001732 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001733 self.assertEqual(msg, MSG)
1734
Antoine Pitrou25480782010-03-17 22:50:28 +00001735 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001736 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001737 self.serv_conn.send(buf)
1738
Antoine Pitrou25480782010-03-17 22:50:28 +00001739 def testRecvFromIntoBytearray(self):
1740 buf = bytearray(1024)
1741 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1742 self.assertEqual(nbytes, len(MSG))
1743 msg = buf[:len(MSG)]
1744 self.assertEqual(msg, MSG)
1745
1746 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1747
1748 def testRecvFromIntoMemoryview(self):
1749 buf = bytearray(1024)
1750 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1751 self.assertEqual(nbytes, len(MSG))
1752 msg = buf[:len(MSG)]
1753 self.assertEqual(msg, MSG)
1754
1755 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1756
Christian Heimes043d6f62008-01-07 17:19:16 +00001757
1758TIPC_STYPE = 2000
1759TIPC_LOWER = 200
1760TIPC_UPPER = 210
1761
1762def isTipcAvailable():
1763 """Check if the TIPC module is loaded
1764
1765 The TIPC module is not loaded automatically on Ubuntu and probably
1766 other Linux distros.
1767 """
1768 if not hasattr(socket, "AF_TIPC"):
1769 return False
1770 if not os.path.isfile("/proc/modules"):
1771 return False
1772 with open("/proc/modules") as f:
1773 for line in f:
1774 if line.startswith("tipc "):
1775 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001776 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001777 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1778 return False
1779
1780class TIPCTest (unittest.TestCase):
1781 def testRDM(self):
1782 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1783 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1784
1785 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1786 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1787 TIPC_LOWER, TIPC_UPPER)
1788 srv.bind(srvaddr)
1789
1790 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1791 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1792 cli.sendto(MSG, sendaddr)
1793
1794 msg, recvaddr = srv.recvfrom(1024)
1795
1796 self.assertEqual(cli.getsockname(), recvaddr)
1797 self.assertEqual(msg, MSG)
1798
1799
1800class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1801 def __init__(self, methodName = 'runTest'):
1802 unittest.TestCase.__init__(self, methodName = methodName)
1803 ThreadableTest.__init__(self)
1804
1805 def setUp(self):
1806 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1807 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1808 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1809 TIPC_LOWER, TIPC_UPPER)
1810 self.srv.bind(srvaddr)
1811 self.srv.listen(5)
1812 self.serverExplicitReady()
1813 self.conn, self.connaddr = self.srv.accept()
1814
1815 def clientSetUp(self):
1816 # The is a hittable race between serverExplicitReady() and the
1817 # accept() call; sleep a little while to avoid it, otherwise
1818 # we could get an exception
1819 time.sleep(0.1)
1820 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1821 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1822 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1823 self.cli.connect(addr)
1824 self.cliaddr = self.cli.getsockname()
1825
1826 def testStream(self):
1827 msg = self.conn.recv(1024)
1828 self.assertEqual(msg, MSG)
1829 self.assertEqual(self.cliaddr, self.connaddr)
1830
1831 def _testStream(self):
1832 self.cli.send(MSG)
1833 self.cli.close()
1834
1835
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001836@unittest.skipUnless(thread, 'Threading required for this test.')
1837class ContextManagersTest(ThreadedTCPSocketTest):
1838
1839 def _testSocketClass(self):
1840 # base test
1841 with socket.socket() as sock:
1842 self.assertFalse(sock._closed)
1843 self.assertTrue(sock._closed)
1844 # close inside with block
1845 with socket.socket() as sock:
1846 sock.close()
1847 self.assertTrue(sock._closed)
1848 # exception inside with block
1849 with socket.socket() as sock:
1850 self.assertRaises(socket.error, sock.sendall, b'foo')
1851 self.assertTrue(sock._closed)
1852
1853 def testCreateConnectionBase(self):
1854 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001855 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001856 data = conn.recv(1024)
1857 conn.sendall(data)
1858
1859 def _testCreateConnectionBase(self):
1860 address = self.serv.getsockname()
1861 with socket.create_connection(address) as sock:
1862 self.assertFalse(sock._closed)
1863 sock.sendall(b'foo')
1864 self.assertEqual(sock.recv(1024), b'foo')
1865 self.assertTrue(sock._closed)
1866
1867 def testCreateConnectionClose(self):
1868 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001869 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001870 data = conn.recv(1024)
1871 conn.sendall(data)
1872
1873 def _testCreateConnectionClose(self):
1874 address = self.serv.getsockname()
1875 with socket.create_connection(address) as sock:
1876 sock.close()
1877 self.assertTrue(sock._closed)
1878 self.assertRaises(socket.error, sock.sendall, b'foo')
1879
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001880
Antoine Pitroub1c54962010-10-14 15:05:38 +00001881@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1882 "SOCK_CLOEXEC not defined")
1883@unittest.skipUnless(fcntl, "module fcntl not available")
1884class CloexecConstantTest(unittest.TestCase):
1885 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001886 v = linux_version()
1887 if v < (2, 6, 28):
1888 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1889 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001890 s = socket.socket(socket.AF_INET,
1891 socket.SOCK_STREAM | socket.SOCK_CLOEXEC)
1892 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1893 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
1894
1895
1896@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1897 "SOCK_NONBLOCK not defined")
1898class NonblockConstantTest(unittest.TestCase):
1899 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1900 if nonblock:
1901 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1902 self.assertEqual(s.gettimeout(), timeout)
1903 else:
1904 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1905 self.assertEqual(s.gettimeout(), None)
1906
1907 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001908 v = linux_version()
1909 if v < (2, 6, 28):
1910 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1911 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001912 # a lot of it seems silly and redundant, but I wanted to test that
1913 # changing back and forth worked ok
1914 s = socket.socket(socket.AF_INET,
1915 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
1916 self.checkNonblock(s)
1917 s.setblocking(1)
1918 self.checkNonblock(s, False)
1919 s.setblocking(0)
1920 self.checkNonblock(s)
1921 s.settimeout(None)
1922 self.checkNonblock(s, False)
1923 s.settimeout(2.0)
1924 self.checkNonblock(s, timeout=2.0)
1925 s.setblocking(1)
1926 self.checkNonblock(s, False)
1927 # defaulttimeout
1928 t = socket.getdefaulttimeout()
1929 socket.setdefaulttimeout(0.0)
1930 self.checkNonblock(socket.socket())
1931 socket.setdefaulttimeout(None)
1932 self.checkNonblock(socket.socket(), False)
1933 socket.setdefaulttimeout(2.0)
1934 self.checkNonblock(socket.socket(), timeout=2.0)
1935 socket.setdefaulttimeout(None)
1936 self.checkNonblock(socket.socket(), False)
1937 socket.setdefaulttimeout(t)
1938
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001939
Guido van Rossumb995eb72002-07-31 16:08:40 +00001940def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001941 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001942 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001943
1944 tests.extend([
1945 NonBlockingTCPTests,
1946 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001947 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001948 UnbufferedFileObjectClassTestCase,
1949 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001950 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001951 UnicodeReadFileObjectClassTestCase,
1952 UnicodeWriteFileObjectClassTestCase,
1953 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001954 NetworkConnectionNoServer,
1955 NetworkConnectionAttributesTest,
1956 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001957 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00001958 CloexecConstantTest,
1959 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00001960 ])
Dave Cole331708b2004-08-09 04:51:41 +00001961 if hasattr(socket, "socketpair"):
1962 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001963 if sys.platform == 'linux2':
1964 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001965 if isTipcAvailable():
1966 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001967 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001968
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001969 thread_info = support.threading_setup()
1970 support.run_unittest(*tests)
1971 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001972
1973if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001974 test_main()