blob: c2aa936aa9a3baff016221eae0f62ac68df0a586 [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)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000719 msg = sock.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 _testFromFd(self):
723 self.serv_conn.send(MSG)
724
Brian Curtin62c20b62010-11-02 02:59:55 +0000725 def testDup(self):
726 # Testing dup()
727 sock = self.cli_conn.dup()
728 self.addCleanup(sock.close)
729 msg = sock.recv(1024)
730 self.assertEqual(msg, MSG)
731
732 def _testDup(self):
733 self.serv_conn.send(MSG)
734
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000736 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000738 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000739 # wait for _testShutdown to finish: on OS X, when the server
740 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000741 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000742 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743
744 def _testShutdown(self):
745 self.serv_conn.send(MSG)
746 self.serv_conn.shutdown(2)
747
Victor Stinner6a102812010-04-27 23:55:59 +0000748@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749class BasicUDPTest(ThreadedUDPSocketTest):
750
751 def __init__(self, methodName='runTest'):
752 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
753
754 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000755 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000757 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758
759 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000760 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000761
Guido van Rossum1c938012002-06-12 21:17:20 +0000762 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000763 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000765 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766
Guido van Rossum1c938012002-06-12 21:17:20 +0000767 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000768 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000769
Facundo Batista1fe9f962007-03-28 03:45:20 +0000770 def testRecvFromNegative(self):
771 # Negative lengths passed to recvfrom should give ValueError.
772 self.assertRaises(ValueError, self.serv.recvfrom, -1)
773
774 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000775 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000776
Victor Stinner6a102812010-04-27 23:55:59 +0000777@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000778class TCPCloserTest(ThreadedTCPSocketTest):
779
780 def testClose(self):
781 conn, addr = self.serv.accept()
782 conn.close()
783
784 sd = self.cli
785 read, write, err = select.select([sd], [], [], 1.0)
786 self.assertEqual(read, [sd])
787 self.assertEqual(sd.recv(1), '')
788
789 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000790 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000791 time.sleep(1.0)
792
Victor Stinner6a102812010-04-27 23:55:59 +0000793@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000794class BasicSocketPairTest(SocketPairTest):
795
796 def __init__(self, methodName='runTest'):
797 SocketPairTest.__init__(self, methodName=methodName)
798
799 def testRecv(self):
800 msg = self.serv.recv(1024)
801 self.assertEqual(msg, MSG)
802
803 def _testRecv(self):
804 self.cli.send(MSG)
805
806 def testSend(self):
807 self.serv.send(MSG)
808
809 def _testSend(self):
810 msg = self.cli.recv(1024)
811 self.assertEqual(msg, MSG)
812
Victor Stinner6a102812010-04-27 23:55:59 +0000813@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814class NonBlockingTCPTests(ThreadedTCPSocketTest):
815
816 def __init__(self, methodName='runTest'):
817 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
818
819 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000820 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 self.serv.setblocking(0)
822 start = time.time()
823 try:
824 self.serv.accept()
825 except socket.error:
826 pass
827 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000828 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829
830 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000831 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000832
Guido van Rossum24e4af82002-06-12 19:18:08 +0000833 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000834 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000835 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000836 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000837 conn, addr = self.serv.accept()
838 except socket.error:
839 pass
840 else:
841 self.fail("Error trying to do non-blocking accept.")
842 read, write, err = select.select([self.serv], [], [])
843 if self.serv in read:
844 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000845 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 else:
847 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000848
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000850 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000851 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852
853 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000854 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000856 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857
858 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000859 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000860 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861
862 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000863 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000864 conn, addr = self.serv.accept()
865 conn.setblocking(0)
866 try:
867 msg = conn.recv(len(MSG))
868 except socket.error:
869 pass
870 else:
871 self.fail("Error trying to do non-blocking recv.")
872 read, write, err = select.select([conn], [], [])
873 if conn in read:
874 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +0000875 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +0000876 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000877 else:
878 self.fail("Error during select call to non-blocking socket.")
879
880 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000881 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000882 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000883 self.cli.send(MSG)
884
Victor Stinner6a102812010-04-27 23:55:59 +0000885@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886class FileObjectClassTestCase(SocketConnectedTest):
887
Guido van Rossume9f66142002-08-07 15:46:19 +0000888 bufsize = -1 # Use default buffer size
889
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890 def __init__(self, methodName='runTest'):
891 SocketConnectedTest.__init__(self, methodName=methodName)
892
893 def setUp(self):
894 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000895 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000896
897 def tearDown(self):
898 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000899 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000900 self.serv_file = None
901 SocketConnectedTest.tearDown(self)
902
903 def clientSetUp(self):
904 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000905 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000906
907 def clientTearDown(self):
908 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000909 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000910 self.cli_file = None
911 SocketConnectedTest.clientTearDown(self)
912
913 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000914 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000915 first_seg = self.serv_file.read(len(MSG)-3)
916 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000917 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000918 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919
920 def _testSmallRead(self):
921 self.cli_file.write(MSG)
922 self.cli_file.flush()
923
Guido van Rossum8c943832002-08-08 01:00:28 +0000924 def testFullRead(self):
925 # read until EOF
926 msg = self.serv_file.read()
927 self.assertEqual(msg, MSG)
928
929 def _testFullRead(self):
930 self.cli_file.write(MSG)
931 self.cli_file.close()
932
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000934 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000935 buf = ''
936 while 1:
937 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000938 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000939 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000940 buf += char
941 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942
943 def _testUnbufferedRead(self):
944 self.cli_file.write(MSG)
945 self.cli_file.flush()
946
947 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000948 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000949 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000950 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000951
952 def _testReadline(self):
953 self.cli_file.write(MSG)
954 self.cli_file.flush()
955
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000956 def testReadlineAfterRead(self):
957 a_baloo_is = self.serv_file.read(len("A baloo is"))
958 self.assertEqual("A baloo is", a_baloo_is)
959 _a_bear = self.serv_file.read(len(" a bear"))
960 self.assertEqual(" a bear", _a_bear)
961 line = self.serv_file.readline()
962 self.assertEqual("\n", line)
963 line = self.serv_file.readline()
964 self.assertEqual("A BALOO IS A BEAR.\n", line)
965 line = self.serv_file.readline()
966 self.assertEqual(MSG, line)
967
968 def _testReadlineAfterRead(self):
969 self.cli_file.write("A baloo is a bear\n")
970 self.cli_file.write("A BALOO IS A BEAR.\n")
971 self.cli_file.write(MSG)
972 self.cli_file.flush()
973
974 def testReadlineAfterReadNoNewline(self):
975 end_of_ = self.serv_file.read(len("End Of "))
976 self.assertEqual("End Of ", end_of_)
977 line = self.serv_file.readline()
978 self.assertEqual("Line", line)
979
980 def _testReadlineAfterReadNoNewline(self):
981 self.cli_file.write("End Of Line")
982
Tim Peters116d83c2004-03-28 02:20:45 +0000983 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000984 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000985
986 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000987 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000988
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000989
990class FileObjectInterruptedTestCase(unittest.TestCase):
991 """Test that the file object correctly handles EINTR internally."""
992
993 class MockSocket(object):
994 def __init__(self, recv_funcs=()):
995 # A generator that returns callables that we'll call for each
996 # call to recv().
997 self._recv_step = iter(recv_funcs)
998
999 def recv(self, size):
1000 return self._recv_step.next()()
1001
1002 @staticmethod
1003 def _raise_eintr():
1004 raise socket.error(errno.EINTR)
1005
1006 def _test_readline(self, size=-1, **kwargs):
1007 mock_sock = self.MockSocket(recv_funcs=[
1008 lambda : "This is the first line\nAnd the sec",
1009 self._raise_eintr,
1010 lambda : "ond line is here\n",
1011 lambda : "",
1012 ])
1013 fo = socket._fileobject(mock_sock, **kwargs)
1014 self.assertEquals(fo.readline(size), "This is the first line\n")
1015 self.assertEquals(fo.readline(size), "And the second line is here\n")
1016
1017 def _test_read(self, size=-1, **kwargs):
1018 mock_sock = self.MockSocket(recv_funcs=[
1019 lambda : "This is the first line\nAnd the sec",
1020 self._raise_eintr,
1021 lambda : "ond line is here\n",
1022 lambda : "",
1023 ])
1024 fo = socket._fileobject(mock_sock, **kwargs)
1025 self.assertEquals(fo.read(size), "This is the first line\n"
1026 "And the second line is here\n")
1027
1028 def test_default(self):
1029 self._test_readline()
1030 self._test_readline(size=100)
1031 self._test_read()
1032 self._test_read(size=100)
1033
1034 def test_with_1k_buffer(self):
1035 self._test_readline(bufsize=1024)
1036 self._test_readline(size=100, bufsize=1024)
1037 self._test_read(bufsize=1024)
1038 self._test_read(size=100, bufsize=1024)
1039
1040 def _test_readline_no_buffer(self, size=-1):
1041 mock_sock = self.MockSocket(recv_funcs=[
1042 lambda : "aa",
1043 lambda : "\n",
1044 lambda : "BB",
1045 self._raise_eintr,
1046 lambda : "bb",
1047 lambda : "",
1048 ])
1049 fo = socket._fileobject(mock_sock, bufsize=0)
1050 self.assertEquals(fo.readline(size), "aa\n")
1051 self.assertEquals(fo.readline(size), "BBbb")
1052
1053 def test_no_buffer(self):
1054 self._test_readline_no_buffer()
1055 self._test_readline_no_buffer(size=4)
1056 self._test_read(bufsize=0)
1057 self._test_read(size=100, bufsize=0)
1058
1059
Guido van Rossume9f66142002-08-07 15:46:19 +00001060class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1061
1062 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001063
Guido van Rossume9f66142002-08-07 15:46:19 +00001064 In this case (and in this case only), it should be possible to
1065 create a file object, read a line from it, create another file
1066 object, read another line from it, without loss of data in the
1067 first file object's buffer. Note that httplib relies on this
1068 when reading multiple requests from the same socket."""
1069
1070 bufsize = 0 # Use unbuffered mode
1071
1072 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001073 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001074 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001075 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001076 self.serv_file = self.cli_conn.makefile('rb', 0)
1077 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001078 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001079
1080 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001081 self.cli_file.write("A. " + MSG)
1082 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001083 self.cli_file.flush()
1084
Guido van Rossum8c943832002-08-08 01:00:28 +00001085class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1086
1087 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1088
1089
1090class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1091
1092 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001093
Georg Brandldd7b0522007-01-21 10:35:10 +00001094
Facundo Batista07c78be2007-03-23 18:54:07 +00001095class NetworkConnectionTest(object):
1096 """Prove network connection."""
1097 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001098 # We're inherited below by BasicTCPTest2, which also inherits
1099 # BasicTCPTest, which defines self.port referenced below.
1100 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001101 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001102
Facundo Batista07c78be2007-03-23 18:54:07 +00001103class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1104 """Tests that NetworkConnection does not break existing TCP functionality.
1105 """
1106
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001107class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001108 class MockSocket(socket.socket):
1109 def connect(self, *args):
1110 raise socket.timeout('timed out')
1111
1112 @contextlib.contextmanager
1113 def mocked_socket_module(self):
1114 """Return a socket which times out on connect"""
1115 old_socket = socket.socket
1116 socket.socket = self.MockSocket
1117 try:
1118 yield
1119 finally:
1120 socket.socket = old_socket
1121
1122 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001123 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001124 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001125 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001126 with self.assertRaises(socket.error) as cm:
1127 cli.connect((HOST, port))
1128 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1129
1130 def test_create_connection(self):
1131 # Issue #9792: errors raised by create_connection() should have
1132 # a proper errno attribute.
1133 port = test_support.find_unused_port()
1134 with self.assertRaises(socket.error) as cm:
1135 socket.create_connection((HOST, port))
1136 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1137
1138 def test_create_connection_timeout(self):
1139 # Issue #9792: create_connection() should not recast timeout errors
1140 # as generic socket errors.
1141 with self.mocked_socket_module():
1142 with self.assertRaises(socket.timeout):
1143 socket.create_connection((HOST, 1234))
1144
Facundo Batista07c78be2007-03-23 18:54:07 +00001145
Victor Stinner6a102812010-04-27 23:55:59 +00001146@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001147class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1148
1149 def __init__(self, methodName='runTest'):
1150 SocketTCPTest.__init__(self, methodName=methodName)
1151 ThreadableTest.__init__(self)
1152
1153 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001154 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001155
1156 def clientTearDown(self):
1157 self.cli.close()
1158 self.cli = None
1159 ThreadableTest.clientTearDown(self)
1160
1161 def _justAccept(self):
1162 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001163 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001164
1165 testFamily = _justAccept
1166 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001167 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001168 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001169 self.assertEqual(self.cli.family, 2)
1170
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001171 testSourceAddress = _justAccept
1172 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001173 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1174 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001175 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001176 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001177 # The port number being used is sufficient to show that the bind()
1178 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001179
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001180 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001181 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001182 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001183 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001184 socket.setdefaulttimeout(42)
1185 try:
1186 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001187 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001188 finally:
1189 socket.setdefaulttimeout(None)
1190 self.assertEquals(self.cli.gettimeout(), 42)
1191
1192 testTimeoutNone = _justAccept
1193 def _testTimeoutNone(self):
1194 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001195 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001196 socket.setdefaulttimeout(30)
1197 try:
1198 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001199 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001200 finally:
1201 socket.setdefaulttimeout(None)
1202 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001203
1204 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001205 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001206 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001207 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001208
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001209 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001210 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001211 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001212 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001213 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001214
Victor Stinner6a102812010-04-27 23:55:59 +00001215@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001216class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1217
1218 def __init__(self, methodName='runTest'):
1219 SocketTCPTest.__init__(self, methodName=methodName)
1220 ThreadableTest.__init__(self)
1221
1222 def clientSetUp(self):
1223 pass
1224
1225 def clientTearDown(self):
1226 self.cli.close()
1227 self.cli = None
1228 ThreadableTest.clientTearDown(self)
1229
Facundo Batista07c78be2007-03-23 18:54:07 +00001230 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001231 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001232 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001233 time.sleep(3)
1234 conn.send("done!")
1235 testOutsideTimeout = testInsideTimeout
1236
1237 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001238 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001239 data = sock.recv(5)
1240 self.assertEqual(data, "done!")
1241
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001242 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001243 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001244 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001245
1246
Georg Brandldd7b0522007-01-21 10:35:10 +00001247class Urllib2FileobjectTest(unittest.TestCase):
1248
1249 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1250 # it close the socket if the close c'tor argument is true
1251
1252 def testClose(self):
1253 class MockSocket:
1254 closed = False
1255 def flush(self): pass
1256 def close(self): self.closed = True
1257
1258 # must not close unless we request it: the original use of _fileobject
1259 # by module socket requires that the underlying socket not be closed until
1260 # the _socketobject that created the _fileobject is closed
1261 s = MockSocket()
1262 f = socket._fileobject(s)
1263 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001264 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001265
1266 s = MockSocket()
1267 f = socket._fileobject(s, close=True)
1268 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001269 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001270
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001271class TCPTimeoutTest(SocketTCPTest):
1272
1273 def testTCPTimeout(self):
1274 def raise_timeout(*args, **kwargs):
1275 self.serv.settimeout(1.0)
1276 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001277 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001278 "Error generating a timeout exception (TCP)")
1279
1280 def testTimeoutZero(self):
1281 ok = False
1282 try:
1283 self.serv.settimeout(0.0)
1284 foo = self.serv.accept()
1285 except socket.timeout:
1286 self.fail("caught timeout instead of error (TCP)")
1287 except socket.error:
1288 ok = True
1289 except:
1290 self.fail("caught unexpected exception (TCP)")
1291 if not ok:
1292 self.fail("accept() returned success when we did not expect it")
1293
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001294 def testInterruptedTimeout(self):
1295 # XXX I don't know how to do this test on MSWindows or any other
1296 # plaform that doesn't support signal.alarm() or os.kill(), though
1297 # the bug should have existed on all platforms.
1298 if not hasattr(signal, "alarm"):
1299 return # can only test on *nix
1300 self.serv.settimeout(5.0) # must be longer than alarm
1301 class Alarm(Exception):
1302 pass
1303 def alarm_handler(signal, frame):
1304 raise Alarm
1305 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1306 try:
1307 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1308 try:
1309 foo = self.serv.accept()
1310 except socket.timeout:
1311 self.fail("caught timeout instead of Alarm")
1312 except Alarm:
1313 pass
1314 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001315 self.fail("caught other exception instead of Alarm:"
1316 " %s(%s):\n%s" %
1317 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001318 else:
1319 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001320 finally:
1321 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001322 except Alarm:
1323 self.fail("got Alarm in wrong place")
1324 finally:
1325 # no alarm can be pending. Safe to restore old handler.
1326 signal.signal(signal.SIGALRM, old_alarm)
1327
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001328class UDPTimeoutTest(SocketTCPTest):
1329
1330 def testUDPTimeout(self):
1331 def raise_timeout(*args, **kwargs):
1332 self.serv.settimeout(1.0)
1333 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001334 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001335 "Error generating a timeout exception (UDP)")
1336
1337 def testTimeoutZero(self):
1338 ok = False
1339 try:
1340 self.serv.settimeout(0.0)
1341 foo = self.serv.recv(1024)
1342 except socket.timeout:
1343 self.fail("caught timeout instead of error (UDP)")
1344 except socket.error:
1345 ok = True
1346 except:
1347 self.fail("caught unexpected exception (UDP)")
1348 if not ok:
1349 self.fail("recv() returned success when we did not expect it")
1350
1351class TestExceptions(unittest.TestCase):
1352
1353 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001354 self.assertTrue(issubclass(socket.error, Exception))
1355 self.assertTrue(issubclass(socket.herror, socket.error))
1356 self.assertTrue(issubclass(socket.gaierror, socket.error))
1357 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001358
Armin Rigoa9017c32006-04-19 11:50:27 +00001359class TestLinuxAbstractNamespace(unittest.TestCase):
1360
1361 UNIX_PATH_MAX = 108
1362
1363 def testLinuxAbstractNamespace(self):
1364 address = "\x00python-test-hello\x00\xff"
1365 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1366 s1.bind(address)
1367 s1.listen(1)
1368 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1369 s2.connect(s1.getsockname())
1370 s1.accept()
1371 self.assertEqual(s1.getsockname(), address)
1372 self.assertEqual(s2.getpeername(), address)
1373
1374 def testMaxName(self):
1375 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1376 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1377 s.bind(address)
1378 self.assertEqual(s.getsockname(), address)
1379
1380 def testNameOverflow(self):
1381 address = "\x00" + "h" * self.UNIX_PATH_MAX
1382 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1383 self.assertRaises(socket.error, s.bind, address)
1384
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001385
Victor Stinner6a102812010-04-27 23:55:59 +00001386@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001387class BufferIOTest(SocketConnectedTest):
1388 """
1389 Test the buffer versions of socket.recv() and socket.send().
1390 """
1391 def __init__(self, methodName='runTest'):
1392 SocketConnectedTest.__init__(self, methodName=methodName)
1393
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001394 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001395 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001396 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001397 self.assertEqual(nbytes, len(MSG))
1398 msg = buf.tostring()[:len(MSG)]
1399 self.assertEqual(msg, MSG)
1400
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001401 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001402 with test_support.check_py3k_warnings():
1403 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001404 self.serv_conn.send(buf)
1405
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001406 def testRecvIntoBytearray(self):
1407 buf = bytearray(1024)
1408 nbytes = self.cli_conn.recv_into(buf)
1409 self.assertEqual(nbytes, len(MSG))
1410 msg = buf[:len(MSG)]
1411 self.assertEqual(msg, MSG)
1412
1413 _testRecvIntoBytearray = _testRecvIntoArray
1414
1415 def testRecvIntoMemoryview(self):
1416 buf = bytearray(1024)
1417 nbytes = self.cli_conn.recv_into(memoryview(buf))
1418 self.assertEqual(nbytes, len(MSG))
1419 msg = buf[:len(MSG)]
1420 self.assertEqual(msg, MSG)
1421
1422 _testRecvIntoMemoryview = _testRecvIntoArray
1423
1424 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001425 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001426 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001427 self.assertEqual(nbytes, len(MSG))
1428 msg = buf.tostring()[:len(MSG)]
1429 self.assertEqual(msg, MSG)
1430
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001431 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001432 with test_support.check_py3k_warnings():
1433 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001434 self.serv_conn.send(buf)
1435
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001436 def testRecvFromIntoBytearray(self):
1437 buf = bytearray(1024)
1438 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1439 self.assertEqual(nbytes, len(MSG))
1440 msg = buf[:len(MSG)]
1441 self.assertEqual(msg, MSG)
1442
1443 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1444
1445 def testRecvFromIntoMemoryview(self):
1446 buf = bytearray(1024)
1447 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1448 self.assertEqual(nbytes, len(MSG))
1449 msg = buf[:len(MSG)]
1450 self.assertEqual(msg, MSG)
1451
1452 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1453
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001454
1455TIPC_STYPE = 2000
1456TIPC_LOWER = 200
1457TIPC_UPPER = 210
1458
1459def isTipcAvailable():
1460 """Check if the TIPC module is loaded
1461
1462 The TIPC module is not loaded automatically on Ubuntu and probably
1463 other Linux distros.
1464 """
1465 if not hasattr(socket, "AF_TIPC"):
1466 return False
1467 if not os.path.isfile("/proc/modules"):
1468 return False
1469 with open("/proc/modules") as f:
1470 for line in f:
1471 if line.startswith("tipc "):
1472 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001473 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001474 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1475 return False
1476
1477class TIPCTest (unittest.TestCase):
1478 def testRDM(self):
1479 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1480 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1481
1482 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1483 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1484 TIPC_LOWER, TIPC_UPPER)
1485 srv.bind(srvaddr)
1486
1487 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1488 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1489 cli.sendto(MSG, sendaddr)
1490
1491 msg, recvaddr = srv.recvfrom(1024)
1492
1493 self.assertEqual(cli.getsockname(), recvaddr)
1494 self.assertEqual(msg, MSG)
1495
1496
1497class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1498 def __init__(self, methodName = 'runTest'):
1499 unittest.TestCase.__init__(self, methodName = methodName)
1500 ThreadableTest.__init__(self)
1501
1502 def setUp(self):
1503 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1504 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1505 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1506 TIPC_LOWER, TIPC_UPPER)
1507 self.srv.bind(srvaddr)
1508 self.srv.listen(5)
1509 self.serverExplicitReady()
1510 self.conn, self.connaddr = self.srv.accept()
1511
1512 def clientSetUp(self):
1513 # The is a hittable race between serverExplicitReady() and the
1514 # accept() call; sleep a little while to avoid it, otherwise
1515 # we could get an exception
1516 time.sleep(0.1)
1517 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1518 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1519 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1520 self.cli.connect(addr)
1521 self.cliaddr = self.cli.getsockname()
1522
1523 def testStream(self):
1524 msg = self.conn.recv(1024)
1525 self.assertEqual(msg, MSG)
1526 self.assertEqual(self.cliaddr, self.connaddr)
1527
1528 def _testStream(self):
1529 self.cli.send(MSG)
1530 self.cli.close()
1531
1532
Guido van Rossumb995eb72002-07-31 16:08:40 +00001533def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001534 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001535 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1536 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001537
1538 tests.extend([
1539 NonBlockingTCPTests,
1540 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001541 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001542 UnbufferedFileObjectClassTestCase,
1543 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001544 SmallBufferedFileObjectClassTestCase,
1545 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001546 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001547 NetworkConnectionAttributesTest,
1548 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001549 ])
Dave Cole331708b2004-08-09 04:51:41 +00001550 if hasattr(socket, "socketpair"):
1551 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001552 if sys.platform == 'linux2':
1553 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001554 if isTipcAvailable():
1555 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001556 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001557
1558 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001559 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001560 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001561
1562if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001563 test_main()