blob: fec62efe0389101d95954c0927e618449856d171 [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 SocketConnectedTest.tearDown(self)
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +0000966 self.serv_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +0000967
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
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001154 class SocketMemo(object):
1155 """A wrapper to keep track of sent data, needed to examine write behaviour"""
1156 def __init__(self, sock):
1157 self._sock = sock
1158 self.sent = []
1159
1160 def send(self, data, flags=0):
1161 n = self._sock.send(data, flags)
1162 self.sent.append(data[:n])
1163 return n
1164
1165 def sendall(self, data, flags=0):
1166 self._sock.sendall(data, flags)
1167 self.sent.append(data)
1168
1169 def __getattr__(self, attr):
1170 return getattr(self._sock, attr)
1171
1172 def getsent(self):
1173 return [e.tobytes() if isinstance(e, memoryview) else e for e in self.sent]
1174
1175 def setUp(self):
1176 FileObjectClassTestCase.setUp(self)
1177 self.serv_file._sock = self.SocketMemo(self.serv_file._sock)
1178
1179 def testLinebufferedWrite(self):
1180 # Write two lines, in small chunks
1181 msg = MSG.strip()
1182 print >> self.serv_file, msg,
1183 print >> self.serv_file, msg
1184
1185 # second line:
1186 print >> self.serv_file, msg,
1187 print >> self.serv_file, msg,
1188 print >> self.serv_file, msg
1189
1190 # third line
1191 print >> self.serv_file, ''
1192
1193 self.serv_file.flush()
1194
1195 msg1 = "%s %s\n"%(msg, msg)
1196 msg2 = "%s %s %s\n"%(msg, msg, msg)
1197 msg3 = "\n"
1198 self.assertEqual(self.serv_file._sock.getsent(), [msg1, msg2, msg3])
1199
1200 def _testLinebufferedWrite(self):
1201 msg = MSG.strip()
1202 msg1 = "%s %s\n"%(msg, msg)
1203 msg2 = "%s %s %s\n"%(msg, msg, msg)
1204 msg3 = "\n"
1205 l1 = self.cli_file.readline()
1206 self.assertEqual(l1, msg1)
1207 l2 = self.cli_file.readline()
1208 self.assertEqual(l2, msg2)
1209 l3 = self.cli_file.readline()
1210 self.assertEqual(l3, msg3)
1211
Guido van Rossum8c943832002-08-08 01:00:28 +00001212
1213class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1214
1215 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001216
Georg Brandldd7b0522007-01-21 10:35:10 +00001217
Facundo Batista07c78be2007-03-23 18:54:07 +00001218class NetworkConnectionTest(object):
1219 """Prove network connection."""
1220 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001221 # We're inherited below by BasicTCPTest2, which also inherits
1222 # BasicTCPTest, which defines self.port referenced below.
1223 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001224 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001225
Facundo Batista07c78be2007-03-23 18:54:07 +00001226class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1227 """Tests that NetworkConnection does not break existing TCP functionality.
1228 """
1229
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001230class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001231 class MockSocket(socket.socket):
1232 def connect(self, *args):
1233 raise socket.timeout('timed out')
1234
1235 @contextlib.contextmanager
1236 def mocked_socket_module(self):
1237 """Return a socket which times out on connect"""
1238 old_socket = socket.socket
1239 socket.socket = self.MockSocket
1240 try:
1241 yield
1242 finally:
1243 socket.socket = old_socket
1244
1245 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001246 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001247 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001248 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001249 with self.assertRaises(socket.error) as cm:
1250 cli.connect((HOST, port))
1251 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1252
1253 def test_create_connection(self):
1254 # Issue #9792: errors raised by create_connection() should have
1255 # a proper errno attribute.
1256 port = test_support.find_unused_port()
1257 with self.assertRaises(socket.error) as cm:
1258 socket.create_connection((HOST, port))
Trent Nelson6a7f8672012-10-18 01:35:32 -04001259
1260 # Issue #16257: create_connection() calls getaddrinfo() against
1261 # 'localhost'. This may result in an IPV6 addr being returned
1262 # as well as an IPV4 one:
1263 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1264 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1265 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1266 #
1267 # create_connection() enumerates through all the addresses returned
1268 # and if it doesn't successfully bind to any of them, it propagates
1269 # the last exception it encountered.
1270 #
1271 # On Solaris, ENETUNREACH is returned in this circumstance instead
1272 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1273 # expected errnos.
1274 expected_errnos = [ errno.ECONNREFUSED, ]
1275 if hasattr(errno, 'ENETUNREACH'):
1276 expected_errnos.append(errno.ENETUNREACH)
1277
1278 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001279
1280 def test_create_connection_timeout(self):
1281 # Issue #9792: create_connection() should not recast timeout errors
1282 # as generic socket errors.
1283 with self.mocked_socket_module():
1284 with self.assertRaises(socket.timeout):
1285 socket.create_connection((HOST, 1234))
1286
Facundo Batista07c78be2007-03-23 18:54:07 +00001287
Victor Stinner6a102812010-04-27 23:55:59 +00001288@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001289class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1290
1291 def __init__(self, methodName='runTest'):
1292 SocketTCPTest.__init__(self, methodName=methodName)
1293 ThreadableTest.__init__(self)
1294
1295 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001296 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001297
1298 def clientTearDown(self):
1299 self.cli.close()
1300 self.cli = None
1301 ThreadableTest.clientTearDown(self)
1302
1303 def _justAccept(self):
1304 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001305 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001306
1307 testFamily = _justAccept
1308 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001309 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001310 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001311 self.assertEqual(self.cli.family, 2)
1312
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001313 testSourceAddress = _justAccept
1314 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001315 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1316 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001317 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001318 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001319 # The port number being used is sufficient to show that the bind()
1320 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001321
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001322 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001323 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001324 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001325 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001326 socket.setdefaulttimeout(42)
1327 try:
1328 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001329 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001330 finally:
1331 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001332 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001333
1334 testTimeoutNone = _justAccept
1335 def _testTimeoutNone(self):
1336 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001337 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001338 socket.setdefaulttimeout(30)
1339 try:
1340 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001341 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001342 finally:
1343 socket.setdefaulttimeout(None)
1344 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001345
1346 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001347 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001348 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001349 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001350
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001351 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001352 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001353 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001354 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001355 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001356
Victor Stinner6a102812010-04-27 23:55:59 +00001357@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001358class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1359
1360 def __init__(self, methodName='runTest'):
1361 SocketTCPTest.__init__(self, methodName=methodName)
1362 ThreadableTest.__init__(self)
1363
1364 def clientSetUp(self):
1365 pass
1366
1367 def clientTearDown(self):
1368 self.cli.close()
1369 self.cli = None
1370 ThreadableTest.clientTearDown(self)
1371
Facundo Batista07c78be2007-03-23 18:54:07 +00001372 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001373 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001374 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001375 time.sleep(3)
1376 conn.send("done!")
1377 testOutsideTimeout = testInsideTimeout
1378
1379 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001380 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001381 data = sock.recv(5)
1382 self.assertEqual(data, "done!")
1383
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001384 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001385 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001386 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001387
1388
Georg Brandldd7b0522007-01-21 10:35:10 +00001389class Urllib2FileobjectTest(unittest.TestCase):
1390
1391 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1392 # it close the socket if the close c'tor argument is true
1393
1394 def testClose(self):
1395 class MockSocket:
1396 closed = False
1397 def flush(self): pass
1398 def close(self): self.closed = True
1399
1400 # must not close unless we request it: the original use of _fileobject
1401 # by module socket requires that the underlying socket not be closed until
1402 # the _socketobject that created the _fileobject is closed
1403 s = MockSocket()
1404 f = socket._fileobject(s)
1405 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001406 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001407
1408 s = MockSocket()
1409 f = socket._fileobject(s, close=True)
1410 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001411 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001412
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001413class TCPTimeoutTest(SocketTCPTest):
1414
1415 def testTCPTimeout(self):
1416 def raise_timeout(*args, **kwargs):
1417 self.serv.settimeout(1.0)
1418 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001419 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001420 "Error generating a timeout exception (TCP)")
1421
1422 def testTimeoutZero(self):
1423 ok = False
1424 try:
1425 self.serv.settimeout(0.0)
1426 foo = self.serv.accept()
1427 except socket.timeout:
1428 self.fail("caught timeout instead of error (TCP)")
1429 except socket.error:
1430 ok = True
1431 except:
1432 self.fail("caught unexpected exception (TCP)")
1433 if not ok:
1434 self.fail("accept() returned success when we did not expect it")
1435
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001436 def testInterruptedTimeout(self):
1437 # XXX I don't know how to do this test on MSWindows or any other
1438 # plaform that doesn't support signal.alarm() or os.kill(), though
1439 # the bug should have existed on all platforms.
1440 if not hasattr(signal, "alarm"):
1441 return # can only test on *nix
1442 self.serv.settimeout(5.0) # must be longer than alarm
1443 class Alarm(Exception):
1444 pass
1445 def alarm_handler(signal, frame):
1446 raise Alarm
1447 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1448 try:
1449 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1450 try:
1451 foo = self.serv.accept()
1452 except socket.timeout:
1453 self.fail("caught timeout instead of Alarm")
1454 except Alarm:
1455 pass
1456 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001457 self.fail("caught other exception instead of Alarm:"
1458 " %s(%s):\n%s" %
1459 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001460 else:
1461 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001462 finally:
1463 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001464 except Alarm:
1465 self.fail("got Alarm in wrong place")
1466 finally:
1467 # no alarm can be pending. Safe to restore old handler.
1468 signal.signal(signal.SIGALRM, old_alarm)
1469
Ezio Melotti169ed592011-11-18 18:33:14 +02001470class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001471
1472 def testUDPTimeout(self):
1473 def raise_timeout(*args, **kwargs):
1474 self.serv.settimeout(1.0)
1475 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001476 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001477 "Error generating a timeout exception (UDP)")
1478
1479 def testTimeoutZero(self):
1480 ok = False
1481 try:
1482 self.serv.settimeout(0.0)
1483 foo = self.serv.recv(1024)
1484 except socket.timeout:
1485 self.fail("caught timeout instead of error (UDP)")
1486 except socket.error:
1487 ok = True
1488 except:
1489 self.fail("caught unexpected exception (UDP)")
1490 if not ok:
1491 self.fail("recv() returned success when we did not expect it")
1492
1493class TestExceptions(unittest.TestCase):
1494
1495 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001496 self.assertTrue(issubclass(socket.error, Exception))
1497 self.assertTrue(issubclass(socket.herror, socket.error))
1498 self.assertTrue(issubclass(socket.gaierror, socket.error))
1499 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001500
Armin Rigoa9017c32006-04-19 11:50:27 +00001501class TestLinuxAbstractNamespace(unittest.TestCase):
1502
1503 UNIX_PATH_MAX = 108
1504
1505 def testLinuxAbstractNamespace(self):
1506 address = "\x00python-test-hello\x00\xff"
1507 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1508 s1.bind(address)
1509 s1.listen(1)
1510 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1511 s2.connect(s1.getsockname())
1512 s1.accept()
1513 self.assertEqual(s1.getsockname(), address)
1514 self.assertEqual(s2.getpeername(), address)
1515
1516 def testMaxName(self):
1517 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1518 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1519 s.bind(address)
1520 self.assertEqual(s.getsockname(), address)
1521
1522 def testNameOverflow(self):
1523 address = "\x00" + "h" * self.UNIX_PATH_MAX
1524 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1525 self.assertRaises(socket.error, s.bind, address)
1526
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001527
Victor Stinner6a102812010-04-27 23:55:59 +00001528@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001529class BufferIOTest(SocketConnectedTest):
1530 """
1531 Test the buffer versions of socket.recv() and socket.send().
1532 """
1533 def __init__(self, methodName='runTest'):
1534 SocketConnectedTest.__init__(self, methodName=methodName)
1535
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001536 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001537 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001538 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001539 self.assertEqual(nbytes, len(MSG))
1540 msg = buf.tostring()[:len(MSG)]
1541 self.assertEqual(msg, MSG)
1542
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001543 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001544 with test_support.check_py3k_warnings():
1545 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001546 self.serv_conn.send(buf)
1547
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001548 def testRecvIntoBytearray(self):
1549 buf = bytearray(1024)
1550 nbytes = self.cli_conn.recv_into(buf)
1551 self.assertEqual(nbytes, len(MSG))
1552 msg = buf[:len(MSG)]
1553 self.assertEqual(msg, MSG)
1554
1555 _testRecvIntoBytearray = _testRecvIntoArray
1556
1557 def testRecvIntoMemoryview(self):
1558 buf = bytearray(1024)
1559 nbytes = self.cli_conn.recv_into(memoryview(buf))
1560 self.assertEqual(nbytes, len(MSG))
1561 msg = buf[:len(MSG)]
1562 self.assertEqual(msg, MSG)
1563
1564 _testRecvIntoMemoryview = _testRecvIntoArray
1565
1566 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001567 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001568 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001569 self.assertEqual(nbytes, len(MSG))
1570 msg = buf.tostring()[:len(MSG)]
1571 self.assertEqual(msg, MSG)
1572
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001573 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001574 with test_support.check_py3k_warnings():
1575 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001576 self.serv_conn.send(buf)
1577
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001578 def testRecvFromIntoBytearray(self):
1579 buf = bytearray(1024)
1580 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1581 self.assertEqual(nbytes, len(MSG))
1582 msg = buf[:len(MSG)]
1583 self.assertEqual(msg, MSG)
1584
1585 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1586
1587 def testRecvFromIntoMemoryview(self):
1588 buf = bytearray(1024)
1589 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1590 self.assertEqual(nbytes, len(MSG))
1591 msg = buf[:len(MSG)]
1592 self.assertEqual(msg, MSG)
1593
1594 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1595
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001596
1597TIPC_STYPE = 2000
1598TIPC_LOWER = 200
1599TIPC_UPPER = 210
1600
1601def isTipcAvailable():
1602 """Check if the TIPC module is loaded
1603
1604 The TIPC module is not loaded automatically on Ubuntu and probably
1605 other Linux distros.
1606 """
1607 if not hasattr(socket, "AF_TIPC"):
1608 return False
1609 if not os.path.isfile("/proc/modules"):
1610 return False
1611 with open("/proc/modules") as f:
1612 for line in f:
1613 if line.startswith("tipc "):
1614 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001615 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001616 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1617 return False
1618
1619class TIPCTest (unittest.TestCase):
1620 def testRDM(self):
1621 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1622 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1623
1624 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1625 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1626 TIPC_LOWER, TIPC_UPPER)
1627 srv.bind(srvaddr)
1628
1629 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1630 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1631 cli.sendto(MSG, sendaddr)
1632
1633 msg, recvaddr = srv.recvfrom(1024)
1634
1635 self.assertEqual(cli.getsockname(), recvaddr)
1636 self.assertEqual(msg, MSG)
1637
1638
1639class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1640 def __init__(self, methodName = 'runTest'):
1641 unittest.TestCase.__init__(self, methodName = methodName)
1642 ThreadableTest.__init__(self)
1643
1644 def setUp(self):
1645 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1646 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1647 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1648 TIPC_LOWER, TIPC_UPPER)
1649 self.srv.bind(srvaddr)
1650 self.srv.listen(5)
1651 self.serverExplicitReady()
1652 self.conn, self.connaddr = self.srv.accept()
1653
1654 def clientSetUp(self):
1655 # The is a hittable race between serverExplicitReady() and the
1656 # accept() call; sleep a little while to avoid it, otherwise
1657 # we could get an exception
1658 time.sleep(0.1)
1659 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1660 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1661 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1662 self.cli.connect(addr)
1663 self.cliaddr = self.cli.getsockname()
1664
1665 def testStream(self):
1666 msg = self.conn.recv(1024)
1667 self.assertEqual(msg, MSG)
1668 self.assertEqual(self.cliaddr, self.connaddr)
1669
1670 def _testStream(self):
1671 self.cli.send(MSG)
1672 self.cli.close()
1673
1674
Guido van Rossumb995eb72002-07-31 16:08:40 +00001675def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001676 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001677 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1678 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001679
1680 tests.extend([
1681 NonBlockingTCPTests,
1682 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001683 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001684 UnbufferedFileObjectClassTestCase,
1685 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001686 SmallBufferedFileObjectClassTestCase,
1687 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001688 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001689 NetworkConnectionAttributesTest,
1690 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001691 ])
Dave Cole331708b2004-08-09 04:51:41 +00001692 if hasattr(socket, "socketpair"):
1693 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001694 if sys.platform == 'linux2':
1695 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001696 if isTipcAvailable():
1697 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001698 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001699
1700 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001701 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001702 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001703
1704if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001705 test_main()