blob: 053c6fe7be553843cb580b44fe47008c62f7e0ee [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001#!/usr/bin/env python
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00004from test import test_support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Trent Nelsone41b0062008-04-08 23:47:30 +00006import errno
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00009import time
10import traceback
Georg Brandla6168f92008-05-25 07:20:14 +000011import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000012import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000013import os
Martin Blais2856e5f2006-05-26 12:03:27 +000014import array
Antoine Pitrouc818ed42010-09-07 21:40:25 +000015import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000016from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000017import signal
Antoine Pitrou66b5df62010-09-27 18:16:46 +000018import math
Barry Warsawcf3d4b51997-01-03 20:03:32 +000019
Giampaolo Rodolà633e4742010-08-14 17:04:46 +000020def try_address(host, port=0, family=socket.AF_INET):
21 """Try to bind a socket on the given host:port and return True
22 if that has been possible."""
23 try:
24 sock = socket.socket(family, socket.SOCK_STREAM)
25 sock.bind((host, port))
26 except (socket.error, socket.gaierror):
27 return False
28 else:
29 sock.close()
30 return True
31
32HOST = test_support.HOST
33MSG = b'Michael Gilfix was here\n'
34SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
35
Victor Stinner6a102812010-04-27 23:55:59 +000036try:
37 import thread
38 import threading
39except ImportError:
40 thread = None
41 threading = None
42
Trent Nelsone41b0062008-04-08 23:47:30 +000043HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000044MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000045
Guido van Rossum24e4af82002-06-12 19:18:08 +000046class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000047
Guido van Rossum24e4af82002-06-12 19:18:08 +000048 def setUp(self):
49 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000050 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000051 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000052
Guido van Rossum24e4af82002-06-12 19:18:08 +000053 def tearDown(self):
54 self.serv.close()
55 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000056
Guido van Rossum24e4af82002-06-12 19:18:08 +000057class SocketUDPTest(unittest.TestCase):
58
59 def setUp(self):
60 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000061 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000062
63 def tearDown(self):
64 self.serv.close()
65 self.serv = None
66
67class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000068 """Threadable Test class
69
70 The ThreadableTest class makes it easy to create a threaded
71 client/server pair from an existing unit test. To create a
72 new threaded class from an existing unit test, use multiple
73 inheritance:
74
75 class NewClass (OldClass, ThreadableTest):
76 pass
77
78 This class defines two new fixture functions with obvious
79 purposes for overriding:
80
81 clientSetUp ()
82 clientTearDown ()
83
84 Any new test functions within the class must then define
85 tests in pairs, where the test name is preceeded with a
86 '_' to indicate the client portion of the test. Ex:
87
88 def testFoo(self):
89 # Server portion
90
91 def _testFoo(self):
92 # Client portion
93
94 Any exceptions raised by the clients during their tests
95 are caught and transferred to the main thread to alert
96 the testing framework.
97
98 Note, the server setup function cannot call any blocking
99 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +0000100 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000101 the blocking call (such as in setting up a client/server
102 connection and performing the accept() in setUp().
103 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000104
105 def __init__(self):
106 # Swap the true setup function
107 self.__setUp = self.setUp
108 self.__tearDown = self.tearDown
109 self.setUp = self._setUp
110 self.tearDown = self._tearDown
111
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 def serverExplicitReady(self):
113 """This method allows the server to explicitly indicate that
114 it wants the client thread to proceed. This is useful if the
115 server is about to execute a blocking routine that is
116 dependent upon the client thread during its setup routine."""
117 self.server_ready.set()
118
Guido van Rossum24e4af82002-06-12 19:18:08 +0000119 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000120 self.server_ready = threading.Event()
121 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +0000123 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000124
125 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000126 methodname = self.id()
127 i = methodname.rfind('.')
128 methodname = methodname[i+1:]
129 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000130 self.client_thread = thread.start_new_thread(
131 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000132
133 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000134 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000135 self.server_ready.set()
136 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000137
138 def _tearDown(self):
139 self.__tearDown()
140 self.done.wait()
141
142 if not self.queue.empty():
143 msg = self.queue.get()
144 self.fail(msg)
145
146 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000147 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148 self.clientSetUp()
Charles-François Natali21565942011-09-21 22:02:27 +0200149 self.client_ready.set()
Ezio Melottib22c3fe2011-11-06 17:50:52 +0200150 if not callable(test_func):
151 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000152 try:
153 test_func()
154 except Exception, strerror:
155 self.queue.put(strerror)
156 self.clientTearDown()
157
158 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000159 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160
161 def clientTearDown(self):
162 self.done.set()
163 thread.exit()
164
165class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
166
167 def __init__(self, methodName='runTest'):
168 SocketTCPTest.__init__(self, methodName=methodName)
169 ThreadableTest.__init__(self)
170
171 def clientSetUp(self):
172 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
173
174 def clientTearDown(self):
175 self.cli.close()
176 self.cli = None
177 ThreadableTest.clientTearDown(self)
178
179class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
180
181 def __init__(self, methodName='runTest'):
182 SocketUDPTest.__init__(self, methodName=methodName)
183 ThreadableTest.__init__(self)
184
185 def clientSetUp(self):
186 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
187
Brian Curtindd8564f2010-11-04 03:54:23 +0000188 def clientTearDown(self):
189 self.cli.close()
190 self.cli = None
191 ThreadableTest.clientTearDown(self)
192
Guido van Rossum24e4af82002-06-12 19:18:08 +0000193class SocketConnectedTest(ThreadedTCPSocketTest):
194
195 def __init__(self, methodName='runTest'):
196 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
197
198 def setUp(self):
199 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000200 # Indicate explicitly we're ready for the client thread to
201 # proceed and then perform the blocking call to accept
202 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000203 conn, addr = self.serv.accept()
204 self.cli_conn = conn
205
206 def tearDown(self):
207 self.cli_conn.close()
208 self.cli_conn = None
209 ThreadedTCPSocketTest.tearDown(self)
210
211 def clientSetUp(self):
212 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000213 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000214 self.serv_conn = self.cli
215
216 def clientTearDown(self):
217 self.serv_conn.close()
218 self.serv_conn = None
219 ThreadedTCPSocketTest.clientTearDown(self)
220
Dave Cole331708b2004-08-09 04:51:41 +0000221class SocketPairTest(unittest.TestCase, ThreadableTest):
222
223 def __init__(self, methodName='runTest'):
224 unittest.TestCase.__init__(self, methodName=methodName)
225 ThreadableTest.__init__(self)
226
227 def setUp(self):
228 self.serv, self.cli = socket.socketpair()
229
230 def tearDown(self):
231 self.serv.close()
232 self.serv = None
233
234 def clientSetUp(self):
235 pass
236
237 def clientTearDown(self):
238 self.cli.close()
239 self.cli = None
240 ThreadableTest.clientTearDown(self)
241
Tim Peters494aaee2004-08-09 18:54:11 +0000242
Guido van Rossum24e4af82002-06-12 19:18:08 +0000243#######################################################################
244## Begin Tests
245
246class GeneralModuleTests(unittest.TestCase):
247
Raymond Hettinger027bb632004-05-31 03:09:25 +0000248 def test_weakref(self):
249 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
250 p = proxy(s)
251 self.assertEqual(p.fileno(), s.fileno())
252 s.close()
253 s = None
254 try:
255 p.fileno()
256 except ReferenceError:
257 pass
258 else:
259 self.fail('Socket proxy still exists')
260
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000262 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000263 def raise_error(*args, **kwargs):
264 raise socket.error
265 def raise_herror(*args, **kwargs):
266 raise socket.herror
267 def raise_gaierror(*args, **kwargs):
268 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000269 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000271 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000273 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000274 "Error raising socket exception.")
275
Ezio Melotti0639be62011-05-07 19:21:22 +0300276 def testSendtoErrors(self):
277 # Testing that sendto doens't masks failures. See #10169.
278 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
279 self.addCleanup(s.close)
280 s.bind(('', 0))
281 sockname = s.getsockname()
282 # 2 args
283 with self.assertRaises(UnicodeEncodeError):
284 s.sendto(u'\u2620', sockname)
285 with self.assertRaises(TypeError) as cm:
286 s.sendto(5j, sockname)
287 self.assertIn('not complex', str(cm.exception))
288 with self.assertRaises(TypeError) as cm:
289 s.sendto('foo', None)
290 self.assertIn('not NoneType', str(cm.exception))
291 # 3 args
292 with self.assertRaises(UnicodeEncodeError):
293 s.sendto(u'\u2620', 0, sockname)
294 with self.assertRaises(TypeError) as cm:
295 s.sendto(5j, 0, sockname)
296 self.assertIn('not complex', str(cm.exception))
297 with self.assertRaises(TypeError) as cm:
298 s.sendto('foo', 0, None)
299 self.assertIn('not NoneType', str(cm.exception))
300 with self.assertRaises(TypeError) as cm:
301 s.sendto('foo', 'bar', sockname)
302 self.assertIn('an integer is required', str(cm.exception))
303 with self.assertRaises(TypeError) as cm:
304 s.sendto('foo', None, None)
305 self.assertIn('an integer is required', str(cm.exception))
306 # wrong number of args
307 with self.assertRaises(TypeError) as cm:
308 s.sendto('foo')
309 self.assertIn('(1 given)', str(cm.exception))
310 with self.assertRaises(TypeError) as cm:
311 s.sendto('foo', 0, sockname, 4)
312 self.assertIn('(4 given)', str(cm.exception))
313
314
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000316 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000317 socket.AF_INET
318 socket.SOCK_STREAM
319 socket.SOCK_DGRAM
320 socket.SOCK_RAW
321 socket.SOCK_RDM
322 socket.SOCK_SEQPACKET
323 socket.SOL_SOCKET
324 socket.SO_REUSEADDR
325
Guido van Rossum654c11e2002-06-13 20:24:17 +0000326 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000327 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000328 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000329 try:
330 ip = socket.gethostbyname(hostname)
331 except socket.error:
332 # Probably name lookup wasn't set up right; skip this test
333 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000334 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000335 try:
336 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
337 except socket.error:
338 # Probably a similar problem as above; skip this test
339 return
Brett Cannon01668a12005-03-11 00:04:17 +0000340 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000341 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000342 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000343 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000344
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000345 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000346 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000347 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000348 try:
349 # On some versions, this loses a reference
350 orig = sys.getrefcount(__name__)
351 socket.getnameinfo(__name__,0)
Georg Brandlab849892009-09-19 07:35:07 +0000352 except TypeError:
Florent Xicluna07627882010-03-21 01:14:24 +0000353 self.assertEqual(sys.getrefcount(__name__), orig,
354 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000355
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000357 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358 try:
359 # On some versions, this crashes the interpreter.
360 socket.getnameinfo(('x', 0, 0, 0), 0)
361 except socket.error:
362 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000363
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000364 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000365 # This just checks that htons etc. are their own inverse,
366 # when looking at the lower 16 or 32 bits.
367 sizes = {socket.htonl: 32, socket.ntohl: 32,
368 socket.htons: 16, socket.ntohs: 16}
369 for func, size in sizes.items():
370 mask = (1L<<size) - 1
371 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
372 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000373
Guido van Rossuma2627af2002-09-14 00:58:46 +0000374 swapped = func(mask)
375 self.assertEqual(swapped & mask, mask)
376 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000377
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000378 def testNtoHErrors(self):
379 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
380 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
381 for k in good_values:
382 socket.ntohl(k)
383 socket.ntohs(k)
384 socket.htonl(k)
385 socket.htons(k)
386 for k in bad_values:
387 self.assertRaises(OverflowError, socket.ntohl, k)
388 self.assertRaises(OverflowError, socket.ntohs, k)
389 self.assertRaises(OverflowError, socket.htonl, k)
390 self.assertRaises(OverflowError, socket.htons, k)
391
Barry Warsaw11b91a02004-06-28 00:50:43 +0000392 def testGetServBy(self):
393 eq = self.assertEqual
394 # Find one service that exists, then check all the related interfaces.
395 # I've ordered this by protocols that have both a tcp and udp
396 # protocol, at least for modern Linuxes.
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000397 if (sys.platform.startswith('linux') or
398 sys.platform.startswith('freebsd') or
399 sys.platform.startswith('netbsd') or
400 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000401 # avoid the 'echo' service on this platform, as there is an
402 # assumption breaking non-standard port/protocol entry
403 services = ('daytime', 'qotd', 'domain')
404 else:
405 services = ('echo', 'daytime', 'domain')
406 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000407 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000408 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000409 break
410 except socket.error:
411 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000412 else:
413 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000414 # Try same call with optional protocol omitted
415 port2 = socket.getservbyname(service)
416 eq(port, port2)
417 # Try udp, but don't barf it it doesn't exist
418 try:
419 udpport = socket.getservbyname(service, 'udp')
420 except socket.error:
421 udpport = None
422 else:
423 eq(udpport, port)
424 # Now make sure the lookup by port returns the same service name
425 eq(socket.getservbyport(port2), service)
426 eq(socket.getservbyport(port, 'tcp'), service)
427 if udpport is not None:
428 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000429 # Make sure getservbyport does not accept out of range ports.
430 self.assertRaises(OverflowError, socket.getservbyport, -1)
431 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000432
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000433 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000434 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000435 # The default timeout should initially be None
436 self.assertEqual(socket.getdefaulttimeout(), None)
437 s = socket.socket()
438 self.assertEqual(s.gettimeout(), None)
439 s.close()
440
441 # Set the default timeout to 10, and see if it propagates
442 socket.setdefaulttimeout(10)
443 self.assertEqual(socket.getdefaulttimeout(), 10)
444 s = socket.socket()
445 self.assertEqual(s.gettimeout(), 10)
446 s.close()
447
448 # Reset the default timeout to None, and see if it propagates
449 socket.setdefaulttimeout(None)
450 self.assertEqual(socket.getdefaulttimeout(), None)
451 s = socket.socket()
452 self.assertEqual(s.gettimeout(), None)
453 s.close()
454
455 # Check that setting it to an invalid value raises ValueError
456 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
457
458 # Check that setting it to an invalid type raises TypeError
459 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
460
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000461 def testIPv4_inet_aton_fourbytes(self):
462 if not hasattr(socket, 'inet_aton'):
463 return # No inet_aton, nothing to check
464 # Test that issue1008086 and issue767150 are fixed.
465 # It must return 4 bytes.
Ezio Melotti2623a372010-11-21 13:34:58 +0000466 self.assertEqual('\x00'*4, socket.inet_aton('0.0.0.0'))
467 self.assertEqual('\xff'*4, socket.inet_aton('255.255.255.255'))
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000468
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000469 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000470 if not hasattr(socket, 'inet_pton'):
471 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000472 from socket import inet_aton as f, inet_pton, AF_INET
473 g = lambda a: inet_pton(AF_INET, a)
474
Ezio Melotti2623a372010-11-21 13:34:58 +0000475 self.assertEqual('\x00\x00\x00\x00', f('0.0.0.0'))
476 self.assertEqual('\xff\x00\xff\x00', f('255.0.255.0'))
477 self.assertEqual('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
478 self.assertEqual('\x01\x02\x03\x04', f('1.2.3.4'))
479 self.assertEqual('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000480
Ezio Melotti2623a372010-11-21 13:34:58 +0000481 self.assertEqual('\x00\x00\x00\x00', g('0.0.0.0'))
482 self.assertEqual('\xff\x00\xff\x00', g('255.0.255.0'))
483 self.assertEqual('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
484 self.assertEqual('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000485
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000486 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000487 if not hasattr(socket, 'inet_pton'):
488 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000489 try:
490 from socket import inet_pton, AF_INET6, has_ipv6
491 if not has_ipv6:
492 return
493 except ImportError:
494 return
495 f = lambda a: inet_pton(AF_INET6, a)
496
Ezio Melotti2623a372010-11-21 13:34:58 +0000497 self.assertEqual('\x00' * 16, f('::'))
498 self.assertEqual('\x00' * 16, f('0::0'))
499 self.assertEqual('\x00\x01' + '\x00' * 14, f('1::'))
500 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000501 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
502 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
503 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000504
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000505 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000506 if not hasattr(socket, 'inet_ntop'):
507 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000508 from socket import inet_ntoa as f, inet_ntop, AF_INET
509 g = lambda a: inet_ntop(AF_INET, a)
510
Ezio Melotti2623a372010-11-21 13:34:58 +0000511 self.assertEqual('1.0.1.0', f('\x01\x00\x01\x00'))
512 self.assertEqual('170.85.170.85', f('\xaa\x55\xaa\x55'))
513 self.assertEqual('255.255.255.255', f('\xff\xff\xff\xff'))
514 self.assertEqual('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000515
Ezio Melotti2623a372010-11-21 13:34:58 +0000516 self.assertEqual('1.0.1.0', g('\x01\x00\x01\x00'))
517 self.assertEqual('170.85.170.85', g('\xaa\x55\xaa\x55'))
518 self.assertEqual('255.255.255.255', g('\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000519
520 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000521 if not hasattr(socket, 'inet_ntop'):
522 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000523 try:
524 from socket import inet_ntop, AF_INET6, has_ipv6
525 if not has_ipv6:
526 return
527 except ImportError:
528 return
529 f = lambda a: inet_ntop(AF_INET6, a)
530
Ezio Melotti2623a372010-11-21 13:34:58 +0000531 self.assertEqual('::', f('\x00' * 16))
532 self.assertEqual('::1', f('\x00' * 15 + '\x01'))
533 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000534 'aef:b01:506:1001:ffff:9997:55:170',
535 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
536 )
537
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000538 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000539
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000540 def _get_unused_port(self, bind_address='0.0.0.0'):
541 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000542
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000543 Args:
544 bind_address: Hostname or IP address to search for a port on.
545
546 Returns: A most likely to be unused port.
547 """
548 tempsock = socket.socket()
549 tempsock.bind((bind_address, 0))
550 host, port = tempsock.getsockname()
551 tempsock.close()
552 return port
553
554 def testSockName(self):
555 # Testing getsockname()
556 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000558 self.addCleanup(sock.close)
Trent Nelsone41b0062008-04-08 23:47:30 +0000559 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000561 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
562 # it reasonable to get the host's addr in addition to 0.0.0.0.
563 # At least for eCos. This is required for the S/390 to pass.
Georg Brandlb7276502010-11-26 08:28:05 +0000564 try:
565 my_ip_addr = socket.gethostbyname(socket.gethostname())
566 except socket.error:
567 # Probably name lookup wasn't set up right; skip this test
568 return
Ezio Melottiaa980582010-01-23 23:04:36 +0000569 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000570 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571
572 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000573 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000574 # We know a socket should start without reuse==0
575 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000576 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000577 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000578 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000579
580 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000581 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000582 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000583 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
585 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000586 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000588 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000589 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000590 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
591 sock.settimeout(1)
592 sock.close()
593 self.assertRaises(socket.error, sock.send, "spam")
594
Georg Brandlbb03ac02006-03-21 18:17:25 +0000595 def testNewAttributes(self):
596 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000597 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000598 self.assertEqual(sock.family, socket.AF_INET)
599 self.assertEqual(sock.type, socket.SOCK_STREAM)
600 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000601 sock.close()
602
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000603 def test_getsockaddrarg(self):
604 host = '0.0.0.0'
605 port = self._get_unused_port(bind_address=host)
606 big_port = port + 65536
607 neg_port = port - 65536
608 sock = socket.socket()
609 try:
610 self.assertRaises(OverflowError, sock.bind, (host, big_port))
611 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
612 sock.bind((host, port))
613 finally:
614 sock.close()
615
Brian Curtin91a5b812010-11-05 15:52:20 +0000616 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesa47b75b2008-01-04 15:48:06 +0000617 def test_sock_ioctl(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000618 self.assertTrue(hasattr(socket.socket, 'ioctl'))
619 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
620 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
621 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000622 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
623 s = socket.socket()
Brian Curtin91a5b812010-11-05 15:52:20 +0000624 self.addCleanup(s.close)
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000625 self.assertRaises(ValueError, s.ioctl, -1, None)
626 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000627
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000628 def testGetaddrinfo(self):
629 try:
630 socket.getaddrinfo('localhost', 80)
631 except socket.gaierror as err:
632 if err.errno == socket.EAI_SERVICE:
633 # see http://bugs.python.org/issue1282647
634 self.skipTest("buggy libc version")
635 raise
636 # len of every sequence is supposed to be == 5
637 for info in socket.getaddrinfo(HOST, None):
638 self.assertEqual(len(info), 5)
639 # host can be a domain name, a string representation of an
640 # IPv4/v6 address or None
641 socket.getaddrinfo('localhost', 80)
642 socket.getaddrinfo('127.0.0.1', 80)
643 socket.getaddrinfo(None, 80)
644 if SUPPORTS_IPV6:
645 socket.getaddrinfo('::1', 80)
646 # port can be a string service name such as "http", a numeric
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200647 # port number (int or long), or None
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000648 socket.getaddrinfo(HOST, "http")
649 socket.getaddrinfo(HOST, 80)
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200650 socket.getaddrinfo(HOST, 80L)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000651 socket.getaddrinfo(HOST, None)
652 # test family and socktype filters
653 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
654 for family, _, _, _, _ in infos:
655 self.assertEqual(family, socket.AF_INET)
656 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
657 for _, socktype, _, _, _ in infos:
658 self.assertEqual(socktype, socket.SOCK_STREAM)
659 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000660 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000661 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
662 # a server willing to support both IPv4 and IPv6 will
663 # usually do this
664 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
665 socket.AI_PASSIVE)
666
Christian Heimesa47b75b2008-01-04 15:48:06 +0000667
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000668 def check_sendall_interrupted(self, with_timeout):
669 # socketpair() is not stricly required, but it makes things easier.
670 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
671 self.skipTest("signal.alarm and socket.socketpair required for this test")
672 # Our signal handlers clobber the C errno by calling a math function
673 # with an invalid domain value.
674 def ok_handler(*args):
675 self.assertRaises(ValueError, math.acosh, 0)
676 def raising_handler(*args):
677 self.assertRaises(ValueError, math.acosh, 0)
678 1 // 0
679 c, s = socket.socketpair()
680 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
681 try:
682 if with_timeout:
683 # Just above the one second minimum for signal.alarm
684 c.settimeout(1.5)
685 with self.assertRaises(ZeroDivisionError):
686 signal.alarm(1)
687 c.sendall(b"x" * (1024**2))
688 if with_timeout:
689 signal.signal(signal.SIGALRM, ok_handler)
690 signal.alarm(1)
691 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
692 finally:
693 signal.signal(signal.SIGALRM, old_alarm)
694 c.close()
695 s.close()
696
697 def test_sendall_interrupted(self):
698 self.check_sendall_interrupted(False)
699
700 def test_sendall_interrupted_with_timeout(self):
701 self.check_sendall_interrupted(True)
702
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200703 def testListenBacklog0(self):
704 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
705 srv.bind((HOST, 0))
706 # backlog = 0
707 srv.listen(0)
708 srv.close()
709
Charles-François Natali3aa59e32012-01-02 15:38:27 +0100710 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
711 def test_flowinfo(self):
712 self.assertRaises(OverflowError, socket.getnameinfo,
713 ('::1',0, 0xffffffff), 0)
714 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
715 try:
716 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
717 finally:
718 s.close()
719
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000720
Victor Stinner6a102812010-04-27 23:55:59 +0000721@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000722class BasicTCPTest(SocketConnectedTest):
723
724 def __init__(self, methodName='runTest'):
725 SocketConnectedTest.__init__(self, methodName=methodName)
726
727 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000728 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000730 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000731
732 def _testRecv(self):
733 self.serv_conn.send(MSG)
734
735 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000736 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737 seg1 = self.cli_conn.recv(len(MSG) - 3)
738 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000739 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000740 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741
742 def _testOverFlowRecv(self):
743 self.serv_conn.send(MSG)
744
745 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000746 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000748 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749
750 def _testRecvFrom(self):
751 self.serv_conn.send(MSG)
752
753 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000754 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
756 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000757 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000758 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000759
760 def _testOverFlowRecvFrom(self):
761 self.serv_conn.send(MSG)
762
763 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000764 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000765 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766 while 1:
767 read = self.cli_conn.recv(1024)
768 if not read:
769 break
Guido van Rossume531e292002-08-08 20:28:34 +0000770 msg += read
771 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000772
773 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000774 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775 self.serv_conn.sendall(big_chunk)
776
777 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000778 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000779 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000780 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 fd = self.cli_conn.fileno()
782 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000783 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000785 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786
787 def _testFromFd(self):
788 self.serv_conn.send(MSG)
789
Brian Curtin62c20b62010-11-02 02:59:55 +0000790 def testDup(self):
791 # Testing dup()
792 sock = self.cli_conn.dup()
793 self.addCleanup(sock.close)
794 msg = sock.recv(1024)
795 self.assertEqual(msg, MSG)
796
797 def _testDup(self):
798 self.serv_conn.send(MSG)
799
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000801 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000803 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000804 # wait for _testShutdown to finish: on OS X, when the server
805 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000806 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000807 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000808
809 def _testShutdown(self):
810 self.serv_conn.send(MSG)
811 self.serv_conn.shutdown(2)
812
Victor Stinner6a102812010-04-27 23:55:59 +0000813@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814class BasicUDPTest(ThreadedUDPSocketTest):
815
816 def __init__(self, methodName='runTest'):
817 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
818
819 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000820 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000822 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823
824 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000825 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826
Guido van Rossum1c938012002-06-12 21:17:20 +0000827 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000828 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000830 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000831
Guido van Rossum1c938012002-06-12 21:17:20 +0000832 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000833 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834
Facundo Batista1fe9f962007-03-28 03:45:20 +0000835 def testRecvFromNegative(self):
836 # Negative lengths passed to recvfrom should give ValueError.
837 self.assertRaises(ValueError, self.serv.recvfrom, -1)
838
839 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000840 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000841
Victor Stinner6a102812010-04-27 23:55:59 +0000842@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000843class TCPCloserTest(ThreadedTCPSocketTest):
844
845 def testClose(self):
846 conn, addr = self.serv.accept()
847 conn.close()
848
849 sd = self.cli
850 read, write, err = select.select([sd], [], [], 1.0)
851 self.assertEqual(read, [sd])
852 self.assertEqual(sd.recv(1), '')
853
854 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000855 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000856 time.sleep(1.0)
857
Victor Stinner6a102812010-04-27 23:55:59 +0000858@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000859class BasicSocketPairTest(SocketPairTest):
860
861 def __init__(self, methodName='runTest'):
862 SocketPairTest.__init__(self, methodName=methodName)
863
864 def testRecv(self):
865 msg = self.serv.recv(1024)
866 self.assertEqual(msg, MSG)
867
868 def _testRecv(self):
869 self.cli.send(MSG)
870
871 def testSend(self):
872 self.serv.send(MSG)
873
874 def _testSend(self):
875 msg = self.cli.recv(1024)
876 self.assertEqual(msg, MSG)
877
Victor Stinner6a102812010-04-27 23:55:59 +0000878@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879class NonBlockingTCPTests(ThreadedTCPSocketTest):
880
881 def __init__(self, methodName='runTest'):
882 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
883
884 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000885 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886 self.serv.setblocking(0)
887 start = time.time()
888 try:
889 self.serv.accept()
890 except socket.error:
891 pass
892 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000893 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000894
895 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000896 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000897
Guido van Rossum24e4af82002-06-12 19:18:08 +0000898 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000899 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000900 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000901 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000902 conn, addr = self.serv.accept()
903 except socket.error:
904 pass
905 else:
906 self.fail("Error trying to do non-blocking accept.")
907 read, write, err = select.select([self.serv], [], [])
908 if self.serv in read:
909 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000910 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000911 else:
912 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000913
Guido van Rossum24e4af82002-06-12 19:18:08 +0000914 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000915 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000916 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000917
918 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000919 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000921 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922
923 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000924 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000925 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000926
927 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000928 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929 conn, addr = self.serv.accept()
930 conn.setblocking(0)
931 try:
932 msg = conn.recv(len(MSG))
933 except socket.error:
934 pass
935 else:
936 self.fail("Error trying to do non-blocking recv.")
937 read, write, err = select.select([conn], [], [])
938 if conn in read:
939 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +0000940 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +0000941 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942 else:
943 self.fail("Error during select call to non-blocking socket.")
944
945 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000946 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000947 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000948 self.cli.send(MSG)
949
Victor Stinner6a102812010-04-27 23:55:59 +0000950@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000951class FileObjectClassTestCase(SocketConnectedTest):
952
Guido van Rossume9f66142002-08-07 15:46:19 +0000953 bufsize = -1 # Use default buffer size
954
Guido van Rossum24e4af82002-06-12 19:18:08 +0000955 def __init__(self, methodName='runTest'):
956 SocketConnectedTest.__init__(self, methodName=methodName)
957
958 def setUp(self):
959 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000960 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961
962 def tearDown(self):
963 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000964 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965 self.serv_file = None
966 SocketConnectedTest.tearDown(self)
967
968 def clientSetUp(self):
969 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000970 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000971
972 def clientTearDown(self):
973 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000974 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000975 self.cli_file = None
976 SocketConnectedTest.clientTearDown(self)
977
978 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000979 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000980 first_seg = self.serv_file.read(len(MSG)-3)
981 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000982 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000983 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000984
985 def _testSmallRead(self):
986 self.cli_file.write(MSG)
987 self.cli_file.flush()
988
Guido van Rossum8c943832002-08-08 01:00:28 +0000989 def testFullRead(self):
990 # read until EOF
991 msg = self.serv_file.read()
992 self.assertEqual(msg, MSG)
993
994 def _testFullRead(self):
995 self.cli_file.write(MSG)
996 self.cli_file.close()
997
Guido van Rossum24e4af82002-06-12 19:18:08 +0000998 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000999 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001000 buf = ''
1001 while 1:
1002 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001003 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001005 buf += char
1006 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001007
1008 def _testUnbufferedRead(self):
1009 self.cli_file.write(MSG)
1010 self.cli_file.flush()
1011
1012 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001013 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001014 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001015 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001016
1017 def _testReadline(self):
1018 self.cli_file.write(MSG)
1019 self.cli_file.flush()
1020
Gregory P. Smith24237ea2008-05-05 21:53:45 +00001021 def testReadlineAfterRead(self):
1022 a_baloo_is = self.serv_file.read(len("A baloo is"))
1023 self.assertEqual("A baloo is", a_baloo_is)
1024 _a_bear = self.serv_file.read(len(" a bear"))
1025 self.assertEqual(" a bear", _a_bear)
1026 line = self.serv_file.readline()
1027 self.assertEqual("\n", line)
1028 line = self.serv_file.readline()
1029 self.assertEqual("A BALOO IS A BEAR.\n", line)
1030 line = self.serv_file.readline()
1031 self.assertEqual(MSG, line)
1032
1033 def _testReadlineAfterRead(self):
1034 self.cli_file.write("A baloo is a bear\n")
1035 self.cli_file.write("A BALOO IS A BEAR.\n")
1036 self.cli_file.write(MSG)
1037 self.cli_file.flush()
1038
1039 def testReadlineAfterReadNoNewline(self):
1040 end_of_ = self.serv_file.read(len("End Of "))
1041 self.assertEqual("End Of ", end_of_)
1042 line = self.serv_file.readline()
1043 self.assertEqual("Line", line)
1044
1045 def _testReadlineAfterReadNoNewline(self):
1046 self.cli_file.write("End Of Line")
1047
Tim Peters116d83c2004-03-28 02:20:45 +00001048 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001049 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001050
1051 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001052 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001053
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001054
1055class FileObjectInterruptedTestCase(unittest.TestCase):
1056 """Test that the file object correctly handles EINTR internally."""
1057
1058 class MockSocket(object):
1059 def __init__(self, recv_funcs=()):
1060 # A generator that returns callables that we'll call for each
1061 # call to recv().
1062 self._recv_step = iter(recv_funcs)
1063
1064 def recv(self, size):
1065 return self._recv_step.next()()
1066
1067 @staticmethod
1068 def _raise_eintr():
1069 raise socket.error(errno.EINTR)
1070
1071 def _test_readline(self, size=-1, **kwargs):
1072 mock_sock = self.MockSocket(recv_funcs=[
1073 lambda : "This is the first line\nAnd the sec",
1074 self._raise_eintr,
1075 lambda : "ond line is here\n",
1076 lambda : "",
1077 ])
1078 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001079 self.assertEqual(fo.readline(size), "This is the first line\n")
1080 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001081
1082 def _test_read(self, size=-1, **kwargs):
1083 mock_sock = self.MockSocket(recv_funcs=[
1084 lambda : "This is the first line\nAnd the sec",
1085 self._raise_eintr,
1086 lambda : "ond line is here\n",
1087 lambda : "",
1088 ])
1089 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001090 self.assertEqual(fo.read(size), "This is the first line\n"
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001091 "And the second line is here\n")
1092
1093 def test_default(self):
1094 self._test_readline()
1095 self._test_readline(size=100)
1096 self._test_read()
1097 self._test_read(size=100)
1098
1099 def test_with_1k_buffer(self):
1100 self._test_readline(bufsize=1024)
1101 self._test_readline(size=100, bufsize=1024)
1102 self._test_read(bufsize=1024)
1103 self._test_read(size=100, bufsize=1024)
1104
1105 def _test_readline_no_buffer(self, size=-1):
1106 mock_sock = self.MockSocket(recv_funcs=[
1107 lambda : "aa",
1108 lambda : "\n",
1109 lambda : "BB",
1110 self._raise_eintr,
1111 lambda : "bb",
1112 lambda : "",
1113 ])
1114 fo = socket._fileobject(mock_sock, bufsize=0)
Ezio Melotti2623a372010-11-21 13:34:58 +00001115 self.assertEqual(fo.readline(size), "aa\n")
1116 self.assertEqual(fo.readline(size), "BBbb")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001117
1118 def test_no_buffer(self):
1119 self._test_readline_no_buffer()
1120 self._test_readline_no_buffer(size=4)
1121 self._test_read(bufsize=0)
1122 self._test_read(size=100, bufsize=0)
1123
1124
Guido van Rossume9f66142002-08-07 15:46:19 +00001125class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1126
1127 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001128
Guido van Rossume9f66142002-08-07 15:46:19 +00001129 In this case (and in this case only), it should be possible to
1130 create a file object, read a line from it, create another file
1131 object, read another line from it, without loss of data in the
1132 first file object's buffer. Note that httplib relies on this
1133 when reading multiple requests from the same socket."""
1134
1135 bufsize = 0 # Use unbuffered mode
1136
1137 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001138 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001139 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001140 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001141 self.serv_file = self.cli_conn.makefile('rb', 0)
1142 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001143 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001144
1145 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001146 self.cli_file.write("A. " + MSG)
1147 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001148 self.cli_file.flush()
1149
Guido van Rossum8c943832002-08-08 01:00:28 +00001150class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1151
1152 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1153
1154
1155class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1156
1157 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001158
Georg Brandldd7b0522007-01-21 10:35:10 +00001159
Facundo Batista07c78be2007-03-23 18:54:07 +00001160class NetworkConnectionTest(object):
1161 """Prove network connection."""
1162 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001163 # We're inherited below by BasicTCPTest2, which also inherits
1164 # BasicTCPTest, which defines self.port referenced below.
1165 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001166 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001167
Facundo Batista07c78be2007-03-23 18:54:07 +00001168class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1169 """Tests that NetworkConnection does not break existing TCP functionality.
1170 """
1171
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001172class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001173 class MockSocket(socket.socket):
1174 def connect(self, *args):
1175 raise socket.timeout('timed out')
1176
1177 @contextlib.contextmanager
1178 def mocked_socket_module(self):
1179 """Return a socket which times out on connect"""
1180 old_socket = socket.socket
1181 socket.socket = self.MockSocket
1182 try:
1183 yield
1184 finally:
1185 socket.socket = old_socket
1186
1187 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001188 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001189 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001190 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001191 with self.assertRaises(socket.error) as cm:
1192 cli.connect((HOST, port))
1193 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1194
1195 def test_create_connection(self):
1196 # Issue #9792: errors raised by create_connection() should have
1197 # a proper errno attribute.
1198 port = test_support.find_unused_port()
1199 with self.assertRaises(socket.error) as cm:
1200 socket.create_connection((HOST, port))
Trent Nelson6a7f8672012-10-18 01:35:32 -04001201
1202 # Issue #16257: create_connection() calls getaddrinfo() against
1203 # 'localhost'. This may result in an IPV6 addr being returned
1204 # as well as an IPV4 one:
1205 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1206 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1207 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1208 #
1209 # create_connection() enumerates through all the addresses returned
1210 # and if it doesn't successfully bind to any of them, it propagates
1211 # the last exception it encountered.
1212 #
1213 # On Solaris, ENETUNREACH is returned in this circumstance instead
1214 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1215 # expected errnos.
1216 expected_errnos = [ errno.ECONNREFUSED, ]
1217 if hasattr(errno, 'ENETUNREACH'):
1218 expected_errnos.append(errno.ENETUNREACH)
1219
1220 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001221
1222 def test_create_connection_timeout(self):
1223 # Issue #9792: create_connection() should not recast timeout errors
1224 # as generic socket errors.
1225 with self.mocked_socket_module():
1226 with self.assertRaises(socket.timeout):
1227 socket.create_connection((HOST, 1234))
1228
Facundo Batista07c78be2007-03-23 18:54:07 +00001229
Victor Stinner6a102812010-04-27 23:55:59 +00001230@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001231class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1232
1233 def __init__(self, methodName='runTest'):
1234 SocketTCPTest.__init__(self, methodName=methodName)
1235 ThreadableTest.__init__(self)
1236
1237 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001238 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001239
1240 def clientTearDown(self):
1241 self.cli.close()
1242 self.cli = None
1243 ThreadableTest.clientTearDown(self)
1244
1245 def _justAccept(self):
1246 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001247 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001248
1249 testFamily = _justAccept
1250 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001251 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001252 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001253 self.assertEqual(self.cli.family, 2)
1254
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001255 testSourceAddress = _justAccept
1256 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001257 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1258 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001259 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001260 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001261 # The port number being used is sufficient to show that the bind()
1262 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001263
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001264 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001265 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001266 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001267 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001268 socket.setdefaulttimeout(42)
1269 try:
1270 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001271 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001272 finally:
1273 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001274 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001275
1276 testTimeoutNone = _justAccept
1277 def _testTimeoutNone(self):
1278 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001279 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001280 socket.setdefaulttimeout(30)
1281 try:
1282 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001283 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001284 finally:
1285 socket.setdefaulttimeout(None)
1286 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001287
1288 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001289 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001290 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001291 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001292
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001293 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001294 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001295 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001296 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001297 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001298
Victor Stinner6a102812010-04-27 23:55:59 +00001299@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001300class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1301
1302 def __init__(self, methodName='runTest'):
1303 SocketTCPTest.__init__(self, methodName=methodName)
1304 ThreadableTest.__init__(self)
1305
1306 def clientSetUp(self):
1307 pass
1308
1309 def clientTearDown(self):
1310 self.cli.close()
1311 self.cli = None
1312 ThreadableTest.clientTearDown(self)
1313
Facundo Batista07c78be2007-03-23 18:54:07 +00001314 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001315 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001316 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001317 time.sleep(3)
1318 conn.send("done!")
1319 testOutsideTimeout = testInsideTimeout
1320
1321 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001322 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001323 data = sock.recv(5)
1324 self.assertEqual(data, "done!")
1325
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001326 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001327 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001328 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001329
1330
Georg Brandldd7b0522007-01-21 10:35:10 +00001331class Urllib2FileobjectTest(unittest.TestCase):
1332
1333 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1334 # it close the socket if the close c'tor argument is true
1335
1336 def testClose(self):
1337 class MockSocket:
1338 closed = False
1339 def flush(self): pass
1340 def close(self): self.closed = True
1341
1342 # must not close unless we request it: the original use of _fileobject
1343 # by module socket requires that the underlying socket not be closed until
1344 # the _socketobject that created the _fileobject is closed
1345 s = MockSocket()
1346 f = socket._fileobject(s)
1347 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001348 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001349
1350 s = MockSocket()
1351 f = socket._fileobject(s, close=True)
1352 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001353 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001354
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001355class TCPTimeoutTest(SocketTCPTest):
1356
1357 def testTCPTimeout(self):
1358 def raise_timeout(*args, **kwargs):
1359 self.serv.settimeout(1.0)
1360 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001361 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001362 "Error generating a timeout exception (TCP)")
1363
1364 def testTimeoutZero(self):
1365 ok = False
1366 try:
1367 self.serv.settimeout(0.0)
1368 foo = self.serv.accept()
1369 except socket.timeout:
1370 self.fail("caught timeout instead of error (TCP)")
1371 except socket.error:
1372 ok = True
1373 except:
1374 self.fail("caught unexpected exception (TCP)")
1375 if not ok:
1376 self.fail("accept() returned success when we did not expect it")
1377
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001378 def testInterruptedTimeout(self):
1379 # XXX I don't know how to do this test on MSWindows or any other
1380 # plaform that doesn't support signal.alarm() or os.kill(), though
1381 # the bug should have existed on all platforms.
1382 if not hasattr(signal, "alarm"):
1383 return # can only test on *nix
1384 self.serv.settimeout(5.0) # must be longer than alarm
1385 class Alarm(Exception):
1386 pass
1387 def alarm_handler(signal, frame):
1388 raise Alarm
1389 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1390 try:
1391 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1392 try:
1393 foo = self.serv.accept()
1394 except socket.timeout:
1395 self.fail("caught timeout instead of Alarm")
1396 except Alarm:
1397 pass
1398 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001399 self.fail("caught other exception instead of Alarm:"
1400 " %s(%s):\n%s" %
1401 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001402 else:
1403 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001404 finally:
1405 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001406 except Alarm:
1407 self.fail("got Alarm in wrong place")
1408 finally:
1409 # no alarm can be pending. Safe to restore old handler.
1410 signal.signal(signal.SIGALRM, old_alarm)
1411
Ezio Melotti169ed592011-11-18 18:33:14 +02001412class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001413
1414 def testUDPTimeout(self):
1415 def raise_timeout(*args, **kwargs):
1416 self.serv.settimeout(1.0)
1417 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001418 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001419 "Error generating a timeout exception (UDP)")
1420
1421 def testTimeoutZero(self):
1422 ok = False
1423 try:
1424 self.serv.settimeout(0.0)
1425 foo = self.serv.recv(1024)
1426 except socket.timeout:
1427 self.fail("caught timeout instead of error (UDP)")
1428 except socket.error:
1429 ok = True
1430 except:
1431 self.fail("caught unexpected exception (UDP)")
1432 if not ok:
1433 self.fail("recv() returned success when we did not expect it")
1434
1435class TestExceptions(unittest.TestCase):
1436
1437 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001438 self.assertTrue(issubclass(socket.error, Exception))
1439 self.assertTrue(issubclass(socket.herror, socket.error))
1440 self.assertTrue(issubclass(socket.gaierror, socket.error))
1441 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001442
Armin Rigoa9017c32006-04-19 11:50:27 +00001443class TestLinuxAbstractNamespace(unittest.TestCase):
1444
1445 UNIX_PATH_MAX = 108
1446
1447 def testLinuxAbstractNamespace(self):
1448 address = "\x00python-test-hello\x00\xff"
1449 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1450 s1.bind(address)
1451 s1.listen(1)
1452 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1453 s2.connect(s1.getsockname())
1454 s1.accept()
1455 self.assertEqual(s1.getsockname(), address)
1456 self.assertEqual(s2.getpeername(), address)
1457
1458 def testMaxName(self):
1459 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1460 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1461 s.bind(address)
1462 self.assertEqual(s.getsockname(), address)
1463
1464 def testNameOverflow(self):
1465 address = "\x00" + "h" * self.UNIX_PATH_MAX
1466 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1467 self.assertRaises(socket.error, s.bind, address)
1468
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001469
Victor Stinner6a102812010-04-27 23:55:59 +00001470@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001471class BufferIOTest(SocketConnectedTest):
1472 """
1473 Test the buffer versions of socket.recv() and socket.send().
1474 """
1475 def __init__(self, methodName='runTest'):
1476 SocketConnectedTest.__init__(self, methodName=methodName)
1477
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001478 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001479 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001480 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001481 self.assertEqual(nbytes, len(MSG))
1482 msg = buf.tostring()[:len(MSG)]
1483 self.assertEqual(msg, MSG)
1484
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001485 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001486 with test_support.check_py3k_warnings():
1487 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001488 self.serv_conn.send(buf)
1489
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001490 def testRecvIntoBytearray(self):
1491 buf = bytearray(1024)
1492 nbytes = self.cli_conn.recv_into(buf)
1493 self.assertEqual(nbytes, len(MSG))
1494 msg = buf[:len(MSG)]
1495 self.assertEqual(msg, MSG)
1496
1497 _testRecvIntoBytearray = _testRecvIntoArray
1498
1499 def testRecvIntoMemoryview(self):
1500 buf = bytearray(1024)
1501 nbytes = self.cli_conn.recv_into(memoryview(buf))
1502 self.assertEqual(nbytes, len(MSG))
1503 msg = buf[:len(MSG)]
1504 self.assertEqual(msg, MSG)
1505
1506 _testRecvIntoMemoryview = _testRecvIntoArray
1507
1508 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001509 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001510 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001511 self.assertEqual(nbytes, len(MSG))
1512 msg = buf.tostring()[:len(MSG)]
1513 self.assertEqual(msg, MSG)
1514
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001515 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001516 with test_support.check_py3k_warnings():
1517 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001518 self.serv_conn.send(buf)
1519
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001520 def testRecvFromIntoBytearray(self):
1521 buf = bytearray(1024)
1522 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1523 self.assertEqual(nbytes, len(MSG))
1524 msg = buf[:len(MSG)]
1525 self.assertEqual(msg, MSG)
1526
1527 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1528
1529 def testRecvFromIntoMemoryview(self):
1530 buf = bytearray(1024)
1531 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1532 self.assertEqual(nbytes, len(MSG))
1533 msg = buf[:len(MSG)]
1534 self.assertEqual(msg, MSG)
1535
1536 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1537
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001538
1539TIPC_STYPE = 2000
1540TIPC_LOWER = 200
1541TIPC_UPPER = 210
1542
1543def isTipcAvailable():
1544 """Check if the TIPC module is loaded
1545
1546 The TIPC module is not loaded automatically on Ubuntu and probably
1547 other Linux distros.
1548 """
1549 if not hasattr(socket, "AF_TIPC"):
1550 return False
1551 if not os.path.isfile("/proc/modules"):
1552 return False
1553 with open("/proc/modules") as f:
1554 for line in f:
1555 if line.startswith("tipc "):
1556 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001557 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001558 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1559 return False
1560
1561class TIPCTest (unittest.TestCase):
1562 def testRDM(self):
1563 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1564 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1565
1566 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1567 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1568 TIPC_LOWER, TIPC_UPPER)
1569 srv.bind(srvaddr)
1570
1571 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1572 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1573 cli.sendto(MSG, sendaddr)
1574
1575 msg, recvaddr = srv.recvfrom(1024)
1576
1577 self.assertEqual(cli.getsockname(), recvaddr)
1578 self.assertEqual(msg, MSG)
1579
1580
1581class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1582 def __init__(self, methodName = 'runTest'):
1583 unittest.TestCase.__init__(self, methodName = methodName)
1584 ThreadableTest.__init__(self)
1585
1586 def setUp(self):
1587 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1588 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1589 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1590 TIPC_LOWER, TIPC_UPPER)
1591 self.srv.bind(srvaddr)
1592 self.srv.listen(5)
1593 self.serverExplicitReady()
1594 self.conn, self.connaddr = self.srv.accept()
1595
1596 def clientSetUp(self):
1597 # The is a hittable race between serverExplicitReady() and the
1598 # accept() call; sleep a little while to avoid it, otherwise
1599 # we could get an exception
1600 time.sleep(0.1)
1601 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1602 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1603 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1604 self.cli.connect(addr)
1605 self.cliaddr = self.cli.getsockname()
1606
1607 def testStream(self):
1608 msg = self.conn.recv(1024)
1609 self.assertEqual(msg, MSG)
1610 self.assertEqual(self.cliaddr, self.connaddr)
1611
1612 def _testStream(self):
1613 self.cli.send(MSG)
1614 self.cli.close()
1615
1616
Guido van Rossumb995eb72002-07-31 16:08:40 +00001617def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001618 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001619 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1620 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001621
1622 tests.extend([
1623 NonBlockingTCPTests,
1624 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001625 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001626 UnbufferedFileObjectClassTestCase,
1627 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001628 SmallBufferedFileObjectClassTestCase,
1629 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001630 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001631 NetworkConnectionAttributesTest,
1632 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001633 ])
Dave Cole331708b2004-08-09 04:51:41 +00001634 if hasattr(socket, "socketpair"):
1635 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001636 if sys.platform == 'linux2':
1637 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001638 if isTipcAvailable():
1639 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001640 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001641
1642 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001643 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001644 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001645
1646if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001647 test_main()