blob: 1466af5d77fad0e337c12be5413ff67676b04303 [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()
148 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149 self.clientSetUp()
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
189class SocketConnectedTest(ThreadedTCPSocketTest):
190
191 def __init__(self, methodName='runTest'):
192 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
193
194 def setUp(self):
195 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000196 # Indicate explicitly we're ready for the client thread to
197 # proceed and then perform the blocking call to accept
198 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000199 conn, addr = self.serv.accept()
200 self.cli_conn = conn
201
202 def tearDown(self):
203 self.cli_conn.close()
204 self.cli_conn = None
205 ThreadedTCPSocketTest.tearDown(self)
206
207 def clientSetUp(self):
208 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000209 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000210 self.serv_conn = self.cli
211
212 def clientTearDown(self):
213 self.serv_conn.close()
214 self.serv_conn = None
215 ThreadedTCPSocketTest.clientTearDown(self)
216
Dave Cole331708b2004-08-09 04:51:41 +0000217class SocketPairTest(unittest.TestCase, ThreadableTest):
218
219 def __init__(self, methodName='runTest'):
220 unittest.TestCase.__init__(self, methodName=methodName)
221 ThreadableTest.__init__(self)
222
223 def setUp(self):
224 self.serv, self.cli = socket.socketpair()
225
226 def tearDown(self):
227 self.serv.close()
228 self.serv = None
229
230 def clientSetUp(self):
231 pass
232
233 def clientTearDown(self):
234 self.cli.close()
235 self.cli = None
236 ThreadableTest.clientTearDown(self)
237
Tim Peters494aaee2004-08-09 18:54:11 +0000238
Guido van Rossum24e4af82002-06-12 19:18:08 +0000239#######################################################################
240## Begin Tests
241
242class GeneralModuleTests(unittest.TestCase):
243
Raymond Hettinger027bb632004-05-31 03:09:25 +0000244 def test_weakref(self):
245 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
246 p = proxy(s)
247 self.assertEqual(p.fileno(), s.fileno())
248 s.close()
249 s = None
250 try:
251 p.fileno()
252 except ReferenceError:
253 pass
254 else:
255 self.fail('Socket proxy still exists')
256
Guido van Rossum24e4af82002-06-12 19:18:08 +0000257 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000258 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000259 def raise_error(*args, **kwargs):
260 raise socket.error
261 def raise_herror(*args, **kwargs):
262 raise socket.herror
263 def raise_gaierror(*args, **kwargs):
264 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000265 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000266 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000267 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000268 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000269 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270 "Error raising socket exception.")
271
272 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000273 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000274 socket.AF_INET
275 socket.SOCK_STREAM
276 socket.SOCK_DGRAM
277 socket.SOCK_RAW
278 socket.SOCK_RDM
279 socket.SOCK_SEQPACKET
280 socket.SOL_SOCKET
281 socket.SO_REUSEADDR
282
Guido van Rossum654c11e2002-06-13 20:24:17 +0000283 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000284 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000285 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000286 try:
287 ip = socket.gethostbyname(hostname)
288 except socket.error:
289 # Probably name lookup wasn't set up right; skip this test
290 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000291 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000292 try:
293 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
294 except socket.error:
295 # Probably a similar problem as above; skip this test
296 return
Brett Cannon01668a12005-03-11 00:04:17 +0000297 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000298 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000299 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000300 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000301
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000302 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000303 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000304 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000305 try:
306 # On some versions, this loses a reference
307 orig = sys.getrefcount(__name__)
308 socket.getnameinfo(__name__,0)
Georg Brandlab849892009-09-19 07:35:07 +0000309 except TypeError:
Florent Xicluna07627882010-03-21 01:14:24 +0000310 self.assertEqual(sys.getrefcount(__name__), orig,
311 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000312
Guido van Rossum24e4af82002-06-12 19:18:08 +0000313 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000314 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315 try:
316 # On some versions, this crashes the interpreter.
317 socket.getnameinfo(('x', 0, 0, 0), 0)
318 except socket.error:
319 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000320
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000321 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000322 # This just checks that htons etc. are their own inverse,
323 # when looking at the lower 16 or 32 bits.
324 sizes = {socket.htonl: 32, socket.ntohl: 32,
325 socket.htons: 16, socket.ntohs: 16}
326 for func, size in sizes.items():
327 mask = (1L<<size) - 1
328 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
329 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000330
Guido van Rossuma2627af2002-09-14 00:58:46 +0000331 swapped = func(mask)
332 self.assertEqual(swapped & mask, mask)
333 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000334
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000335 def testNtoHErrors(self):
336 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
337 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
338 for k in good_values:
339 socket.ntohl(k)
340 socket.ntohs(k)
341 socket.htonl(k)
342 socket.htons(k)
343 for k in bad_values:
344 self.assertRaises(OverflowError, socket.ntohl, k)
345 self.assertRaises(OverflowError, socket.ntohs, k)
346 self.assertRaises(OverflowError, socket.htonl, k)
347 self.assertRaises(OverflowError, socket.htons, k)
348
Barry Warsaw11b91a02004-06-28 00:50:43 +0000349 def testGetServBy(self):
350 eq = self.assertEqual
351 # Find one service that exists, then check all the related interfaces.
352 # I've ordered this by protocols that have both a tcp and udp
353 # protocol, at least for modern Linuxes.
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000354 if (sys.platform.startswith('linux') or
355 sys.platform.startswith('freebsd') or
356 sys.platform.startswith('netbsd') or
357 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000358 # avoid the 'echo' service on this platform, as there is an
359 # assumption breaking non-standard port/protocol entry
360 services = ('daytime', 'qotd', 'domain')
361 else:
362 services = ('echo', 'daytime', 'domain')
363 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000364 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000365 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000366 break
367 except socket.error:
368 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000369 else:
370 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000371 # Try same call with optional protocol omitted
372 port2 = socket.getservbyname(service)
373 eq(port, port2)
374 # Try udp, but don't barf it it doesn't exist
375 try:
376 udpport = socket.getservbyname(service, 'udp')
377 except socket.error:
378 udpport = None
379 else:
380 eq(udpport, port)
381 # Now make sure the lookup by port returns the same service name
382 eq(socket.getservbyport(port2), service)
383 eq(socket.getservbyport(port, 'tcp'), service)
384 if udpport is not None:
385 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000386 # Make sure getservbyport does not accept out of range ports.
387 self.assertRaises(OverflowError, socket.getservbyport, -1)
388 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000389
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000390 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000391 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000392 # The default timeout should initially be None
393 self.assertEqual(socket.getdefaulttimeout(), None)
394 s = socket.socket()
395 self.assertEqual(s.gettimeout(), None)
396 s.close()
397
398 # Set the default timeout to 10, and see if it propagates
399 socket.setdefaulttimeout(10)
400 self.assertEqual(socket.getdefaulttimeout(), 10)
401 s = socket.socket()
402 self.assertEqual(s.gettimeout(), 10)
403 s.close()
404
405 # Reset the default timeout to None, and see if it propagates
406 socket.setdefaulttimeout(None)
407 self.assertEqual(socket.getdefaulttimeout(), None)
408 s = socket.socket()
409 self.assertEqual(s.gettimeout(), None)
410 s.close()
411
412 # Check that setting it to an invalid value raises ValueError
413 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
414
415 # Check that setting it to an invalid type raises TypeError
416 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
417
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000418 def testIPv4_inet_aton_fourbytes(self):
419 if not hasattr(socket, 'inet_aton'):
420 return # No inet_aton, nothing to check
421 # Test that issue1008086 and issue767150 are fixed.
422 # It must return 4 bytes.
423 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
424 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
425
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000426 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000427 if not hasattr(socket, 'inet_pton'):
428 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000429 from socket import inet_aton as f, inet_pton, AF_INET
430 g = lambda a: inet_pton(AF_INET, a)
431
432 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
433 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
434 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
435 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000436 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000437
438 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
439 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
440 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000441 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000442
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000443 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000444 if not hasattr(socket, 'inet_pton'):
445 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000446 try:
447 from socket import inet_pton, AF_INET6, has_ipv6
448 if not has_ipv6:
449 return
450 except ImportError:
451 return
452 f = lambda a: inet_pton(AF_INET6, a)
453
454 self.assertEquals('\x00' * 16, f('::'))
455 self.assertEquals('\x00' * 16, f('0::0'))
456 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
457 self.assertEquals(
458 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
459 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
460 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000461
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000462 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000463 if not hasattr(socket, 'inet_ntop'):
464 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000465 from socket import inet_ntoa as f, inet_ntop, AF_INET
466 g = lambda a: inet_ntop(AF_INET, a)
467
468 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
469 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
470 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
471 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000472
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000473 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
474 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
475 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
476
477 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000478 if not hasattr(socket, 'inet_ntop'):
479 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000480 try:
481 from socket import inet_ntop, AF_INET6, has_ipv6
482 if not has_ipv6:
483 return
484 except ImportError:
485 return
486 f = lambda a: inet_ntop(AF_INET6, a)
487
488 self.assertEquals('::', f('\x00' * 16))
489 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
490 self.assertEquals(
491 'aef:b01:506:1001:ffff:9997:55:170',
492 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
493 )
494
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000495 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000496
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000497 def _get_unused_port(self, bind_address='0.0.0.0'):
498 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000499
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000500 Args:
501 bind_address: Hostname or IP address to search for a port on.
502
503 Returns: A most likely to be unused port.
504 """
505 tempsock = socket.socket()
506 tempsock.bind((bind_address, 0))
507 host, port = tempsock.getsockname()
508 tempsock.close()
509 return port
510
511 def testSockName(self):
512 # Testing getsockname()
513 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000514 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000515 self.addCleanup(sock.close)
Trent Nelsone41b0062008-04-08 23:47:30 +0000516 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000517 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000518 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
519 # it reasonable to get the host's addr in addition to 0.0.0.0.
520 # At least for eCos. This is required for the S/390 to pass.
521 my_ip_addr = socket.gethostbyname(socket.gethostname())
Ezio Melottiaa980582010-01-23 23:04:36 +0000522 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000523 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000524
525 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000526 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000527 # We know a socket should start without reuse==0
528 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000529 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000531 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532
533 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000534 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000536 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000537 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
538 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000539 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000541 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000542 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000543 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
544 sock.settimeout(1)
545 sock.close()
546 self.assertRaises(socket.error, sock.send, "spam")
547
Georg Brandlbb03ac02006-03-21 18:17:25 +0000548 def testNewAttributes(self):
549 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000550 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000551 self.assertEqual(sock.family, socket.AF_INET)
552 self.assertEqual(sock.type, socket.SOCK_STREAM)
553 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000554 sock.close()
555
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000556 def test_getsockaddrarg(self):
557 host = '0.0.0.0'
558 port = self._get_unused_port(bind_address=host)
559 big_port = port + 65536
560 neg_port = port - 65536
561 sock = socket.socket()
562 try:
563 self.assertRaises(OverflowError, sock.bind, (host, big_port))
564 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
565 sock.bind((host, port))
566 finally:
567 sock.close()
568
Christian Heimesa47b75b2008-01-04 15:48:06 +0000569 def test_sock_ioctl(self):
570 if os.name != "nt":
571 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000572 self.assertTrue(hasattr(socket.socket, 'ioctl'))
573 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
574 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
575 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000576 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
577 s = socket.socket()
578 self.assertRaises(ValueError, s.ioctl, -1, None)
579 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000580
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000581 def testGetaddrinfo(self):
582 try:
583 socket.getaddrinfo('localhost', 80)
584 except socket.gaierror as err:
585 if err.errno == socket.EAI_SERVICE:
586 # see http://bugs.python.org/issue1282647
587 self.skipTest("buggy libc version")
588 raise
589 # len of every sequence is supposed to be == 5
590 for info in socket.getaddrinfo(HOST, None):
591 self.assertEqual(len(info), 5)
592 # host can be a domain name, a string representation of an
593 # IPv4/v6 address or None
594 socket.getaddrinfo('localhost', 80)
595 socket.getaddrinfo('127.0.0.1', 80)
596 socket.getaddrinfo(None, 80)
597 if SUPPORTS_IPV6:
598 socket.getaddrinfo('::1', 80)
599 # port can be a string service name such as "http", a numeric
600 # port number or None
601 socket.getaddrinfo(HOST, "http")
602 socket.getaddrinfo(HOST, 80)
603 socket.getaddrinfo(HOST, None)
604 # test family and socktype filters
605 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
606 for family, _, _, _, _ in infos:
607 self.assertEqual(family, socket.AF_INET)
608 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
609 for _, socktype, _, _, _ in infos:
610 self.assertEqual(socktype, socket.SOCK_STREAM)
611 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000612 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000613 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
614 # a server willing to support both IPv4 and IPv6 will
615 # usually do this
616 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
617 socket.AI_PASSIVE)
618
Christian Heimesa47b75b2008-01-04 15:48:06 +0000619
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000620 def check_sendall_interrupted(self, with_timeout):
621 # socketpair() is not stricly required, but it makes things easier.
622 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
623 self.skipTest("signal.alarm and socket.socketpair required for this test")
624 # Our signal handlers clobber the C errno by calling a math function
625 # with an invalid domain value.
626 def ok_handler(*args):
627 self.assertRaises(ValueError, math.acosh, 0)
628 def raising_handler(*args):
629 self.assertRaises(ValueError, math.acosh, 0)
630 1 // 0
631 c, s = socket.socketpair()
632 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
633 try:
634 if with_timeout:
635 # Just above the one second minimum for signal.alarm
636 c.settimeout(1.5)
637 with self.assertRaises(ZeroDivisionError):
638 signal.alarm(1)
639 c.sendall(b"x" * (1024**2))
640 if with_timeout:
641 signal.signal(signal.SIGALRM, ok_handler)
642 signal.alarm(1)
643 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
644 finally:
645 signal.signal(signal.SIGALRM, old_alarm)
646 c.close()
647 s.close()
648
649 def test_sendall_interrupted(self):
650 self.check_sendall_interrupted(False)
651
652 def test_sendall_interrupted_with_timeout(self):
653 self.check_sendall_interrupted(True)
654
655
Victor Stinner6a102812010-04-27 23:55:59 +0000656@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000657class BasicTCPTest(SocketConnectedTest):
658
659 def __init__(self, methodName='runTest'):
660 SocketConnectedTest.__init__(self, methodName=methodName)
661
662 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000663 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000664 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000665 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000666
667 def _testRecv(self):
668 self.serv_conn.send(MSG)
669
670 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000671 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000672 seg1 = self.cli_conn.recv(len(MSG) - 3)
673 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000674 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000675 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000676
677 def _testOverFlowRecv(self):
678 self.serv_conn.send(MSG)
679
680 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000681 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000682 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000683 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684
685 def _testRecvFrom(self):
686 self.serv_conn.send(MSG)
687
688 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000689 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000690 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
691 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000692 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000693 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000694
695 def _testOverFlowRecvFrom(self):
696 self.serv_conn.send(MSG)
697
698 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000699 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000700 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 while 1:
702 read = self.cli_conn.recv(1024)
703 if not read:
704 break
Guido van Rossume531e292002-08-08 20:28:34 +0000705 msg += read
706 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707
708 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000709 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710 self.serv_conn.sendall(big_chunk)
711
712 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000713 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000714 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000715 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716 fd = self.cli_conn.fileno()
717 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000718 self.addCleanup(sock.close)
719 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000720 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000721 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000722
723 def _testFromFd(self):
724 self.serv_conn.send(MSG)
725
Brian Curtin62c20b62010-11-02 02:59:55 +0000726 def testDup(self):
727 # Testing dup()
728 sock = self.cli_conn.dup()
729 self.addCleanup(sock.close)
730 msg = sock.recv(1024)
731 self.assertEqual(msg, MSG)
732
733 def _testDup(self):
734 self.serv_conn.send(MSG)
735
Guido van Rossum24e4af82002-06-12 19:18:08 +0000736 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000737 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000738 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000739 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000740 # wait for _testShutdown to finish: on OS X, when the server
741 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000742 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000743 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000744
745 def _testShutdown(self):
746 self.serv_conn.send(MSG)
747 self.serv_conn.shutdown(2)
748
Victor Stinner6a102812010-04-27 23:55:59 +0000749@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750class BasicUDPTest(ThreadedUDPSocketTest):
751
752 def __init__(self, methodName='runTest'):
753 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
754
755 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000758 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000759
760 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000761 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762
Guido van Rossum1c938012002-06-12 21:17:20 +0000763 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000764 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000766 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000767
Guido van Rossum1c938012002-06-12 21:17:20 +0000768 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000769 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000770
Facundo Batista1fe9f962007-03-28 03:45:20 +0000771 def testRecvFromNegative(self):
772 # Negative lengths passed to recvfrom should give ValueError.
773 self.assertRaises(ValueError, self.serv.recvfrom, -1)
774
775 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000776 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000777
Victor Stinner6a102812010-04-27 23:55:59 +0000778@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000779class TCPCloserTest(ThreadedTCPSocketTest):
780
781 def testClose(self):
782 conn, addr = self.serv.accept()
783 conn.close()
784
785 sd = self.cli
786 read, write, err = select.select([sd], [], [], 1.0)
787 self.assertEqual(read, [sd])
788 self.assertEqual(sd.recv(1), '')
789
790 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000791 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000792 time.sleep(1.0)
793
Victor Stinner6a102812010-04-27 23:55:59 +0000794@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000795class BasicSocketPairTest(SocketPairTest):
796
797 def __init__(self, methodName='runTest'):
798 SocketPairTest.__init__(self, methodName=methodName)
799
800 def testRecv(self):
801 msg = self.serv.recv(1024)
802 self.assertEqual(msg, MSG)
803
804 def _testRecv(self):
805 self.cli.send(MSG)
806
807 def testSend(self):
808 self.serv.send(MSG)
809
810 def _testSend(self):
811 msg = self.cli.recv(1024)
812 self.assertEqual(msg, MSG)
813
Victor Stinner6a102812010-04-27 23:55:59 +0000814@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000815class NonBlockingTCPTests(ThreadedTCPSocketTest):
816
817 def __init__(self, methodName='runTest'):
818 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
819
820 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000821 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822 self.serv.setblocking(0)
823 start = time.time()
824 try:
825 self.serv.accept()
826 except socket.error:
827 pass
828 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000829 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830
831 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000832 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000833
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000835 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000837 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 conn, addr = self.serv.accept()
839 except socket.error:
840 pass
841 else:
842 self.fail("Error trying to do non-blocking accept.")
843 read, write, err = select.select([self.serv], [], [])
844 if self.serv in read:
845 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000846 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000847 else:
848 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000849
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000851 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000852 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853
854 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000855 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000857 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858
859 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000860 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000861 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862
863 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000864 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865 conn, addr = self.serv.accept()
866 conn.setblocking(0)
867 try:
868 msg = conn.recv(len(MSG))
869 except socket.error:
870 pass
871 else:
872 self.fail("Error trying to do non-blocking recv.")
873 read, write, err = select.select([conn], [], [])
874 if conn in read:
875 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +0000876 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +0000877 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878 else:
879 self.fail("Error during select call to non-blocking socket.")
880
881 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000882 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000883 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884 self.cli.send(MSG)
885
Victor Stinner6a102812010-04-27 23:55:59 +0000886@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887class FileObjectClassTestCase(SocketConnectedTest):
888
Guido van Rossume9f66142002-08-07 15:46:19 +0000889 bufsize = -1 # Use default buffer size
890
Guido van Rossum24e4af82002-06-12 19:18:08 +0000891 def __init__(self, methodName='runTest'):
892 SocketConnectedTest.__init__(self, methodName=methodName)
893
894 def setUp(self):
895 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000896 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000897
898 def tearDown(self):
899 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000900 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901 self.serv_file = None
902 SocketConnectedTest.tearDown(self)
903
904 def clientSetUp(self):
905 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000906 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000907
908 def clientTearDown(self):
909 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000910 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000911 self.cli_file = None
912 SocketConnectedTest.clientTearDown(self)
913
914 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000915 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916 first_seg = self.serv_file.read(len(MSG)-3)
917 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000918 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000919 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920
921 def _testSmallRead(self):
922 self.cli_file.write(MSG)
923 self.cli_file.flush()
924
Guido van Rossum8c943832002-08-08 01:00:28 +0000925 def testFullRead(self):
926 # read until EOF
927 msg = self.serv_file.read()
928 self.assertEqual(msg, MSG)
929
930 def _testFullRead(self):
931 self.cli_file.write(MSG)
932 self.cli_file.close()
933
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000935 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000936 buf = ''
937 while 1:
938 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000939 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000940 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000941 buf += char
942 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000943
944 def _testUnbufferedRead(self):
945 self.cli_file.write(MSG)
946 self.cli_file.flush()
947
948 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000949 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000950 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000951 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000952
953 def _testReadline(self):
954 self.cli_file.write(MSG)
955 self.cli_file.flush()
956
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000957 def testReadlineAfterRead(self):
958 a_baloo_is = self.serv_file.read(len("A baloo is"))
959 self.assertEqual("A baloo is", a_baloo_is)
960 _a_bear = self.serv_file.read(len(" a bear"))
961 self.assertEqual(" a bear", _a_bear)
962 line = self.serv_file.readline()
963 self.assertEqual("\n", line)
964 line = self.serv_file.readline()
965 self.assertEqual("A BALOO IS A BEAR.\n", line)
966 line = self.serv_file.readline()
967 self.assertEqual(MSG, line)
968
969 def _testReadlineAfterRead(self):
970 self.cli_file.write("A baloo is a bear\n")
971 self.cli_file.write("A BALOO IS A BEAR.\n")
972 self.cli_file.write(MSG)
973 self.cli_file.flush()
974
975 def testReadlineAfterReadNoNewline(self):
976 end_of_ = self.serv_file.read(len("End Of "))
977 self.assertEqual("End Of ", end_of_)
978 line = self.serv_file.readline()
979 self.assertEqual("Line", line)
980
981 def _testReadlineAfterReadNoNewline(self):
982 self.cli_file.write("End Of Line")
983
Tim Peters116d83c2004-03-28 02:20:45 +0000984 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000985 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000986
987 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000988 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000989
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000990
991class FileObjectInterruptedTestCase(unittest.TestCase):
992 """Test that the file object correctly handles EINTR internally."""
993
994 class MockSocket(object):
995 def __init__(self, recv_funcs=()):
996 # A generator that returns callables that we'll call for each
997 # call to recv().
998 self._recv_step = iter(recv_funcs)
999
1000 def recv(self, size):
1001 return self._recv_step.next()()
1002
1003 @staticmethod
1004 def _raise_eintr():
1005 raise socket.error(errno.EINTR)
1006
1007 def _test_readline(self, size=-1, **kwargs):
1008 mock_sock = self.MockSocket(recv_funcs=[
1009 lambda : "This is the first line\nAnd the sec",
1010 self._raise_eintr,
1011 lambda : "ond line is here\n",
1012 lambda : "",
1013 ])
1014 fo = socket._fileobject(mock_sock, **kwargs)
1015 self.assertEquals(fo.readline(size), "This is the first line\n")
1016 self.assertEquals(fo.readline(size), "And the second line is here\n")
1017
1018 def _test_read(self, size=-1, **kwargs):
1019 mock_sock = self.MockSocket(recv_funcs=[
1020 lambda : "This is the first line\nAnd the sec",
1021 self._raise_eintr,
1022 lambda : "ond line is here\n",
1023 lambda : "",
1024 ])
1025 fo = socket._fileobject(mock_sock, **kwargs)
1026 self.assertEquals(fo.read(size), "This is the first line\n"
1027 "And the second line is here\n")
1028
1029 def test_default(self):
1030 self._test_readline()
1031 self._test_readline(size=100)
1032 self._test_read()
1033 self._test_read(size=100)
1034
1035 def test_with_1k_buffer(self):
1036 self._test_readline(bufsize=1024)
1037 self._test_readline(size=100, bufsize=1024)
1038 self._test_read(bufsize=1024)
1039 self._test_read(size=100, bufsize=1024)
1040
1041 def _test_readline_no_buffer(self, size=-1):
1042 mock_sock = self.MockSocket(recv_funcs=[
1043 lambda : "aa",
1044 lambda : "\n",
1045 lambda : "BB",
1046 self._raise_eintr,
1047 lambda : "bb",
1048 lambda : "",
1049 ])
1050 fo = socket._fileobject(mock_sock, bufsize=0)
1051 self.assertEquals(fo.readline(size), "aa\n")
1052 self.assertEquals(fo.readline(size), "BBbb")
1053
1054 def test_no_buffer(self):
1055 self._test_readline_no_buffer()
1056 self._test_readline_no_buffer(size=4)
1057 self._test_read(bufsize=0)
1058 self._test_read(size=100, bufsize=0)
1059
1060
Guido van Rossume9f66142002-08-07 15:46:19 +00001061class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1062
1063 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001064
Guido van Rossume9f66142002-08-07 15:46:19 +00001065 In this case (and in this case only), it should be possible to
1066 create a file object, read a line from it, create another file
1067 object, read another line from it, without loss of data in the
1068 first file object's buffer. Note that httplib relies on this
1069 when reading multiple requests from the same socket."""
1070
1071 bufsize = 0 # Use unbuffered mode
1072
1073 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001074 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001075 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001076 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001077 self.serv_file = self.cli_conn.makefile('rb', 0)
1078 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001079 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001080
1081 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001082 self.cli_file.write("A. " + MSG)
1083 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001084 self.cli_file.flush()
1085
Guido van Rossum8c943832002-08-08 01:00:28 +00001086class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1087
1088 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1089
1090
1091class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1092
1093 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001094
Georg Brandldd7b0522007-01-21 10:35:10 +00001095
Facundo Batista07c78be2007-03-23 18:54:07 +00001096class NetworkConnectionTest(object):
1097 """Prove network connection."""
1098 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001099 # We're inherited below by BasicTCPTest2, which also inherits
1100 # BasicTCPTest, which defines self.port referenced below.
1101 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001102 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001103
Facundo Batista07c78be2007-03-23 18:54:07 +00001104class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1105 """Tests that NetworkConnection does not break existing TCP functionality.
1106 """
1107
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001108class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001109 class MockSocket(socket.socket):
1110 def connect(self, *args):
1111 raise socket.timeout('timed out')
1112
1113 @contextlib.contextmanager
1114 def mocked_socket_module(self):
1115 """Return a socket which times out on connect"""
1116 old_socket = socket.socket
1117 socket.socket = self.MockSocket
1118 try:
1119 yield
1120 finally:
1121 socket.socket = old_socket
1122
1123 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001124 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001125 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001126 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001127 with self.assertRaises(socket.error) as cm:
1128 cli.connect((HOST, port))
1129 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1130
1131 def test_create_connection(self):
1132 # Issue #9792: errors raised by create_connection() should have
1133 # a proper errno attribute.
1134 port = test_support.find_unused_port()
1135 with self.assertRaises(socket.error) as cm:
1136 socket.create_connection((HOST, port))
1137 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1138
1139 def test_create_connection_timeout(self):
1140 # Issue #9792: create_connection() should not recast timeout errors
1141 # as generic socket errors.
1142 with self.mocked_socket_module():
1143 with self.assertRaises(socket.timeout):
1144 socket.create_connection((HOST, 1234))
1145
Facundo Batista07c78be2007-03-23 18:54:07 +00001146
Victor Stinner6a102812010-04-27 23:55:59 +00001147@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001148class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1149
1150 def __init__(self, methodName='runTest'):
1151 SocketTCPTest.__init__(self, methodName=methodName)
1152 ThreadableTest.__init__(self)
1153
1154 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001155 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001156
1157 def clientTearDown(self):
1158 self.cli.close()
1159 self.cli = None
1160 ThreadableTest.clientTearDown(self)
1161
1162 def _justAccept(self):
1163 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001164 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001165
1166 testFamily = _justAccept
1167 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001168 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001169 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001170 self.assertEqual(self.cli.family, 2)
1171
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001172 testSourceAddress = _justAccept
1173 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001174 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1175 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001176 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001177 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001178 # The port number being used is sufficient to show that the bind()
1179 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001180
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001181 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001182 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001183 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001184 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001185 socket.setdefaulttimeout(42)
1186 try:
1187 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001188 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001189 finally:
1190 socket.setdefaulttimeout(None)
1191 self.assertEquals(self.cli.gettimeout(), 42)
1192
1193 testTimeoutNone = _justAccept
1194 def _testTimeoutNone(self):
1195 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001196 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001197 socket.setdefaulttimeout(30)
1198 try:
1199 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001200 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001201 finally:
1202 socket.setdefaulttimeout(None)
1203 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001204
1205 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001206 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001207 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001208 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001209
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001210 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001211 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001212 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001213 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001214 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001215
Victor Stinner6a102812010-04-27 23:55:59 +00001216@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001217class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1218
1219 def __init__(self, methodName='runTest'):
1220 SocketTCPTest.__init__(self, methodName=methodName)
1221 ThreadableTest.__init__(self)
1222
1223 def clientSetUp(self):
1224 pass
1225
1226 def clientTearDown(self):
1227 self.cli.close()
1228 self.cli = None
1229 ThreadableTest.clientTearDown(self)
1230
Facundo Batista07c78be2007-03-23 18:54:07 +00001231 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001232 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001233 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001234 time.sleep(3)
1235 conn.send("done!")
1236 testOutsideTimeout = testInsideTimeout
1237
1238 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001239 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001240 data = sock.recv(5)
1241 self.assertEqual(data, "done!")
1242
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001243 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001244 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001245 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001246
1247
Georg Brandldd7b0522007-01-21 10:35:10 +00001248class Urllib2FileobjectTest(unittest.TestCase):
1249
1250 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1251 # it close the socket if the close c'tor argument is true
1252
1253 def testClose(self):
1254 class MockSocket:
1255 closed = False
1256 def flush(self): pass
1257 def close(self): self.closed = True
1258
1259 # must not close unless we request it: the original use of _fileobject
1260 # by module socket requires that the underlying socket not be closed until
1261 # the _socketobject that created the _fileobject is closed
1262 s = MockSocket()
1263 f = socket._fileobject(s)
1264 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001265 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001266
1267 s = MockSocket()
1268 f = socket._fileobject(s, close=True)
1269 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001270 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001271
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001272class TCPTimeoutTest(SocketTCPTest):
1273
1274 def testTCPTimeout(self):
1275 def raise_timeout(*args, **kwargs):
1276 self.serv.settimeout(1.0)
1277 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001278 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001279 "Error generating a timeout exception (TCP)")
1280
1281 def testTimeoutZero(self):
1282 ok = False
1283 try:
1284 self.serv.settimeout(0.0)
1285 foo = self.serv.accept()
1286 except socket.timeout:
1287 self.fail("caught timeout instead of error (TCP)")
1288 except socket.error:
1289 ok = True
1290 except:
1291 self.fail("caught unexpected exception (TCP)")
1292 if not ok:
1293 self.fail("accept() returned success when we did not expect it")
1294
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001295 def testInterruptedTimeout(self):
1296 # XXX I don't know how to do this test on MSWindows or any other
1297 # plaform that doesn't support signal.alarm() or os.kill(), though
1298 # the bug should have existed on all platforms.
1299 if not hasattr(signal, "alarm"):
1300 return # can only test on *nix
1301 self.serv.settimeout(5.0) # must be longer than alarm
1302 class Alarm(Exception):
1303 pass
1304 def alarm_handler(signal, frame):
1305 raise Alarm
1306 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1307 try:
1308 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1309 try:
1310 foo = self.serv.accept()
1311 except socket.timeout:
1312 self.fail("caught timeout instead of Alarm")
1313 except Alarm:
1314 pass
1315 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001316 self.fail("caught other exception instead of Alarm:"
1317 " %s(%s):\n%s" %
1318 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001319 else:
1320 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001321 finally:
1322 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001323 except Alarm:
1324 self.fail("got Alarm in wrong place")
1325 finally:
1326 # no alarm can be pending. Safe to restore old handler.
1327 signal.signal(signal.SIGALRM, old_alarm)
1328
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001329class UDPTimeoutTest(SocketTCPTest):
1330
1331 def testUDPTimeout(self):
1332 def raise_timeout(*args, **kwargs):
1333 self.serv.settimeout(1.0)
1334 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001335 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001336 "Error generating a timeout exception (UDP)")
1337
1338 def testTimeoutZero(self):
1339 ok = False
1340 try:
1341 self.serv.settimeout(0.0)
1342 foo = self.serv.recv(1024)
1343 except socket.timeout:
1344 self.fail("caught timeout instead of error (UDP)")
1345 except socket.error:
1346 ok = True
1347 except:
1348 self.fail("caught unexpected exception (UDP)")
1349 if not ok:
1350 self.fail("recv() returned success when we did not expect it")
1351
1352class TestExceptions(unittest.TestCase):
1353
1354 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001355 self.assertTrue(issubclass(socket.error, Exception))
1356 self.assertTrue(issubclass(socket.herror, socket.error))
1357 self.assertTrue(issubclass(socket.gaierror, socket.error))
1358 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001359
Armin Rigoa9017c32006-04-19 11:50:27 +00001360class TestLinuxAbstractNamespace(unittest.TestCase):
1361
1362 UNIX_PATH_MAX = 108
1363
1364 def testLinuxAbstractNamespace(self):
1365 address = "\x00python-test-hello\x00\xff"
1366 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1367 s1.bind(address)
1368 s1.listen(1)
1369 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1370 s2.connect(s1.getsockname())
1371 s1.accept()
1372 self.assertEqual(s1.getsockname(), address)
1373 self.assertEqual(s2.getpeername(), address)
1374
1375 def testMaxName(self):
1376 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1377 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1378 s.bind(address)
1379 self.assertEqual(s.getsockname(), address)
1380
1381 def testNameOverflow(self):
1382 address = "\x00" + "h" * self.UNIX_PATH_MAX
1383 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1384 self.assertRaises(socket.error, s.bind, address)
1385
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001386
Victor Stinner6a102812010-04-27 23:55:59 +00001387@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001388class BufferIOTest(SocketConnectedTest):
1389 """
1390 Test the buffer versions of socket.recv() and socket.send().
1391 """
1392 def __init__(self, methodName='runTest'):
1393 SocketConnectedTest.__init__(self, methodName=methodName)
1394
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001395 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001396 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001397 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001398 self.assertEqual(nbytes, len(MSG))
1399 msg = buf.tostring()[:len(MSG)]
1400 self.assertEqual(msg, MSG)
1401
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001402 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001403 with test_support.check_py3k_warnings():
1404 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001405 self.serv_conn.send(buf)
1406
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001407 def testRecvIntoBytearray(self):
1408 buf = bytearray(1024)
1409 nbytes = self.cli_conn.recv_into(buf)
1410 self.assertEqual(nbytes, len(MSG))
1411 msg = buf[:len(MSG)]
1412 self.assertEqual(msg, MSG)
1413
1414 _testRecvIntoBytearray = _testRecvIntoArray
1415
1416 def testRecvIntoMemoryview(self):
1417 buf = bytearray(1024)
1418 nbytes = self.cli_conn.recv_into(memoryview(buf))
1419 self.assertEqual(nbytes, len(MSG))
1420 msg = buf[:len(MSG)]
1421 self.assertEqual(msg, MSG)
1422
1423 _testRecvIntoMemoryview = _testRecvIntoArray
1424
1425 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001426 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001427 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001428 self.assertEqual(nbytes, len(MSG))
1429 msg = buf.tostring()[:len(MSG)]
1430 self.assertEqual(msg, MSG)
1431
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001432 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001433 with test_support.check_py3k_warnings():
1434 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001435 self.serv_conn.send(buf)
1436
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001437 def testRecvFromIntoBytearray(self):
1438 buf = bytearray(1024)
1439 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1440 self.assertEqual(nbytes, len(MSG))
1441 msg = buf[:len(MSG)]
1442 self.assertEqual(msg, MSG)
1443
1444 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1445
1446 def testRecvFromIntoMemoryview(self):
1447 buf = bytearray(1024)
1448 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1449 self.assertEqual(nbytes, len(MSG))
1450 msg = buf[:len(MSG)]
1451 self.assertEqual(msg, MSG)
1452
1453 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1454
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001455
1456TIPC_STYPE = 2000
1457TIPC_LOWER = 200
1458TIPC_UPPER = 210
1459
1460def isTipcAvailable():
1461 """Check if the TIPC module is loaded
1462
1463 The TIPC module is not loaded automatically on Ubuntu and probably
1464 other Linux distros.
1465 """
1466 if not hasattr(socket, "AF_TIPC"):
1467 return False
1468 if not os.path.isfile("/proc/modules"):
1469 return False
1470 with open("/proc/modules") as f:
1471 for line in f:
1472 if line.startswith("tipc "):
1473 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001474 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001475 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1476 return False
1477
1478class TIPCTest (unittest.TestCase):
1479 def testRDM(self):
1480 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1481 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1482
1483 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1484 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1485 TIPC_LOWER, TIPC_UPPER)
1486 srv.bind(srvaddr)
1487
1488 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1489 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1490 cli.sendto(MSG, sendaddr)
1491
1492 msg, recvaddr = srv.recvfrom(1024)
1493
1494 self.assertEqual(cli.getsockname(), recvaddr)
1495 self.assertEqual(msg, MSG)
1496
1497
1498class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1499 def __init__(self, methodName = 'runTest'):
1500 unittest.TestCase.__init__(self, methodName = methodName)
1501 ThreadableTest.__init__(self)
1502
1503 def setUp(self):
1504 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1505 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1506 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1507 TIPC_LOWER, TIPC_UPPER)
1508 self.srv.bind(srvaddr)
1509 self.srv.listen(5)
1510 self.serverExplicitReady()
1511 self.conn, self.connaddr = self.srv.accept()
1512
1513 def clientSetUp(self):
1514 # The is a hittable race between serverExplicitReady() and the
1515 # accept() call; sleep a little while to avoid it, otherwise
1516 # we could get an exception
1517 time.sleep(0.1)
1518 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1519 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1520 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1521 self.cli.connect(addr)
1522 self.cliaddr = self.cli.getsockname()
1523
1524 def testStream(self):
1525 msg = self.conn.recv(1024)
1526 self.assertEqual(msg, MSG)
1527 self.assertEqual(self.cliaddr, self.connaddr)
1528
1529 def _testStream(self):
1530 self.cli.send(MSG)
1531 self.cli.close()
1532
1533
Guido van Rossumb995eb72002-07-31 16:08:40 +00001534def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001535 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001536 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1537 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001538
1539 tests.extend([
1540 NonBlockingTCPTests,
1541 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001542 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001543 UnbufferedFileObjectClassTestCase,
1544 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001545 SmallBufferedFileObjectClassTestCase,
1546 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001547 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001548 NetworkConnectionAttributesTest,
1549 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001550 ])
Dave Cole331708b2004-08-09 04:51:41 +00001551 if hasattr(socket, "socketpair"):
1552 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001553 if sys.platform == 'linux2':
1554 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001555 if isTipcAvailable():
1556 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001557 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001558
1559 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001560 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001561 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001562
1563if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001564 test_main()