blob: 00bf948a658e15699ee8669ce7992d03d16015ba [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
Brian Curtindd8564f2010-11-04 03:54:23 +0000189 def clientTearDown(self):
190 self.cli.close()
191 self.cli = None
192 ThreadableTest.clientTearDown(self)
193
Guido van Rossum24e4af82002-06-12 19:18:08 +0000194class SocketConnectedTest(ThreadedTCPSocketTest):
195
196 def __init__(self, methodName='runTest'):
197 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
198
199 def setUp(self):
200 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000201 # Indicate explicitly we're ready for the client thread to
202 # proceed and then perform the blocking call to accept
203 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000204 conn, addr = self.serv.accept()
205 self.cli_conn = conn
206
207 def tearDown(self):
208 self.cli_conn.close()
209 self.cli_conn = None
210 ThreadedTCPSocketTest.tearDown(self)
211
212 def clientSetUp(self):
213 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000214 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215 self.serv_conn = self.cli
216
217 def clientTearDown(self):
218 self.serv_conn.close()
219 self.serv_conn = None
220 ThreadedTCPSocketTest.clientTearDown(self)
221
Dave Cole331708b2004-08-09 04:51:41 +0000222class SocketPairTest(unittest.TestCase, ThreadableTest):
223
224 def __init__(self, methodName='runTest'):
225 unittest.TestCase.__init__(self, methodName=methodName)
226 ThreadableTest.__init__(self)
227
228 def setUp(self):
229 self.serv, self.cli = socket.socketpair()
230
231 def tearDown(self):
232 self.serv.close()
233 self.serv = None
234
235 def clientSetUp(self):
236 pass
237
238 def clientTearDown(self):
239 self.cli.close()
240 self.cli = None
241 ThreadableTest.clientTearDown(self)
242
Tim Peters494aaee2004-08-09 18:54:11 +0000243
Guido van Rossum24e4af82002-06-12 19:18:08 +0000244#######################################################################
245## Begin Tests
246
247class GeneralModuleTests(unittest.TestCase):
248
Raymond Hettinger027bb632004-05-31 03:09:25 +0000249 def test_weakref(self):
250 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
251 p = proxy(s)
252 self.assertEqual(p.fileno(), s.fileno())
253 s.close()
254 s = None
255 try:
256 p.fileno()
257 except ReferenceError:
258 pass
259 else:
260 self.fail('Socket proxy still exists')
261
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000263 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 def raise_error(*args, **kwargs):
265 raise socket.error
266 def raise_herror(*args, **kwargs):
267 raise socket.herror
268 def raise_gaierror(*args, **kwargs):
269 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000270 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000272 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000274 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 "Error raising socket exception.")
276
277 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000278 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 socket.AF_INET
280 socket.SOCK_STREAM
281 socket.SOCK_DGRAM
282 socket.SOCK_RAW
283 socket.SOCK_RDM
284 socket.SOCK_SEQPACKET
285 socket.SOL_SOCKET
286 socket.SO_REUSEADDR
287
Guido van Rossum654c11e2002-06-13 20:24:17 +0000288 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000289 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000290 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000291 try:
292 ip = socket.gethostbyname(hostname)
293 except socket.error:
294 # Probably name lookup wasn't set up right; skip this test
295 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000296 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000297 try:
298 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
299 except socket.error:
300 # Probably a similar problem as above; skip this test
301 return
Brett Cannon01668a12005-03-11 00:04:17 +0000302 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000303 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000304 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000305 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000306
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000307 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000308 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000309 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000310 try:
311 # On some versions, this loses a reference
312 orig = sys.getrefcount(__name__)
313 socket.getnameinfo(__name__,0)
Georg Brandlab849892009-09-19 07:35:07 +0000314 except TypeError:
Florent Xicluna07627882010-03-21 01:14:24 +0000315 self.assertEqual(sys.getrefcount(__name__), orig,
316 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000317
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000319 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000320 try:
321 # On some versions, this crashes the interpreter.
322 socket.getnameinfo(('x', 0, 0, 0), 0)
323 except socket.error:
324 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000325
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000326 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000327 # This just checks that htons etc. are their own inverse,
328 # when looking at the lower 16 or 32 bits.
329 sizes = {socket.htonl: 32, socket.ntohl: 32,
330 socket.htons: 16, socket.ntohs: 16}
331 for func, size in sizes.items():
332 mask = (1L<<size) - 1
333 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
334 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000335
Guido van Rossuma2627af2002-09-14 00:58:46 +0000336 swapped = func(mask)
337 self.assertEqual(swapped & mask, mask)
338 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000339
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000340 def testNtoHErrors(self):
341 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
342 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
343 for k in good_values:
344 socket.ntohl(k)
345 socket.ntohs(k)
346 socket.htonl(k)
347 socket.htons(k)
348 for k in bad_values:
349 self.assertRaises(OverflowError, socket.ntohl, k)
350 self.assertRaises(OverflowError, socket.ntohs, k)
351 self.assertRaises(OverflowError, socket.htonl, k)
352 self.assertRaises(OverflowError, socket.htons, k)
353
Barry Warsaw11b91a02004-06-28 00:50:43 +0000354 def testGetServBy(self):
355 eq = self.assertEqual
356 # Find one service that exists, then check all the related interfaces.
357 # I've ordered this by protocols that have both a tcp and udp
358 # protocol, at least for modern Linuxes.
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000359 if (sys.platform.startswith('linux') or
360 sys.platform.startswith('freebsd') or
361 sys.platform.startswith('netbsd') or
362 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000363 # avoid the 'echo' service on this platform, as there is an
364 # assumption breaking non-standard port/protocol entry
365 services = ('daytime', 'qotd', 'domain')
366 else:
367 services = ('echo', 'daytime', 'domain')
368 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000369 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000370 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000371 break
372 except socket.error:
373 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000374 else:
375 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000376 # Try same call with optional protocol omitted
377 port2 = socket.getservbyname(service)
378 eq(port, port2)
379 # Try udp, but don't barf it it doesn't exist
380 try:
381 udpport = socket.getservbyname(service, 'udp')
382 except socket.error:
383 udpport = None
384 else:
385 eq(udpport, port)
386 # Now make sure the lookup by port returns the same service name
387 eq(socket.getservbyport(port2), service)
388 eq(socket.getservbyport(port, 'tcp'), service)
389 if udpport is not None:
390 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000391 # Make sure getservbyport does not accept out of range ports.
392 self.assertRaises(OverflowError, socket.getservbyport, -1)
393 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000394
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000395 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000396 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000397 # The default timeout should initially be None
398 self.assertEqual(socket.getdefaulttimeout(), None)
399 s = socket.socket()
400 self.assertEqual(s.gettimeout(), None)
401 s.close()
402
403 # Set the default timeout to 10, and see if it propagates
404 socket.setdefaulttimeout(10)
405 self.assertEqual(socket.getdefaulttimeout(), 10)
406 s = socket.socket()
407 self.assertEqual(s.gettimeout(), 10)
408 s.close()
409
410 # Reset the default timeout to None, and see if it propagates
411 socket.setdefaulttimeout(None)
412 self.assertEqual(socket.getdefaulttimeout(), None)
413 s = socket.socket()
414 self.assertEqual(s.gettimeout(), None)
415 s.close()
416
417 # Check that setting it to an invalid value raises ValueError
418 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
419
420 # Check that setting it to an invalid type raises TypeError
421 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
422
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000423 def testIPv4_inet_aton_fourbytes(self):
424 if not hasattr(socket, 'inet_aton'):
425 return # No inet_aton, nothing to check
426 # Test that issue1008086 and issue767150 are fixed.
427 # It must return 4 bytes.
428 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
429 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
430
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000431 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000432 if not hasattr(socket, 'inet_pton'):
433 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000434 from socket import inet_aton as f, inet_pton, AF_INET
435 g = lambda a: inet_pton(AF_INET, a)
436
437 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
438 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
439 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
440 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000441 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000442
443 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
444 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
445 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000446 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000447
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000448 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000449 if not hasattr(socket, 'inet_pton'):
450 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000451 try:
452 from socket import inet_pton, AF_INET6, has_ipv6
453 if not has_ipv6:
454 return
455 except ImportError:
456 return
457 f = lambda a: inet_pton(AF_INET6, a)
458
459 self.assertEquals('\x00' * 16, f('::'))
460 self.assertEquals('\x00' * 16, f('0::0'))
461 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
462 self.assertEquals(
463 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
464 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
465 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000466
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000467 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000468 if not hasattr(socket, 'inet_ntop'):
469 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000470 from socket import inet_ntoa as f, inet_ntop, AF_INET
471 g = lambda a: inet_ntop(AF_INET, a)
472
473 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
474 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
475 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
476 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000477
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000478 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
479 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
480 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
481
482 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000483 if not hasattr(socket, 'inet_ntop'):
484 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000485 try:
486 from socket import inet_ntop, AF_INET6, has_ipv6
487 if not has_ipv6:
488 return
489 except ImportError:
490 return
491 f = lambda a: inet_ntop(AF_INET6, a)
492
493 self.assertEquals('::', f('\x00' * 16))
494 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
495 self.assertEquals(
496 'aef:b01:506:1001:ffff:9997:55:170',
497 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
498 )
499
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000500 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000501
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000502 def _get_unused_port(self, bind_address='0.0.0.0'):
503 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000504
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000505 Args:
506 bind_address: Hostname or IP address to search for a port on.
507
508 Returns: A most likely to be unused port.
509 """
510 tempsock = socket.socket()
511 tempsock.bind((bind_address, 0))
512 host, port = tempsock.getsockname()
513 tempsock.close()
514 return port
515
516 def testSockName(self):
517 # Testing getsockname()
518 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000520 self.addCleanup(sock.close)
Trent Nelsone41b0062008-04-08 23:47:30 +0000521 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000523 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
524 # it reasonable to get the host's addr in addition to 0.0.0.0.
525 # At least for eCos. This is required for the S/390 to pass.
526 my_ip_addr = socket.gethostbyname(socket.gethostname())
Ezio Melottiaa980582010-01-23 23:04:36 +0000527 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000528 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000529
530 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000531 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532 # We know a socket should start without reuse==0
533 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000534 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000536 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000537
538 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000539 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000541 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000542 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
543 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000544 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000545
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000546 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000547 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000548 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
549 sock.settimeout(1)
550 sock.close()
551 self.assertRaises(socket.error, sock.send, "spam")
552
Georg Brandlbb03ac02006-03-21 18:17:25 +0000553 def testNewAttributes(self):
554 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000555 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000556 self.assertEqual(sock.family, socket.AF_INET)
557 self.assertEqual(sock.type, socket.SOCK_STREAM)
558 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000559 sock.close()
560
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000561 def test_getsockaddrarg(self):
562 host = '0.0.0.0'
563 port = self._get_unused_port(bind_address=host)
564 big_port = port + 65536
565 neg_port = port - 65536
566 sock = socket.socket()
567 try:
568 self.assertRaises(OverflowError, sock.bind, (host, big_port))
569 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
570 sock.bind((host, port))
571 finally:
572 sock.close()
573
Christian Heimesa47b75b2008-01-04 15:48:06 +0000574 def test_sock_ioctl(self):
575 if os.name != "nt":
576 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000577 self.assertTrue(hasattr(socket.socket, 'ioctl'))
578 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
579 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
580 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000581 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
582 s = socket.socket()
583 self.assertRaises(ValueError, s.ioctl, -1, None)
584 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000585
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000586 def testGetaddrinfo(self):
587 try:
588 socket.getaddrinfo('localhost', 80)
589 except socket.gaierror as err:
590 if err.errno == socket.EAI_SERVICE:
591 # see http://bugs.python.org/issue1282647
592 self.skipTest("buggy libc version")
593 raise
594 # len of every sequence is supposed to be == 5
595 for info in socket.getaddrinfo(HOST, None):
596 self.assertEqual(len(info), 5)
597 # host can be a domain name, a string representation of an
598 # IPv4/v6 address or None
599 socket.getaddrinfo('localhost', 80)
600 socket.getaddrinfo('127.0.0.1', 80)
601 socket.getaddrinfo(None, 80)
602 if SUPPORTS_IPV6:
603 socket.getaddrinfo('::1', 80)
604 # port can be a string service name such as "http", a numeric
605 # port number or None
606 socket.getaddrinfo(HOST, "http")
607 socket.getaddrinfo(HOST, 80)
608 socket.getaddrinfo(HOST, None)
609 # test family and socktype filters
610 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
611 for family, _, _, _, _ in infos:
612 self.assertEqual(family, socket.AF_INET)
613 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
614 for _, socktype, _, _, _ in infos:
615 self.assertEqual(socktype, socket.SOCK_STREAM)
616 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000617 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000618 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
619 # a server willing to support both IPv4 and IPv6 will
620 # usually do this
621 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
622 socket.AI_PASSIVE)
623
Christian Heimesa47b75b2008-01-04 15:48:06 +0000624
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000625 def check_sendall_interrupted(self, with_timeout):
626 # socketpair() is not stricly required, but it makes things easier.
627 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
628 self.skipTest("signal.alarm and socket.socketpair required for this test")
629 # Our signal handlers clobber the C errno by calling a math function
630 # with an invalid domain value.
631 def ok_handler(*args):
632 self.assertRaises(ValueError, math.acosh, 0)
633 def raising_handler(*args):
634 self.assertRaises(ValueError, math.acosh, 0)
635 1 // 0
636 c, s = socket.socketpair()
637 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
638 try:
639 if with_timeout:
640 # Just above the one second minimum for signal.alarm
641 c.settimeout(1.5)
642 with self.assertRaises(ZeroDivisionError):
643 signal.alarm(1)
644 c.sendall(b"x" * (1024**2))
645 if with_timeout:
646 signal.signal(signal.SIGALRM, ok_handler)
647 signal.alarm(1)
648 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
649 finally:
650 signal.signal(signal.SIGALRM, old_alarm)
651 c.close()
652 s.close()
653
654 def test_sendall_interrupted(self):
655 self.check_sendall_interrupted(False)
656
657 def test_sendall_interrupted_with_timeout(self):
658 self.check_sendall_interrupted(True)
659
660
Victor Stinner6a102812010-04-27 23:55:59 +0000661@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000662class BasicTCPTest(SocketConnectedTest):
663
664 def __init__(self, methodName='runTest'):
665 SocketConnectedTest.__init__(self, methodName=methodName)
666
667 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000668 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000670 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000671
672 def _testRecv(self):
673 self.serv_conn.send(MSG)
674
675 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000676 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000677 seg1 = self.cli_conn.recv(len(MSG) - 3)
678 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000679 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000680 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000681
682 def _testOverFlowRecv(self):
683 self.serv_conn.send(MSG)
684
685 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000686 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000687 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000688 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689
690 def _testRecvFrom(self):
691 self.serv_conn.send(MSG)
692
693 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000694 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000695 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
696 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000697 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000698 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000699
700 def _testOverFlowRecvFrom(self):
701 self.serv_conn.send(MSG)
702
703 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000704 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000705 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000706 while 1:
707 read = self.cli_conn.recv(1024)
708 if not read:
709 break
Guido van Rossume531e292002-08-08 20:28:34 +0000710 msg += read
711 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712
713 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000714 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715 self.serv_conn.sendall(big_chunk)
716
717 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000718 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000719 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000720 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721 fd = self.cli_conn.fileno()
722 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000723 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000724 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000725 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000726
727 def _testFromFd(self):
728 self.serv_conn.send(MSG)
729
Brian Curtin62c20b62010-11-02 02:59:55 +0000730 def testDup(self):
731 # Testing dup()
732 sock = self.cli_conn.dup()
733 self.addCleanup(sock.close)
734 msg = sock.recv(1024)
735 self.assertEqual(msg, MSG)
736
737 def _testDup(self):
738 self.serv_conn.send(MSG)
739
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000741 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000742 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000743 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000744 # wait for _testShutdown to finish: on OS X, when the server
745 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000746 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000747 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748
749 def _testShutdown(self):
750 self.serv_conn.send(MSG)
751 self.serv_conn.shutdown(2)
752
Victor Stinner6a102812010-04-27 23:55:59 +0000753@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000754class BasicUDPTest(ThreadedUDPSocketTest):
755
756 def __init__(self, methodName='runTest'):
757 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
758
759 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000760 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000761 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000762 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000763
764 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000765 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766
Guido van Rossum1c938012002-06-12 21:17:20 +0000767 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000768 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000769 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000770 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771
Guido van Rossum1c938012002-06-12 21:17:20 +0000772 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000773 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774
Facundo Batista1fe9f962007-03-28 03:45:20 +0000775 def testRecvFromNegative(self):
776 # Negative lengths passed to recvfrom should give ValueError.
777 self.assertRaises(ValueError, self.serv.recvfrom, -1)
778
779 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000780 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000781
Victor Stinner6a102812010-04-27 23:55:59 +0000782@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000783class TCPCloserTest(ThreadedTCPSocketTest):
784
785 def testClose(self):
786 conn, addr = self.serv.accept()
787 conn.close()
788
789 sd = self.cli
790 read, write, err = select.select([sd], [], [], 1.0)
791 self.assertEqual(read, [sd])
792 self.assertEqual(sd.recv(1), '')
793
794 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000795 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000796 time.sleep(1.0)
797
Victor Stinner6a102812010-04-27 23:55:59 +0000798@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000799class BasicSocketPairTest(SocketPairTest):
800
801 def __init__(self, methodName='runTest'):
802 SocketPairTest.__init__(self, methodName=methodName)
803
804 def testRecv(self):
805 msg = self.serv.recv(1024)
806 self.assertEqual(msg, MSG)
807
808 def _testRecv(self):
809 self.cli.send(MSG)
810
811 def testSend(self):
812 self.serv.send(MSG)
813
814 def _testSend(self):
815 msg = self.cli.recv(1024)
816 self.assertEqual(msg, MSG)
817
Victor Stinner6a102812010-04-27 23:55:59 +0000818@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819class NonBlockingTCPTests(ThreadedTCPSocketTest):
820
821 def __init__(self, methodName='runTest'):
822 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
823
824 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000825 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826 self.serv.setblocking(0)
827 start = time.time()
828 try:
829 self.serv.accept()
830 except socket.error:
831 pass
832 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000833 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834
835 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000836 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000837
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000839 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000841 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000842 conn, addr = self.serv.accept()
843 except socket.error:
844 pass
845 else:
846 self.fail("Error trying to do non-blocking accept.")
847 read, write, err = select.select([self.serv], [], [])
848 if self.serv in read:
849 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000850 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000851 else:
852 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000853
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000855 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000856 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857
858 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000859 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000861 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862
863 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000864 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000865 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866
867 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000868 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869 conn, addr = self.serv.accept()
870 conn.setblocking(0)
871 try:
872 msg = conn.recv(len(MSG))
873 except socket.error:
874 pass
875 else:
876 self.fail("Error trying to do non-blocking recv.")
877 read, write, err = select.select([conn], [], [])
878 if conn in read:
879 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +0000880 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +0000881 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000882 else:
883 self.fail("Error during select call to non-blocking socket.")
884
885 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000886 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000887 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888 self.cli.send(MSG)
889
Victor Stinner6a102812010-04-27 23:55:59 +0000890@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000891class FileObjectClassTestCase(SocketConnectedTest):
892
Guido van Rossume9f66142002-08-07 15:46:19 +0000893 bufsize = -1 # Use default buffer size
894
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895 def __init__(self, methodName='runTest'):
896 SocketConnectedTest.__init__(self, methodName=methodName)
897
898 def setUp(self):
899 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000900 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901
902 def tearDown(self):
903 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000904 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905 self.serv_file = None
906 SocketConnectedTest.tearDown(self)
907
908 def clientSetUp(self):
909 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000910 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000911
912 def clientTearDown(self):
913 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000914 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000915 self.cli_file = None
916 SocketConnectedTest.clientTearDown(self)
917
918 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000919 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920 first_seg = self.serv_file.read(len(MSG)-3)
921 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000922 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000923 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000924
925 def _testSmallRead(self):
926 self.cli_file.write(MSG)
927 self.cli_file.flush()
928
Guido van Rossum8c943832002-08-08 01:00:28 +0000929 def testFullRead(self):
930 # read until EOF
931 msg = self.serv_file.read()
932 self.assertEqual(msg, MSG)
933
934 def _testFullRead(self):
935 self.cli_file.write(MSG)
936 self.cli_file.close()
937
Guido van Rossum24e4af82002-06-12 19:18:08 +0000938 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000939 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000940 buf = ''
941 while 1:
942 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000943 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000944 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000945 buf += char
946 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000947
948 def _testUnbufferedRead(self):
949 self.cli_file.write(MSG)
950 self.cli_file.flush()
951
952 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000953 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000954 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000955 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000956
957 def _testReadline(self):
958 self.cli_file.write(MSG)
959 self.cli_file.flush()
960
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000961 def testReadlineAfterRead(self):
962 a_baloo_is = self.serv_file.read(len("A baloo is"))
963 self.assertEqual("A baloo is", a_baloo_is)
964 _a_bear = self.serv_file.read(len(" a bear"))
965 self.assertEqual(" a bear", _a_bear)
966 line = self.serv_file.readline()
967 self.assertEqual("\n", line)
968 line = self.serv_file.readline()
969 self.assertEqual("A BALOO IS A BEAR.\n", line)
970 line = self.serv_file.readline()
971 self.assertEqual(MSG, line)
972
973 def _testReadlineAfterRead(self):
974 self.cli_file.write("A baloo is a bear\n")
975 self.cli_file.write("A BALOO IS A BEAR.\n")
976 self.cli_file.write(MSG)
977 self.cli_file.flush()
978
979 def testReadlineAfterReadNoNewline(self):
980 end_of_ = self.serv_file.read(len("End Of "))
981 self.assertEqual("End Of ", end_of_)
982 line = self.serv_file.readline()
983 self.assertEqual("Line", line)
984
985 def _testReadlineAfterReadNoNewline(self):
986 self.cli_file.write("End Of Line")
987
Tim Peters116d83c2004-03-28 02:20:45 +0000988 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000989 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000990
991 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000992 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000993
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000994
995class FileObjectInterruptedTestCase(unittest.TestCase):
996 """Test that the file object correctly handles EINTR internally."""
997
998 class MockSocket(object):
999 def __init__(self, recv_funcs=()):
1000 # A generator that returns callables that we'll call for each
1001 # call to recv().
1002 self._recv_step = iter(recv_funcs)
1003
1004 def recv(self, size):
1005 return self._recv_step.next()()
1006
1007 @staticmethod
1008 def _raise_eintr():
1009 raise socket.error(errno.EINTR)
1010
1011 def _test_readline(self, size=-1, **kwargs):
1012 mock_sock = self.MockSocket(recv_funcs=[
1013 lambda : "This is the first line\nAnd the sec",
1014 self._raise_eintr,
1015 lambda : "ond line is here\n",
1016 lambda : "",
1017 ])
1018 fo = socket._fileobject(mock_sock, **kwargs)
1019 self.assertEquals(fo.readline(size), "This is the first line\n")
1020 self.assertEquals(fo.readline(size), "And the second line is here\n")
1021
1022 def _test_read(self, size=-1, **kwargs):
1023 mock_sock = self.MockSocket(recv_funcs=[
1024 lambda : "This is the first line\nAnd the sec",
1025 self._raise_eintr,
1026 lambda : "ond line is here\n",
1027 lambda : "",
1028 ])
1029 fo = socket._fileobject(mock_sock, **kwargs)
1030 self.assertEquals(fo.read(size), "This is the first line\n"
1031 "And the second line is here\n")
1032
1033 def test_default(self):
1034 self._test_readline()
1035 self._test_readline(size=100)
1036 self._test_read()
1037 self._test_read(size=100)
1038
1039 def test_with_1k_buffer(self):
1040 self._test_readline(bufsize=1024)
1041 self._test_readline(size=100, bufsize=1024)
1042 self._test_read(bufsize=1024)
1043 self._test_read(size=100, bufsize=1024)
1044
1045 def _test_readline_no_buffer(self, size=-1):
1046 mock_sock = self.MockSocket(recv_funcs=[
1047 lambda : "aa",
1048 lambda : "\n",
1049 lambda : "BB",
1050 self._raise_eintr,
1051 lambda : "bb",
1052 lambda : "",
1053 ])
1054 fo = socket._fileobject(mock_sock, bufsize=0)
1055 self.assertEquals(fo.readline(size), "aa\n")
1056 self.assertEquals(fo.readline(size), "BBbb")
1057
1058 def test_no_buffer(self):
1059 self._test_readline_no_buffer()
1060 self._test_readline_no_buffer(size=4)
1061 self._test_read(bufsize=0)
1062 self._test_read(size=100, bufsize=0)
1063
1064
Guido van Rossume9f66142002-08-07 15:46:19 +00001065class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1066
1067 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001068
Guido van Rossume9f66142002-08-07 15:46:19 +00001069 In this case (and in this case only), it should be possible to
1070 create a file object, read a line from it, create another file
1071 object, read another line from it, without loss of data in the
1072 first file object's buffer. Note that httplib relies on this
1073 when reading multiple requests from the same socket."""
1074
1075 bufsize = 0 # Use unbuffered mode
1076
1077 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001078 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001079 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001080 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001081 self.serv_file = self.cli_conn.makefile('rb', 0)
1082 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001083 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001084
1085 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001086 self.cli_file.write("A. " + MSG)
1087 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001088 self.cli_file.flush()
1089
Guido van Rossum8c943832002-08-08 01:00:28 +00001090class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1091
1092 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1093
1094
1095class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1096
1097 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001098
Georg Brandldd7b0522007-01-21 10:35:10 +00001099
Facundo Batista07c78be2007-03-23 18:54:07 +00001100class NetworkConnectionTest(object):
1101 """Prove network connection."""
1102 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001103 # We're inherited below by BasicTCPTest2, which also inherits
1104 # BasicTCPTest, which defines self.port referenced below.
1105 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001106 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001107
Facundo Batista07c78be2007-03-23 18:54:07 +00001108class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1109 """Tests that NetworkConnection does not break existing TCP functionality.
1110 """
1111
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001112class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001113 class MockSocket(socket.socket):
1114 def connect(self, *args):
1115 raise socket.timeout('timed out')
1116
1117 @contextlib.contextmanager
1118 def mocked_socket_module(self):
1119 """Return a socket which times out on connect"""
1120 old_socket = socket.socket
1121 socket.socket = self.MockSocket
1122 try:
1123 yield
1124 finally:
1125 socket.socket = old_socket
1126
1127 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001128 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001129 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001130 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001131 with self.assertRaises(socket.error) as cm:
1132 cli.connect((HOST, port))
1133 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1134
1135 def test_create_connection(self):
1136 # Issue #9792: errors raised by create_connection() should have
1137 # a proper errno attribute.
1138 port = test_support.find_unused_port()
1139 with self.assertRaises(socket.error) as cm:
1140 socket.create_connection((HOST, port))
1141 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1142
1143 def test_create_connection_timeout(self):
1144 # Issue #9792: create_connection() should not recast timeout errors
1145 # as generic socket errors.
1146 with self.mocked_socket_module():
1147 with self.assertRaises(socket.timeout):
1148 socket.create_connection((HOST, 1234))
1149
Facundo Batista07c78be2007-03-23 18:54:07 +00001150
Victor Stinner6a102812010-04-27 23:55:59 +00001151@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001152class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1153
1154 def __init__(self, methodName='runTest'):
1155 SocketTCPTest.__init__(self, methodName=methodName)
1156 ThreadableTest.__init__(self)
1157
1158 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001159 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001160
1161 def clientTearDown(self):
1162 self.cli.close()
1163 self.cli = None
1164 ThreadableTest.clientTearDown(self)
1165
1166 def _justAccept(self):
1167 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001168 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001169
1170 testFamily = _justAccept
1171 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001172 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001173 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001174 self.assertEqual(self.cli.family, 2)
1175
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001176 testSourceAddress = _justAccept
1177 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001178 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1179 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001180 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001181 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001182 # The port number being used is sufficient to show that the bind()
1183 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001184
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001185 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001186 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001187 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001188 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001189 socket.setdefaulttimeout(42)
1190 try:
1191 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001192 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001193 finally:
1194 socket.setdefaulttimeout(None)
1195 self.assertEquals(self.cli.gettimeout(), 42)
1196
1197 testTimeoutNone = _justAccept
1198 def _testTimeoutNone(self):
1199 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001200 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001201 socket.setdefaulttimeout(30)
1202 try:
1203 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001204 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001205 finally:
1206 socket.setdefaulttimeout(None)
1207 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001208
1209 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001210 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001211 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001212 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001213
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001214 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001215 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001216 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001217 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001218 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001219
Victor Stinner6a102812010-04-27 23:55:59 +00001220@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001221class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1222
1223 def __init__(self, methodName='runTest'):
1224 SocketTCPTest.__init__(self, methodName=methodName)
1225 ThreadableTest.__init__(self)
1226
1227 def clientSetUp(self):
1228 pass
1229
1230 def clientTearDown(self):
1231 self.cli.close()
1232 self.cli = None
1233 ThreadableTest.clientTearDown(self)
1234
Facundo Batista07c78be2007-03-23 18:54:07 +00001235 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001236 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001237 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001238 time.sleep(3)
1239 conn.send("done!")
1240 testOutsideTimeout = testInsideTimeout
1241
1242 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001243 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001244 data = sock.recv(5)
1245 self.assertEqual(data, "done!")
1246
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001247 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001248 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001249 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001250
1251
Georg Brandldd7b0522007-01-21 10:35:10 +00001252class Urllib2FileobjectTest(unittest.TestCase):
1253
1254 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1255 # it close the socket if the close c'tor argument is true
1256
1257 def testClose(self):
1258 class MockSocket:
1259 closed = False
1260 def flush(self): pass
1261 def close(self): self.closed = True
1262
1263 # must not close unless we request it: the original use of _fileobject
1264 # by module socket requires that the underlying socket not be closed until
1265 # the _socketobject that created the _fileobject is closed
1266 s = MockSocket()
1267 f = socket._fileobject(s)
1268 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001269 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001270
1271 s = MockSocket()
1272 f = socket._fileobject(s, close=True)
1273 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001274 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001275
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001276class TCPTimeoutTest(SocketTCPTest):
1277
1278 def testTCPTimeout(self):
1279 def raise_timeout(*args, **kwargs):
1280 self.serv.settimeout(1.0)
1281 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001282 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001283 "Error generating a timeout exception (TCP)")
1284
1285 def testTimeoutZero(self):
1286 ok = False
1287 try:
1288 self.serv.settimeout(0.0)
1289 foo = self.serv.accept()
1290 except socket.timeout:
1291 self.fail("caught timeout instead of error (TCP)")
1292 except socket.error:
1293 ok = True
1294 except:
1295 self.fail("caught unexpected exception (TCP)")
1296 if not ok:
1297 self.fail("accept() returned success when we did not expect it")
1298
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001299 def testInterruptedTimeout(self):
1300 # XXX I don't know how to do this test on MSWindows or any other
1301 # plaform that doesn't support signal.alarm() or os.kill(), though
1302 # the bug should have existed on all platforms.
1303 if not hasattr(signal, "alarm"):
1304 return # can only test on *nix
1305 self.serv.settimeout(5.0) # must be longer than alarm
1306 class Alarm(Exception):
1307 pass
1308 def alarm_handler(signal, frame):
1309 raise Alarm
1310 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1311 try:
1312 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1313 try:
1314 foo = self.serv.accept()
1315 except socket.timeout:
1316 self.fail("caught timeout instead of Alarm")
1317 except Alarm:
1318 pass
1319 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001320 self.fail("caught other exception instead of Alarm:"
1321 " %s(%s):\n%s" %
1322 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001323 else:
1324 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001325 finally:
1326 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001327 except Alarm:
1328 self.fail("got Alarm in wrong place")
1329 finally:
1330 # no alarm can be pending. Safe to restore old handler.
1331 signal.signal(signal.SIGALRM, old_alarm)
1332
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001333class UDPTimeoutTest(SocketTCPTest):
1334
1335 def testUDPTimeout(self):
1336 def raise_timeout(*args, **kwargs):
1337 self.serv.settimeout(1.0)
1338 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001339 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001340 "Error generating a timeout exception (UDP)")
1341
1342 def testTimeoutZero(self):
1343 ok = False
1344 try:
1345 self.serv.settimeout(0.0)
1346 foo = self.serv.recv(1024)
1347 except socket.timeout:
1348 self.fail("caught timeout instead of error (UDP)")
1349 except socket.error:
1350 ok = True
1351 except:
1352 self.fail("caught unexpected exception (UDP)")
1353 if not ok:
1354 self.fail("recv() returned success when we did not expect it")
1355
1356class TestExceptions(unittest.TestCase):
1357
1358 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001359 self.assertTrue(issubclass(socket.error, Exception))
1360 self.assertTrue(issubclass(socket.herror, socket.error))
1361 self.assertTrue(issubclass(socket.gaierror, socket.error))
1362 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001363
Armin Rigoa9017c32006-04-19 11:50:27 +00001364class TestLinuxAbstractNamespace(unittest.TestCase):
1365
1366 UNIX_PATH_MAX = 108
1367
1368 def testLinuxAbstractNamespace(self):
1369 address = "\x00python-test-hello\x00\xff"
1370 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1371 s1.bind(address)
1372 s1.listen(1)
1373 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1374 s2.connect(s1.getsockname())
1375 s1.accept()
1376 self.assertEqual(s1.getsockname(), address)
1377 self.assertEqual(s2.getpeername(), address)
1378
1379 def testMaxName(self):
1380 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1381 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1382 s.bind(address)
1383 self.assertEqual(s.getsockname(), address)
1384
1385 def testNameOverflow(self):
1386 address = "\x00" + "h" * self.UNIX_PATH_MAX
1387 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1388 self.assertRaises(socket.error, s.bind, address)
1389
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001390
Victor Stinner6a102812010-04-27 23:55:59 +00001391@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001392class BufferIOTest(SocketConnectedTest):
1393 """
1394 Test the buffer versions of socket.recv() and socket.send().
1395 """
1396 def __init__(self, methodName='runTest'):
1397 SocketConnectedTest.__init__(self, methodName=methodName)
1398
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001399 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001400 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001401 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001402 self.assertEqual(nbytes, len(MSG))
1403 msg = buf.tostring()[:len(MSG)]
1404 self.assertEqual(msg, MSG)
1405
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001406 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001407 with test_support.check_py3k_warnings():
1408 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001409 self.serv_conn.send(buf)
1410
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001411 def testRecvIntoBytearray(self):
1412 buf = bytearray(1024)
1413 nbytes = self.cli_conn.recv_into(buf)
1414 self.assertEqual(nbytes, len(MSG))
1415 msg = buf[:len(MSG)]
1416 self.assertEqual(msg, MSG)
1417
1418 _testRecvIntoBytearray = _testRecvIntoArray
1419
1420 def testRecvIntoMemoryview(self):
1421 buf = bytearray(1024)
1422 nbytes = self.cli_conn.recv_into(memoryview(buf))
1423 self.assertEqual(nbytes, len(MSG))
1424 msg = buf[:len(MSG)]
1425 self.assertEqual(msg, MSG)
1426
1427 _testRecvIntoMemoryview = _testRecvIntoArray
1428
1429 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001430 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001431 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001432 self.assertEqual(nbytes, len(MSG))
1433 msg = buf.tostring()[:len(MSG)]
1434 self.assertEqual(msg, MSG)
1435
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001436 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001437 with test_support.check_py3k_warnings():
1438 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001439 self.serv_conn.send(buf)
1440
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001441 def testRecvFromIntoBytearray(self):
1442 buf = bytearray(1024)
1443 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1444 self.assertEqual(nbytes, len(MSG))
1445 msg = buf[:len(MSG)]
1446 self.assertEqual(msg, MSG)
1447
1448 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1449
1450 def testRecvFromIntoMemoryview(self):
1451 buf = bytearray(1024)
1452 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1453 self.assertEqual(nbytes, len(MSG))
1454 msg = buf[:len(MSG)]
1455 self.assertEqual(msg, MSG)
1456
1457 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1458
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001459
1460TIPC_STYPE = 2000
1461TIPC_LOWER = 200
1462TIPC_UPPER = 210
1463
1464def isTipcAvailable():
1465 """Check if the TIPC module is loaded
1466
1467 The TIPC module is not loaded automatically on Ubuntu and probably
1468 other Linux distros.
1469 """
1470 if not hasattr(socket, "AF_TIPC"):
1471 return False
1472 if not os.path.isfile("/proc/modules"):
1473 return False
1474 with open("/proc/modules") as f:
1475 for line in f:
1476 if line.startswith("tipc "):
1477 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001478 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001479 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1480 return False
1481
1482class TIPCTest (unittest.TestCase):
1483 def testRDM(self):
1484 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1485 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1486
1487 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1488 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1489 TIPC_LOWER, TIPC_UPPER)
1490 srv.bind(srvaddr)
1491
1492 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1493 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1494 cli.sendto(MSG, sendaddr)
1495
1496 msg, recvaddr = srv.recvfrom(1024)
1497
1498 self.assertEqual(cli.getsockname(), recvaddr)
1499 self.assertEqual(msg, MSG)
1500
1501
1502class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1503 def __init__(self, methodName = 'runTest'):
1504 unittest.TestCase.__init__(self, methodName = methodName)
1505 ThreadableTest.__init__(self)
1506
1507 def setUp(self):
1508 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1509 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1510 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1511 TIPC_LOWER, TIPC_UPPER)
1512 self.srv.bind(srvaddr)
1513 self.srv.listen(5)
1514 self.serverExplicitReady()
1515 self.conn, self.connaddr = self.srv.accept()
1516
1517 def clientSetUp(self):
1518 # The is a hittable race between serverExplicitReady() and the
1519 # accept() call; sleep a little while to avoid it, otherwise
1520 # we could get an exception
1521 time.sleep(0.1)
1522 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1523 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1524 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1525 self.cli.connect(addr)
1526 self.cliaddr = self.cli.getsockname()
1527
1528 def testStream(self):
1529 msg = self.conn.recv(1024)
1530 self.assertEqual(msg, MSG)
1531 self.assertEqual(self.cliaddr, self.connaddr)
1532
1533 def _testStream(self):
1534 self.cli.send(MSG)
1535 self.cli.close()
1536
1537
Guido van Rossumb995eb72002-07-31 16:08:40 +00001538def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001539 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001540 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1541 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001542
1543 tests.extend([
1544 NonBlockingTCPTests,
1545 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001546 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001547 UnbufferedFileObjectClassTestCase,
1548 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001549 SmallBufferedFileObjectClassTestCase,
1550 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001551 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001552 NetworkConnectionAttributesTest,
1553 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001554 ])
Dave Cole331708b2004-08-09 04:51:41 +00001555 if hasattr(socket, "socketpair"):
1556 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001557 if sys.platform == 'linux2':
1558 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001559 if isTipcAvailable():
1560 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001561 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001562
1563 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001564 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001565 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001566
1567if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001568 test_main()