blob: 0d6240d8e169aabbaec8886176c6b516dc2194b6 [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()
Florent Xicluna07627882010-03-21 01:14:24 +0000150 with test_support.check_py3k_warnings():
151 if not callable(test_func):
152 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000153 try:
154 test_func()
155 except Exception, strerror:
156 self.queue.put(strerror)
157 self.clientTearDown()
158
159 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000160 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000161
162 def clientTearDown(self):
163 self.done.set()
164 thread.exit()
165
166class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
167
168 def __init__(self, methodName='runTest'):
169 SocketTCPTest.__init__(self, methodName=methodName)
170 ThreadableTest.__init__(self)
171
172 def clientSetUp(self):
173 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
174
175 def clientTearDown(self):
176 self.cli.close()
177 self.cli = None
178 ThreadableTest.clientTearDown(self)
179
180class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
181
182 def __init__(self, methodName='runTest'):
183 SocketUDPTest.__init__(self, methodName=methodName)
184 ThreadableTest.__init__(self)
185
186 def clientSetUp(self):
187 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
188
Brian Curtindd8564f2010-11-04 03:54:23 +0000189 def clientTearDown(self):
190 self.cli.close()
191 self.cli = None
192 ThreadableTest.clientTearDown(self)
193
Guido van Rossum24e4af82002-06-12 19:18:08 +0000194class SocketConnectedTest(ThreadedTCPSocketTest):
195
196 def __init__(self, methodName='runTest'):
197 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
198
199 def setUp(self):
200 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000201 # Indicate explicitly we're ready for the client thread to
202 # proceed and then perform the blocking call to accept
203 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000204 conn, addr = self.serv.accept()
205 self.cli_conn = conn
206
207 def tearDown(self):
208 self.cli_conn.close()
209 self.cli_conn = None
210 ThreadedTCPSocketTest.tearDown(self)
211
212 def clientSetUp(self):
213 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000214 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215 self.serv_conn = self.cli
216
217 def clientTearDown(self):
218 self.serv_conn.close()
219 self.serv_conn = None
220 ThreadedTCPSocketTest.clientTearDown(self)
221
Dave Cole331708b2004-08-09 04:51:41 +0000222class SocketPairTest(unittest.TestCase, ThreadableTest):
223
224 def __init__(self, methodName='runTest'):
225 unittest.TestCase.__init__(self, methodName=methodName)
226 ThreadableTest.__init__(self)
227
228 def setUp(self):
229 self.serv, self.cli = socket.socketpair()
230
231 def tearDown(self):
232 self.serv.close()
233 self.serv = None
234
235 def clientSetUp(self):
236 pass
237
238 def clientTearDown(self):
239 self.cli.close()
240 self.cli = None
241 ThreadableTest.clientTearDown(self)
242
Tim Peters494aaee2004-08-09 18:54:11 +0000243
Guido van Rossum24e4af82002-06-12 19:18:08 +0000244#######################################################################
245## Begin Tests
246
247class GeneralModuleTests(unittest.TestCase):
248
Raymond Hettinger027bb632004-05-31 03:09:25 +0000249 def test_weakref(self):
250 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
251 p = proxy(s)
252 self.assertEqual(p.fileno(), s.fileno())
253 s.close()
254 s = None
255 try:
256 p.fileno()
257 except ReferenceError:
258 pass
259 else:
260 self.fail('Socket proxy still exists')
261
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000263 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 def raise_error(*args, **kwargs):
265 raise socket.error
266 def raise_herror(*args, **kwargs):
267 raise socket.herror
268 def raise_gaierror(*args, **kwargs):
269 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000270 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000272 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000274 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 "Error raising socket exception.")
276
Ezio Melotti0639be62011-05-07 19:21:22 +0300277 def testSendtoErrors(self):
278 # Testing that sendto doens't masks failures. See #10169.
279 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
280 self.addCleanup(s.close)
281 s.bind(('', 0))
282 sockname = s.getsockname()
283 # 2 args
284 with self.assertRaises(UnicodeEncodeError):
285 s.sendto(u'\u2620', sockname)
286 with self.assertRaises(TypeError) as cm:
287 s.sendto(5j, sockname)
288 self.assertIn('not complex', str(cm.exception))
289 with self.assertRaises(TypeError) as cm:
290 s.sendto('foo', None)
291 self.assertIn('not NoneType', str(cm.exception))
292 # 3 args
293 with self.assertRaises(UnicodeEncodeError):
294 s.sendto(u'\u2620', 0, sockname)
295 with self.assertRaises(TypeError) as cm:
296 s.sendto(5j, 0, sockname)
297 self.assertIn('not complex', str(cm.exception))
298 with self.assertRaises(TypeError) as cm:
299 s.sendto('foo', 0, None)
300 self.assertIn('not NoneType', str(cm.exception))
301 with self.assertRaises(TypeError) as cm:
302 s.sendto('foo', 'bar', sockname)
303 self.assertIn('an integer is required', str(cm.exception))
304 with self.assertRaises(TypeError) as cm:
305 s.sendto('foo', None, None)
306 self.assertIn('an integer is required', str(cm.exception))
307 # wrong number of args
308 with self.assertRaises(TypeError) as cm:
309 s.sendto('foo')
310 self.assertIn('(1 given)', str(cm.exception))
311 with self.assertRaises(TypeError) as cm:
312 s.sendto('foo', 0, sockname, 4)
313 self.assertIn('(4 given)', str(cm.exception))
314
315
Guido van Rossum24e4af82002-06-12 19:18:08 +0000316 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000317 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318 socket.AF_INET
319 socket.SOCK_STREAM
320 socket.SOCK_DGRAM
321 socket.SOCK_RAW
322 socket.SOCK_RDM
323 socket.SOCK_SEQPACKET
324 socket.SOL_SOCKET
325 socket.SO_REUSEADDR
326
Guido van Rossum654c11e2002-06-13 20:24:17 +0000327 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000328 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000329 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000330 try:
331 ip = socket.gethostbyname(hostname)
332 except socket.error:
333 # Probably name lookup wasn't set up right; skip this test
334 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000335 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000336 try:
337 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
338 except socket.error:
339 # Probably a similar problem as above; skip this test
340 return
Brett Cannon01668a12005-03-11 00:04:17 +0000341 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000342 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000343 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000344 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000345
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000346 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000347 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000348 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000349 try:
350 # On some versions, this loses a reference
351 orig = sys.getrefcount(__name__)
352 socket.getnameinfo(__name__,0)
Georg Brandlab849892009-09-19 07:35:07 +0000353 except TypeError:
Florent Xicluna07627882010-03-21 01:14:24 +0000354 self.assertEqual(sys.getrefcount(__name__), orig,
355 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000356
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000358 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000359 try:
360 # On some versions, this crashes the interpreter.
361 socket.getnameinfo(('x', 0, 0, 0), 0)
362 except socket.error:
363 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000364
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000365 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000366 # This just checks that htons etc. are their own inverse,
367 # when looking at the lower 16 or 32 bits.
368 sizes = {socket.htonl: 32, socket.ntohl: 32,
369 socket.htons: 16, socket.ntohs: 16}
370 for func, size in sizes.items():
371 mask = (1L<<size) - 1
372 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
373 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000374
Guido van Rossuma2627af2002-09-14 00:58:46 +0000375 swapped = func(mask)
376 self.assertEqual(swapped & mask, mask)
377 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000378
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000379 def testNtoHErrors(self):
380 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
381 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
382 for k in good_values:
383 socket.ntohl(k)
384 socket.ntohs(k)
385 socket.htonl(k)
386 socket.htons(k)
387 for k in bad_values:
388 self.assertRaises(OverflowError, socket.ntohl, k)
389 self.assertRaises(OverflowError, socket.ntohs, k)
390 self.assertRaises(OverflowError, socket.htonl, k)
391 self.assertRaises(OverflowError, socket.htons, k)
392
Barry Warsaw11b91a02004-06-28 00:50:43 +0000393 def testGetServBy(self):
394 eq = self.assertEqual
395 # Find one service that exists, then check all the related interfaces.
396 # I've ordered this by protocols that have both a tcp and udp
397 # protocol, at least for modern Linuxes.
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000398 if (sys.platform.startswith('linux') or
399 sys.platform.startswith('freebsd') or
400 sys.platform.startswith('netbsd') or
401 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000402 # avoid the 'echo' service on this platform, as there is an
403 # assumption breaking non-standard port/protocol entry
404 services = ('daytime', 'qotd', 'domain')
405 else:
406 services = ('echo', 'daytime', 'domain')
407 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000408 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000409 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000410 break
411 except socket.error:
412 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000413 else:
414 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000415 # Try same call with optional protocol omitted
416 port2 = socket.getservbyname(service)
417 eq(port, port2)
418 # Try udp, but don't barf it it doesn't exist
419 try:
420 udpport = socket.getservbyname(service, 'udp')
421 except socket.error:
422 udpport = None
423 else:
424 eq(udpport, port)
425 # Now make sure the lookup by port returns the same service name
426 eq(socket.getservbyport(port2), service)
427 eq(socket.getservbyport(port, 'tcp'), service)
428 if udpport is not None:
429 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000430 # Make sure getservbyport does not accept out of range ports.
431 self.assertRaises(OverflowError, socket.getservbyport, -1)
432 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000433
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000434 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000435 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000436 # The default timeout should initially be None
437 self.assertEqual(socket.getdefaulttimeout(), None)
438 s = socket.socket()
439 self.assertEqual(s.gettimeout(), None)
440 s.close()
441
442 # Set the default timeout to 10, and see if it propagates
443 socket.setdefaulttimeout(10)
444 self.assertEqual(socket.getdefaulttimeout(), 10)
445 s = socket.socket()
446 self.assertEqual(s.gettimeout(), 10)
447 s.close()
448
449 # Reset the default timeout to None, and see if it propagates
450 socket.setdefaulttimeout(None)
451 self.assertEqual(socket.getdefaulttimeout(), None)
452 s = socket.socket()
453 self.assertEqual(s.gettimeout(), None)
454 s.close()
455
456 # Check that setting it to an invalid value raises ValueError
457 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
458
459 # Check that setting it to an invalid type raises TypeError
460 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
461
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000462 def testIPv4_inet_aton_fourbytes(self):
463 if not hasattr(socket, 'inet_aton'):
464 return # No inet_aton, nothing to check
465 # Test that issue1008086 and issue767150 are fixed.
466 # It must return 4 bytes.
Ezio Melotti2623a372010-11-21 13:34:58 +0000467 self.assertEqual('\x00'*4, socket.inet_aton('0.0.0.0'))
468 self.assertEqual('\xff'*4, socket.inet_aton('255.255.255.255'))
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000469
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000470 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000471 if not hasattr(socket, 'inet_pton'):
472 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000473 from socket import inet_aton as f, inet_pton, AF_INET
474 g = lambda a: inet_pton(AF_INET, a)
475
Ezio Melotti2623a372010-11-21 13:34:58 +0000476 self.assertEqual('\x00\x00\x00\x00', f('0.0.0.0'))
477 self.assertEqual('\xff\x00\xff\x00', f('255.0.255.0'))
478 self.assertEqual('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
479 self.assertEqual('\x01\x02\x03\x04', f('1.2.3.4'))
480 self.assertEqual('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000481
Ezio Melotti2623a372010-11-21 13:34:58 +0000482 self.assertEqual('\x00\x00\x00\x00', g('0.0.0.0'))
483 self.assertEqual('\xff\x00\xff\x00', g('255.0.255.0'))
484 self.assertEqual('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
485 self.assertEqual('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000486
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000487 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000488 if not hasattr(socket, 'inet_pton'):
489 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000490 try:
491 from socket import inet_pton, AF_INET6, has_ipv6
492 if not has_ipv6:
493 return
494 except ImportError:
495 return
496 f = lambda a: inet_pton(AF_INET6, a)
497
Ezio Melotti2623a372010-11-21 13:34:58 +0000498 self.assertEqual('\x00' * 16, f('::'))
499 self.assertEqual('\x00' * 16, f('0::0'))
500 self.assertEqual('\x00\x01' + '\x00' * 14, f('1::'))
501 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000502 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
503 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
504 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000505
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000506 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000507 if not hasattr(socket, 'inet_ntop'):
508 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000509 from socket import inet_ntoa as f, inet_ntop, AF_INET
510 g = lambda a: inet_ntop(AF_INET, a)
511
Ezio Melotti2623a372010-11-21 13:34:58 +0000512 self.assertEqual('1.0.1.0', f('\x01\x00\x01\x00'))
513 self.assertEqual('170.85.170.85', f('\xaa\x55\xaa\x55'))
514 self.assertEqual('255.255.255.255', f('\xff\xff\xff\xff'))
515 self.assertEqual('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000516
Ezio Melotti2623a372010-11-21 13:34:58 +0000517 self.assertEqual('1.0.1.0', g('\x01\x00\x01\x00'))
518 self.assertEqual('170.85.170.85', g('\xaa\x55\xaa\x55'))
519 self.assertEqual('255.255.255.255', g('\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000520
521 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000522 if not hasattr(socket, 'inet_ntop'):
523 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000524 try:
525 from socket import inet_ntop, AF_INET6, has_ipv6
526 if not has_ipv6:
527 return
528 except ImportError:
529 return
530 f = lambda a: inet_ntop(AF_INET6, a)
531
Ezio Melotti2623a372010-11-21 13:34:58 +0000532 self.assertEqual('::', f('\x00' * 16))
533 self.assertEqual('::1', f('\x00' * 15 + '\x01'))
534 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000535 'aef:b01:506:1001:ffff:9997:55:170',
536 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
537 )
538
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000539 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000540
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000541 def _get_unused_port(self, bind_address='0.0.0.0'):
542 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000543
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000544 Args:
545 bind_address: Hostname or IP address to search for a port on.
546
547 Returns: A most likely to be unused port.
548 """
549 tempsock = socket.socket()
550 tempsock.bind((bind_address, 0))
551 host, port = tempsock.getsockname()
552 tempsock.close()
553 return port
554
555 def testSockName(self):
556 # Testing getsockname()
557 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000558 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000559 self.addCleanup(sock.close)
Trent Nelsone41b0062008-04-08 23:47:30 +0000560 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000561 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000562 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
563 # it reasonable to get the host's addr in addition to 0.0.0.0.
564 # At least for eCos. This is required for the S/390 to pass.
Georg Brandlb7276502010-11-26 08:28:05 +0000565 try:
566 my_ip_addr = socket.gethostbyname(socket.gethostname())
567 except socket.error:
568 # Probably name lookup wasn't set up right; skip this test
569 return
Ezio Melottiaa980582010-01-23 23:04:36 +0000570 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000571 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572
573 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000574 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575 # We know a socket should start without reuse==0
576 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000577 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000579 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000580
581 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000582 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000583 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000584 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000585 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
586 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000587 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000588
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000589 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000590 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000591 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
592 sock.settimeout(1)
593 sock.close()
594 self.assertRaises(socket.error, sock.send, "spam")
595
Georg Brandlbb03ac02006-03-21 18:17:25 +0000596 def testNewAttributes(self):
597 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000598 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000599 self.assertEqual(sock.family, socket.AF_INET)
600 self.assertEqual(sock.type, socket.SOCK_STREAM)
601 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000602 sock.close()
603
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000604 def test_getsockaddrarg(self):
605 host = '0.0.0.0'
606 port = self._get_unused_port(bind_address=host)
607 big_port = port + 65536
608 neg_port = port - 65536
609 sock = socket.socket()
610 try:
611 self.assertRaises(OverflowError, sock.bind, (host, big_port))
612 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
613 sock.bind((host, port))
614 finally:
615 sock.close()
616
Brian Curtin91a5b812010-11-05 15:52:20 +0000617 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesa47b75b2008-01-04 15:48:06 +0000618 def test_sock_ioctl(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000619 self.assertTrue(hasattr(socket.socket, 'ioctl'))
620 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
621 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
622 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000623 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
624 s = socket.socket()
Brian Curtin91a5b812010-11-05 15:52:20 +0000625 self.addCleanup(s.close)
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000626 self.assertRaises(ValueError, s.ioctl, -1, None)
627 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000628
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000629 def testGetaddrinfo(self):
630 try:
631 socket.getaddrinfo('localhost', 80)
632 except socket.gaierror as err:
633 if err.errno == socket.EAI_SERVICE:
634 # see http://bugs.python.org/issue1282647
635 self.skipTest("buggy libc version")
636 raise
637 # len of every sequence is supposed to be == 5
638 for info in socket.getaddrinfo(HOST, None):
639 self.assertEqual(len(info), 5)
640 # host can be a domain name, a string representation of an
641 # IPv4/v6 address or None
642 socket.getaddrinfo('localhost', 80)
643 socket.getaddrinfo('127.0.0.1', 80)
644 socket.getaddrinfo(None, 80)
645 if SUPPORTS_IPV6:
646 socket.getaddrinfo('::1', 80)
647 # port can be a string service name such as "http", a numeric
648 # port number or None
649 socket.getaddrinfo(HOST, "http")
650 socket.getaddrinfo(HOST, 80)
651 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
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000710
Victor Stinner6a102812010-04-27 23:55:59 +0000711@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712class BasicTCPTest(SocketConnectedTest):
713
714 def __init__(self, methodName='runTest'):
715 SocketConnectedTest.__init__(self, methodName=methodName)
716
717 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000718 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000719 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000720 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721
722 def _testRecv(self):
723 self.serv_conn.send(MSG)
724
725 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000726 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 seg1 = self.cli_conn.recv(len(MSG) - 3)
728 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000729 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000730 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000731
732 def _testOverFlowRecv(self):
733 self.serv_conn.send(MSG)
734
735 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000736 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000738 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000739
740 def _testRecvFrom(self):
741 self.serv_conn.send(MSG)
742
743 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000744 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000745 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
746 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000747 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000748 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749
750 def _testOverFlowRecvFrom(self):
751 self.serv_conn.send(MSG)
752
753 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000754 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000755 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756 while 1:
757 read = self.cli_conn.recv(1024)
758 if not read:
759 break
Guido van Rossume531e292002-08-08 20:28:34 +0000760 msg += read
761 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762
763 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000764 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765 self.serv_conn.sendall(big_chunk)
766
767 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000768 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000769 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000770 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771 fd = self.cli_conn.fileno()
772 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000773 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000775 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776
777 def _testFromFd(self):
778 self.serv_conn.send(MSG)
779
Brian Curtin62c20b62010-11-02 02:59:55 +0000780 def testDup(self):
781 # Testing dup()
782 sock = self.cli_conn.dup()
783 self.addCleanup(sock.close)
784 msg = sock.recv(1024)
785 self.assertEqual(msg, MSG)
786
787 def _testDup(self):
788 self.serv_conn.send(MSG)
789
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000791 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000792 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000793 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000794 # wait for _testShutdown to finish: on OS X, when the server
795 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000796 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000797 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798
799 def _testShutdown(self):
800 self.serv_conn.send(MSG)
801 self.serv_conn.shutdown(2)
802
Victor Stinner6a102812010-04-27 23:55:59 +0000803@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000804class BasicUDPTest(ThreadedUDPSocketTest):
805
806 def __init__(self, methodName='runTest'):
807 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
808
809 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000810 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000812 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813
814 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000815 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816
Guido van Rossum1c938012002-06-12 21:17:20 +0000817 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000818 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000820 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821
Guido van Rossum1c938012002-06-12 21:17:20 +0000822 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000823 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824
Facundo Batista1fe9f962007-03-28 03:45:20 +0000825 def testRecvFromNegative(self):
826 # Negative lengths passed to recvfrom should give ValueError.
827 self.assertRaises(ValueError, self.serv.recvfrom, -1)
828
829 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000830 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000831
Victor Stinner6a102812010-04-27 23:55:59 +0000832@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000833class TCPCloserTest(ThreadedTCPSocketTest):
834
835 def testClose(self):
836 conn, addr = self.serv.accept()
837 conn.close()
838
839 sd = self.cli
840 read, write, err = select.select([sd], [], [], 1.0)
841 self.assertEqual(read, [sd])
842 self.assertEqual(sd.recv(1), '')
843
844 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000845 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000846 time.sleep(1.0)
847
Victor Stinner6a102812010-04-27 23:55:59 +0000848@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000849class BasicSocketPairTest(SocketPairTest):
850
851 def __init__(self, methodName='runTest'):
852 SocketPairTest.__init__(self, methodName=methodName)
853
854 def testRecv(self):
855 msg = self.serv.recv(1024)
856 self.assertEqual(msg, MSG)
857
858 def _testRecv(self):
859 self.cli.send(MSG)
860
861 def testSend(self):
862 self.serv.send(MSG)
863
864 def _testSend(self):
865 msg = self.cli.recv(1024)
866 self.assertEqual(msg, MSG)
867
Victor Stinner6a102812010-04-27 23:55:59 +0000868@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869class NonBlockingTCPTests(ThreadedTCPSocketTest):
870
871 def __init__(self, methodName='runTest'):
872 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
873
874 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000875 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876 self.serv.setblocking(0)
877 start = time.time()
878 try:
879 self.serv.accept()
880 except socket.error:
881 pass
882 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000883 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884
885 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000886 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000887
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000889 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000891 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892 conn, addr = self.serv.accept()
893 except socket.error:
894 pass
895 else:
896 self.fail("Error trying to do non-blocking accept.")
897 read, write, err = select.select([self.serv], [], [])
898 if self.serv in read:
899 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000900 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901 else:
902 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000903
Guido van Rossum24e4af82002-06-12 19:18:08 +0000904 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000905 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000906 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000907
908 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000909 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000910 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000911 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000912
913 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000914 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000915 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916
917 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000918 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919 conn, addr = self.serv.accept()
920 conn.setblocking(0)
921 try:
922 msg = conn.recv(len(MSG))
923 except socket.error:
924 pass
925 else:
926 self.fail("Error trying to do non-blocking recv.")
927 read, write, err = select.select([conn], [], [])
928 if conn in read:
929 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +0000930 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +0000931 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 else:
933 self.fail("Error during select call to non-blocking socket.")
934
935 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000936 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000937 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000938 self.cli.send(MSG)
939
Victor Stinner6a102812010-04-27 23:55:59 +0000940@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000941class FileObjectClassTestCase(SocketConnectedTest):
942
Guido van Rossume9f66142002-08-07 15:46:19 +0000943 bufsize = -1 # Use default buffer size
944
Guido van Rossum24e4af82002-06-12 19:18:08 +0000945 def __init__(self, methodName='runTest'):
946 SocketConnectedTest.__init__(self, methodName=methodName)
947
948 def setUp(self):
949 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000950 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000951
952 def tearDown(self):
953 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000954 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000955 self.serv_file = None
956 SocketConnectedTest.tearDown(self)
957
958 def clientSetUp(self):
959 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000960 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961
962 def clientTearDown(self):
963 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000964 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965 self.cli_file = None
966 SocketConnectedTest.clientTearDown(self)
967
968 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000969 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000970 first_seg = self.serv_file.read(len(MSG)-3)
971 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000972 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000973 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000974
975 def _testSmallRead(self):
976 self.cli_file.write(MSG)
977 self.cli_file.flush()
978
Guido van Rossum8c943832002-08-08 01:00:28 +0000979 def testFullRead(self):
980 # read until EOF
981 msg = self.serv_file.read()
982 self.assertEqual(msg, MSG)
983
984 def _testFullRead(self):
985 self.cli_file.write(MSG)
986 self.cli_file.close()
987
Guido van Rossum24e4af82002-06-12 19:18:08 +0000988 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000989 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000990 buf = ''
991 while 1:
992 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000993 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000994 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000995 buf += char
996 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000997
998 def _testUnbufferedRead(self):
999 self.cli_file.write(MSG)
1000 self.cli_file.flush()
1001
1002 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001003 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001005 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001006
1007 def _testReadline(self):
1008 self.cli_file.write(MSG)
1009 self.cli_file.flush()
1010
Gregory P. Smith24237ea2008-05-05 21:53:45 +00001011 def testReadlineAfterRead(self):
1012 a_baloo_is = self.serv_file.read(len("A baloo is"))
1013 self.assertEqual("A baloo is", a_baloo_is)
1014 _a_bear = self.serv_file.read(len(" a bear"))
1015 self.assertEqual(" a bear", _a_bear)
1016 line = self.serv_file.readline()
1017 self.assertEqual("\n", line)
1018 line = self.serv_file.readline()
1019 self.assertEqual("A BALOO IS A BEAR.\n", line)
1020 line = self.serv_file.readline()
1021 self.assertEqual(MSG, line)
1022
1023 def _testReadlineAfterRead(self):
1024 self.cli_file.write("A baloo is a bear\n")
1025 self.cli_file.write("A BALOO IS A BEAR.\n")
1026 self.cli_file.write(MSG)
1027 self.cli_file.flush()
1028
1029 def testReadlineAfterReadNoNewline(self):
1030 end_of_ = self.serv_file.read(len("End Of "))
1031 self.assertEqual("End Of ", end_of_)
1032 line = self.serv_file.readline()
1033 self.assertEqual("Line", line)
1034
1035 def _testReadlineAfterReadNoNewline(self):
1036 self.cli_file.write("End Of Line")
1037
Tim Peters116d83c2004-03-28 02:20:45 +00001038 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001039 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001040
1041 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001042 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001043
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001044
1045class FileObjectInterruptedTestCase(unittest.TestCase):
1046 """Test that the file object correctly handles EINTR internally."""
1047
1048 class MockSocket(object):
1049 def __init__(self, recv_funcs=()):
1050 # A generator that returns callables that we'll call for each
1051 # call to recv().
1052 self._recv_step = iter(recv_funcs)
1053
1054 def recv(self, size):
1055 return self._recv_step.next()()
1056
1057 @staticmethod
1058 def _raise_eintr():
1059 raise socket.error(errno.EINTR)
1060
1061 def _test_readline(self, size=-1, **kwargs):
1062 mock_sock = self.MockSocket(recv_funcs=[
1063 lambda : "This is the first line\nAnd the sec",
1064 self._raise_eintr,
1065 lambda : "ond line is here\n",
1066 lambda : "",
1067 ])
1068 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001069 self.assertEqual(fo.readline(size), "This is the first line\n")
1070 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001071
1072 def _test_read(self, size=-1, **kwargs):
1073 mock_sock = self.MockSocket(recv_funcs=[
1074 lambda : "This is the first line\nAnd the sec",
1075 self._raise_eintr,
1076 lambda : "ond line is here\n",
1077 lambda : "",
1078 ])
1079 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001080 self.assertEqual(fo.read(size), "This is the first line\n"
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001081 "And the second line is here\n")
1082
1083 def test_default(self):
1084 self._test_readline()
1085 self._test_readline(size=100)
1086 self._test_read()
1087 self._test_read(size=100)
1088
1089 def test_with_1k_buffer(self):
1090 self._test_readline(bufsize=1024)
1091 self._test_readline(size=100, bufsize=1024)
1092 self._test_read(bufsize=1024)
1093 self._test_read(size=100, bufsize=1024)
1094
1095 def _test_readline_no_buffer(self, size=-1):
1096 mock_sock = self.MockSocket(recv_funcs=[
1097 lambda : "aa",
1098 lambda : "\n",
1099 lambda : "BB",
1100 self._raise_eintr,
1101 lambda : "bb",
1102 lambda : "",
1103 ])
1104 fo = socket._fileobject(mock_sock, bufsize=0)
Ezio Melotti2623a372010-11-21 13:34:58 +00001105 self.assertEqual(fo.readline(size), "aa\n")
1106 self.assertEqual(fo.readline(size), "BBbb")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001107
1108 def test_no_buffer(self):
1109 self._test_readline_no_buffer()
1110 self._test_readline_no_buffer(size=4)
1111 self._test_read(bufsize=0)
1112 self._test_read(size=100, bufsize=0)
1113
1114
Guido van Rossume9f66142002-08-07 15:46:19 +00001115class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1116
1117 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001118
Guido van Rossume9f66142002-08-07 15:46:19 +00001119 In this case (and in this case only), it should be possible to
1120 create a file object, read a line from it, create another file
1121 object, read another line from it, without loss of data in the
1122 first file object's buffer. Note that httplib relies on this
1123 when reading multiple requests from the same socket."""
1124
1125 bufsize = 0 # Use unbuffered mode
1126
1127 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001128 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001129 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001130 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001131 self.serv_file = self.cli_conn.makefile('rb', 0)
1132 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001133 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001134
1135 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001136 self.cli_file.write("A. " + MSG)
1137 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001138 self.cli_file.flush()
1139
Guido van Rossum8c943832002-08-08 01:00:28 +00001140class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1141
1142 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1143
1144
1145class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1146
1147 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001148
Georg Brandldd7b0522007-01-21 10:35:10 +00001149
Facundo Batista07c78be2007-03-23 18:54:07 +00001150class NetworkConnectionTest(object):
1151 """Prove network connection."""
1152 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001153 # We're inherited below by BasicTCPTest2, which also inherits
1154 # BasicTCPTest, which defines self.port referenced below.
1155 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001156 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001157
Facundo Batista07c78be2007-03-23 18:54:07 +00001158class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1159 """Tests that NetworkConnection does not break existing TCP functionality.
1160 """
1161
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001162class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001163 class MockSocket(socket.socket):
1164 def connect(self, *args):
1165 raise socket.timeout('timed out')
1166
1167 @contextlib.contextmanager
1168 def mocked_socket_module(self):
1169 """Return a socket which times out on connect"""
1170 old_socket = socket.socket
1171 socket.socket = self.MockSocket
1172 try:
1173 yield
1174 finally:
1175 socket.socket = old_socket
1176
1177 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001178 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001179 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001180 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001181 with self.assertRaises(socket.error) as cm:
1182 cli.connect((HOST, port))
1183 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1184
1185 def test_create_connection(self):
1186 # Issue #9792: errors raised by create_connection() should have
1187 # a proper errno attribute.
1188 port = test_support.find_unused_port()
1189 with self.assertRaises(socket.error) as cm:
1190 socket.create_connection((HOST, port))
1191 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1192
1193 def test_create_connection_timeout(self):
1194 # Issue #9792: create_connection() should not recast timeout errors
1195 # as generic socket errors.
1196 with self.mocked_socket_module():
1197 with self.assertRaises(socket.timeout):
1198 socket.create_connection((HOST, 1234))
1199
Facundo Batista07c78be2007-03-23 18:54:07 +00001200
Victor Stinner6a102812010-04-27 23:55:59 +00001201@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001202class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1203
1204 def __init__(self, methodName='runTest'):
1205 SocketTCPTest.__init__(self, methodName=methodName)
1206 ThreadableTest.__init__(self)
1207
1208 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001209 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001210
1211 def clientTearDown(self):
1212 self.cli.close()
1213 self.cli = None
1214 ThreadableTest.clientTearDown(self)
1215
1216 def _justAccept(self):
1217 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001218 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001219
1220 testFamily = _justAccept
1221 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001222 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001223 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001224 self.assertEqual(self.cli.family, 2)
1225
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001226 testSourceAddress = _justAccept
1227 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001228 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1229 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001230 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001231 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001232 # The port number being used is sufficient to show that the bind()
1233 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001234
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001235 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001236 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001237 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001238 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001239 socket.setdefaulttimeout(42)
1240 try:
1241 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001242 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001243 finally:
1244 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001245 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001246
1247 testTimeoutNone = _justAccept
1248 def _testTimeoutNone(self):
1249 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001250 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001251 socket.setdefaulttimeout(30)
1252 try:
1253 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001254 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001255 finally:
1256 socket.setdefaulttimeout(None)
1257 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001258
1259 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001260 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001261 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001262 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001263
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001264 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001265 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001266 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001267 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001268 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001269
Victor Stinner6a102812010-04-27 23:55:59 +00001270@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001271class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1272
1273 def __init__(self, methodName='runTest'):
1274 SocketTCPTest.__init__(self, methodName=methodName)
1275 ThreadableTest.__init__(self)
1276
1277 def clientSetUp(self):
1278 pass
1279
1280 def clientTearDown(self):
1281 self.cli.close()
1282 self.cli = None
1283 ThreadableTest.clientTearDown(self)
1284
Facundo Batista07c78be2007-03-23 18:54:07 +00001285 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001286 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001287 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001288 time.sleep(3)
1289 conn.send("done!")
1290 testOutsideTimeout = testInsideTimeout
1291
1292 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001293 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001294 data = sock.recv(5)
1295 self.assertEqual(data, "done!")
1296
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001297 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001298 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001299 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001300
1301
Georg Brandldd7b0522007-01-21 10:35:10 +00001302class Urllib2FileobjectTest(unittest.TestCase):
1303
1304 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1305 # it close the socket if the close c'tor argument is true
1306
1307 def testClose(self):
1308 class MockSocket:
1309 closed = False
1310 def flush(self): pass
1311 def close(self): self.closed = True
1312
1313 # must not close unless we request it: the original use of _fileobject
1314 # by module socket requires that the underlying socket not be closed until
1315 # the _socketobject that created the _fileobject is closed
1316 s = MockSocket()
1317 f = socket._fileobject(s)
1318 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001319 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001320
1321 s = MockSocket()
1322 f = socket._fileobject(s, close=True)
1323 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001324 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001325
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001326class TCPTimeoutTest(SocketTCPTest):
1327
1328 def testTCPTimeout(self):
1329 def raise_timeout(*args, **kwargs):
1330 self.serv.settimeout(1.0)
1331 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001332 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001333 "Error generating a timeout exception (TCP)")
1334
1335 def testTimeoutZero(self):
1336 ok = False
1337 try:
1338 self.serv.settimeout(0.0)
1339 foo = self.serv.accept()
1340 except socket.timeout:
1341 self.fail("caught timeout instead of error (TCP)")
1342 except socket.error:
1343 ok = True
1344 except:
1345 self.fail("caught unexpected exception (TCP)")
1346 if not ok:
1347 self.fail("accept() returned success when we did not expect it")
1348
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001349 def testInterruptedTimeout(self):
1350 # XXX I don't know how to do this test on MSWindows or any other
1351 # plaform that doesn't support signal.alarm() or os.kill(), though
1352 # the bug should have existed on all platforms.
1353 if not hasattr(signal, "alarm"):
1354 return # can only test on *nix
1355 self.serv.settimeout(5.0) # must be longer than alarm
1356 class Alarm(Exception):
1357 pass
1358 def alarm_handler(signal, frame):
1359 raise Alarm
1360 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1361 try:
1362 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1363 try:
1364 foo = self.serv.accept()
1365 except socket.timeout:
1366 self.fail("caught timeout instead of Alarm")
1367 except Alarm:
1368 pass
1369 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001370 self.fail("caught other exception instead of Alarm:"
1371 " %s(%s):\n%s" %
1372 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001373 else:
1374 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001375 finally:
1376 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001377 except Alarm:
1378 self.fail("got Alarm in wrong place")
1379 finally:
1380 # no alarm can be pending. Safe to restore old handler.
1381 signal.signal(signal.SIGALRM, old_alarm)
1382
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001383class UDPTimeoutTest(SocketTCPTest):
1384
1385 def testUDPTimeout(self):
1386 def raise_timeout(*args, **kwargs):
1387 self.serv.settimeout(1.0)
1388 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001389 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001390 "Error generating a timeout exception (UDP)")
1391
1392 def testTimeoutZero(self):
1393 ok = False
1394 try:
1395 self.serv.settimeout(0.0)
1396 foo = self.serv.recv(1024)
1397 except socket.timeout:
1398 self.fail("caught timeout instead of error (UDP)")
1399 except socket.error:
1400 ok = True
1401 except:
1402 self.fail("caught unexpected exception (UDP)")
1403 if not ok:
1404 self.fail("recv() returned success when we did not expect it")
1405
1406class TestExceptions(unittest.TestCase):
1407
1408 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001409 self.assertTrue(issubclass(socket.error, Exception))
1410 self.assertTrue(issubclass(socket.herror, socket.error))
1411 self.assertTrue(issubclass(socket.gaierror, socket.error))
1412 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001413
Armin Rigoa9017c32006-04-19 11:50:27 +00001414class TestLinuxAbstractNamespace(unittest.TestCase):
1415
1416 UNIX_PATH_MAX = 108
1417
1418 def testLinuxAbstractNamespace(self):
1419 address = "\x00python-test-hello\x00\xff"
1420 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1421 s1.bind(address)
1422 s1.listen(1)
1423 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1424 s2.connect(s1.getsockname())
1425 s1.accept()
1426 self.assertEqual(s1.getsockname(), address)
1427 self.assertEqual(s2.getpeername(), address)
1428
1429 def testMaxName(self):
1430 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1431 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1432 s.bind(address)
1433 self.assertEqual(s.getsockname(), address)
1434
1435 def testNameOverflow(self):
1436 address = "\x00" + "h" * self.UNIX_PATH_MAX
1437 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1438 self.assertRaises(socket.error, s.bind, address)
1439
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001440
Victor Stinner6a102812010-04-27 23:55:59 +00001441@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001442class BufferIOTest(SocketConnectedTest):
1443 """
1444 Test the buffer versions of socket.recv() and socket.send().
1445 """
1446 def __init__(self, methodName='runTest'):
1447 SocketConnectedTest.__init__(self, methodName=methodName)
1448
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001449 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001450 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001451 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001452 self.assertEqual(nbytes, len(MSG))
1453 msg = buf.tostring()[:len(MSG)]
1454 self.assertEqual(msg, MSG)
1455
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001456 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001457 with test_support.check_py3k_warnings():
1458 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001459 self.serv_conn.send(buf)
1460
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001461 def testRecvIntoBytearray(self):
1462 buf = bytearray(1024)
1463 nbytes = self.cli_conn.recv_into(buf)
1464 self.assertEqual(nbytes, len(MSG))
1465 msg = buf[:len(MSG)]
1466 self.assertEqual(msg, MSG)
1467
1468 _testRecvIntoBytearray = _testRecvIntoArray
1469
1470 def testRecvIntoMemoryview(self):
1471 buf = bytearray(1024)
1472 nbytes = self.cli_conn.recv_into(memoryview(buf))
1473 self.assertEqual(nbytes, len(MSG))
1474 msg = buf[:len(MSG)]
1475 self.assertEqual(msg, MSG)
1476
1477 _testRecvIntoMemoryview = _testRecvIntoArray
1478
1479 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001480 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001481 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001482 self.assertEqual(nbytes, len(MSG))
1483 msg = buf.tostring()[:len(MSG)]
1484 self.assertEqual(msg, MSG)
1485
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001486 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001487 with test_support.check_py3k_warnings():
1488 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001489 self.serv_conn.send(buf)
1490
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001491 def testRecvFromIntoBytearray(self):
1492 buf = bytearray(1024)
1493 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1494 self.assertEqual(nbytes, len(MSG))
1495 msg = buf[:len(MSG)]
1496 self.assertEqual(msg, MSG)
1497
1498 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1499
1500 def testRecvFromIntoMemoryview(self):
1501 buf = bytearray(1024)
1502 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1503 self.assertEqual(nbytes, len(MSG))
1504 msg = buf[:len(MSG)]
1505 self.assertEqual(msg, MSG)
1506
1507 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1508
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001509
1510TIPC_STYPE = 2000
1511TIPC_LOWER = 200
1512TIPC_UPPER = 210
1513
1514def isTipcAvailable():
1515 """Check if the TIPC module is loaded
1516
1517 The TIPC module is not loaded automatically on Ubuntu and probably
1518 other Linux distros.
1519 """
1520 if not hasattr(socket, "AF_TIPC"):
1521 return False
1522 if not os.path.isfile("/proc/modules"):
1523 return False
1524 with open("/proc/modules") as f:
1525 for line in f:
1526 if line.startswith("tipc "):
1527 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001528 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001529 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1530 return False
1531
1532class TIPCTest (unittest.TestCase):
1533 def testRDM(self):
1534 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1535 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1536
1537 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1538 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1539 TIPC_LOWER, TIPC_UPPER)
1540 srv.bind(srvaddr)
1541
1542 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1543 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1544 cli.sendto(MSG, sendaddr)
1545
1546 msg, recvaddr = srv.recvfrom(1024)
1547
1548 self.assertEqual(cli.getsockname(), recvaddr)
1549 self.assertEqual(msg, MSG)
1550
1551
1552class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1553 def __init__(self, methodName = 'runTest'):
1554 unittest.TestCase.__init__(self, methodName = methodName)
1555 ThreadableTest.__init__(self)
1556
1557 def setUp(self):
1558 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1559 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1560 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1561 TIPC_LOWER, TIPC_UPPER)
1562 self.srv.bind(srvaddr)
1563 self.srv.listen(5)
1564 self.serverExplicitReady()
1565 self.conn, self.connaddr = self.srv.accept()
1566
1567 def clientSetUp(self):
1568 # The is a hittable race between serverExplicitReady() and the
1569 # accept() call; sleep a little while to avoid it, otherwise
1570 # we could get an exception
1571 time.sleep(0.1)
1572 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1573 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1574 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1575 self.cli.connect(addr)
1576 self.cliaddr = self.cli.getsockname()
1577
1578 def testStream(self):
1579 msg = self.conn.recv(1024)
1580 self.assertEqual(msg, MSG)
1581 self.assertEqual(self.cliaddr, self.connaddr)
1582
1583 def _testStream(self):
1584 self.cli.send(MSG)
1585 self.cli.close()
1586
1587
Guido van Rossumb995eb72002-07-31 16:08:40 +00001588def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001589 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001590 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1591 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001592
1593 tests.extend([
1594 NonBlockingTCPTests,
1595 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001596 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001597 UnbufferedFileObjectClassTestCase,
1598 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001599 SmallBufferedFileObjectClassTestCase,
1600 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001601 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001602 NetworkConnectionAttributesTest,
1603 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001604 ])
Dave Cole331708b2004-08-09 04:51:41 +00001605 if hasattr(socket, "socketpair"):
1606 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001607 if sys.platform == 'linux2':
1608 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001609 if isTipcAvailable():
1610 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001611 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001612
1613 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001614 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001615 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001616
1617if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001618 test_main()