blob: 20076e456706389c8ac9c4faaab4ebabd4102ee3 [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)
Trent Nelsone41b0062008-04-08 23:47:30 +0000515 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000516 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000517 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
518 # it reasonable to get the host's addr in addition to 0.0.0.0.
519 # At least for eCos. This is required for the S/390 to pass.
520 my_ip_addr = socket.gethostbyname(socket.gethostname())
Ezio Melottiaa980582010-01-23 23:04:36 +0000521 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000522 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000523
524 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000525 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526 # We know a socket should start without reuse==0
527 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
528 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000529 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530
531 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000532 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
534 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
535 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000536 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000537
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000538 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000539 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000540 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
541 sock.settimeout(1)
542 sock.close()
543 self.assertRaises(socket.error, sock.send, "spam")
544
Georg Brandlbb03ac02006-03-21 18:17:25 +0000545 def testNewAttributes(self):
546 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000547 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000548 self.assertEqual(sock.family, socket.AF_INET)
549 self.assertEqual(sock.type, socket.SOCK_STREAM)
550 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000551 sock.close()
552
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000553 def test_getsockaddrarg(self):
554 host = '0.0.0.0'
555 port = self._get_unused_port(bind_address=host)
556 big_port = port + 65536
557 neg_port = port - 65536
558 sock = socket.socket()
559 try:
560 self.assertRaises(OverflowError, sock.bind, (host, big_port))
561 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
562 sock.bind((host, port))
563 finally:
564 sock.close()
565
Christian Heimesa47b75b2008-01-04 15:48:06 +0000566 def test_sock_ioctl(self):
567 if os.name != "nt":
568 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000569 self.assertTrue(hasattr(socket.socket, 'ioctl'))
570 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
571 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
572 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000573 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
574 s = socket.socket()
575 self.assertRaises(ValueError, s.ioctl, -1, None)
576 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000577
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000578 def testGetaddrinfo(self):
579 try:
580 socket.getaddrinfo('localhost', 80)
581 except socket.gaierror as err:
582 if err.errno == socket.EAI_SERVICE:
583 # see http://bugs.python.org/issue1282647
584 self.skipTest("buggy libc version")
585 raise
586 # len of every sequence is supposed to be == 5
587 for info in socket.getaddrinfo(HOST, None):
588 self.assertEqual(len(info), 5)
589 # host can be a domain name, a string representation of an
590 # IPv4/v6 address or None
591 socket.getaddrinfo('localhost', 80)
592 socket.getaddrinfo('127.0.0.1', 80)
593 socket.getaddrinfo(None, 80)
594 if SUPPORTS_IPV6:
595 socket.getaddrinfo('::1', 80)
596 # port can be a string service name such as "http", a numeric
597 # port number or None
598 socket.getaddrinfo(HOST, "http")
599 socket.getaddrinfo(HOST, 80)
600 socket.getaddrinfo(HOST, None)
601 # test family and socktype filters
602 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
603 for family, _, _, _, _ in infos:
604 self.assertEqual(family, socket.AF_INET)
605 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
606 for _, socktype, _, _, _ in infos:
607 self.assertEqual(socktype, socket.SOCK_STREAM)
608 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000609 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000610 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
611 # a server willing to support both IPv4 and IPv6 will
612 # usually do this
613 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
614 socket.AI_PASSIVE)
615
Christian Heimesa47b75b2008-01-04 15:48:06 +0000616
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000617 def check_sendall_interrupted(self, with_timeout):
618 # socketpair() is not stricly required, but it makes things easier.
619 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
620 self.skipTest("signal.alarm and socket.socketpair required for this test")
621 # Our signal handlers clobber the C errno by calling a math function
622 # with an invalid domain value.
623 def ok_handler(*args):
624 self.assertRaises(ValueError, math.acosh, 0)
625 def raising_handler(*args):
626 self.assertRaises(ValueError, math.acosh, 0)
627 1 // 0
628 c, s = socket.socketpair()
629 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
630 try:
631 if with_timeout:
632 # Just above the one second minimum for signal.alarm
633 c.settimeout(1.5)
634 with self.assertRaises(ZeroDivisionError):
635 signal.alarm(1)
636 c.sendall(b"x" * (1024**2))
637 if with_timeout:
638 signal.signal(signal.SIGALRM, ok_handler)
639 signal.alarm(1)
640 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
641 finally:
642 signal.signal(signal.SIGALRM, old_alarm)
643 c.close()
644 s.close()
645
646 def test_sendall_interrupted(self):
647 self.check_sendall_interrupted(False)
648
649 def test_sendall_interrupted_with_timeout(self):
650 self.check_sendall_interrupted(True)
651
652
Victor Stinner6a102812010-04-27 23:55:59 +0000653@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000654class BasicTCPTest(SocketConnectedTest):
655
656 def __init__(self, methodName='runTest'):
657 SocketConnectedTest.__init__(self, methodName=methodName)
658
659 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000660 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000662 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663
664 def _testRecv(self):
665 self.serv_conn.send(MSG)
666
667 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000668 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669 seg1 = self.cli_conn.recv(len(MSG) - 3)
670 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000671 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000672 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000673
674 def _testOverFlowRecv(self):
675 self.serv_conn.send(MSG)
676
677 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000678 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000680 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000681
682 def _testRecvFrom(self):
683 self.serv_conn.send(MSG)
684
685 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000686 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000687 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
688 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000689 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000690 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000691
692 def _testOverFlowRecvFrom(self):
693 self.serv_conn.send(MSG)
694
695 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000696 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000697 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000698 while 1:
699 read = self.cli_conn.recv(1024)
700 if not read:
701 break
Guido van Rossume531e292002-08-08 20:28:34 +0000702 msg += read
703 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000704
705 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000706 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707 self.serv_conn.sendall(big_chunk)
708
709 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000710 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000711 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000712 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000713 fd = self.cli_conn.fileno()
714 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
715 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000716 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000717
718 def _testFromFd(self):
719 self.serv_conn.send(MSG)
720
721 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000722 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000723 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000724 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000725 # wait for _testShutdown to finish: on OS X, when the server
726 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000727 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000728 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729
730 def _testShutdown(self):
731 self.serv_conn.send(MSG)
732 self.serv_conn.shutdown(2)
733
Victor Stinner6a102812010-04-27 23:55:59 +0000734@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735class BasicUDPTest(ThreadedUDPSocketTest):
736
737 def __init__(self, methodName='runTest'):
738 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
739
740 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000741 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000742 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000743 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000744
745 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000746 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747
Guido van Rossum1c938012002-06-12 21:17:20 +0000748 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000749 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000751 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000752
Guido van Rossum1c938012002-06-12 21:17:20 +0000753 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000754 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755
Facundo Batista1fe9f962007-03-28 03:45:20 +0000756 def testRecvFromNegative(self):
757 # Negative lengths passed to recvfrom should give ValueError.
758 self.assertRaises(ValueError, self.serv.recvfrom, -1)
759
760 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000761 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000762
Victor Stinner6a102812010-04-27 23:55:59 +0000763@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000764class TCPCloserTest(ThreadedTCPSocketTest):
765
766 def testClose(self):
767 conn, addr = self.serv.accept()
768 conn.close()
769
770 sd = self.cli
771 read, write, err = select.select([sd], [], [], 1.0)
772 self.assertEqual(read, [sd])
773 self.assertEqual(sd.recv(1), '')
774
775 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000776 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000777 time.sleep(1.0)
778
Victor Stinner6a102812010-04-27 23:55:59 +0000779@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000780class BasicSocketPairTest(SocketPairTest):
781
782 def __init__(self, methodName='runTest'):
783 SocketPairTest.__init__(self, methodName=methodName)
784
785 def testRecv(self):
786 msg = self.serv.recv(1024)
787 self.assertEqual(msg, MSG)
788
789 def _testRecv(self):
790 self.cli.send(MSG)
791
792 def testSend(self):
793 self.serv.send(MSG)
794
795 def _testSend(self):
796 msg = self.cli.recv(1024)
797 self.assertEqual(msg, MSG)
798
Victor Stinner6a102812010-04-27 23:55:59 +0000799@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800class NonBlockingTCPTests(ThreadedTCPSocketTest):
801
802 def __init__(self, methodName='runTest'):
803 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
804
805 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000806 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000807 self.serv.setblocking(0)
808 start = time.time()
809 try:
810 self.serv.accept()
811 except socket.error:
812 pass
813 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000814 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000815
816 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000817 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000818
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000820 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000822 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823 conn, addr = self.serv.accept()
824 except socket.error:
825 pass
826 else:
827 self.fail("Error trying to do non-blocking accept.")
828 read, write, err = select.select([self.serv], [], [])
829 if self.serv in read:
830 conn, addr = self.serv.accept()
831 else:
832 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000833
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000835 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000836 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000837
838 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000839 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840 conn, addr = self.serv.accept()
841
842 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000843 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000844 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000845
846 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000847 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848 conn, addr = self.serv.accept()
849 conn.setblocking(0)
850 try:
851 msg = conn.recv(len(MSG))
852 except socket.error:
853 pass
854 else:
855 self.fail("Error trying to do non-blocking recv.")
856 read, write, err = select.select([conn], [], [])
857 if conn in read:
858 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000859 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860 else:
861 self.fail("Error during select call to non-blocking socket.")
862
863 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000864 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000865 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 self.cli.send(MSG)
867
Victor Stinner6a102812010-04-27 23:55:59 +0000868@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869class FileObjectClassTestCase(SocketConnectedTest):
870
Guido van Rossume9f66142002-08-07 15:46:19 +0000871 bufsize = -1 # Use default buffer size
872
Guido van Rossum24e4af82002-06-12 19:18:08 +0000873 def __init__(self, methodName='runTest'):
874 SocketConnectedTest.__init__(self, methodName=methodName)
875
876 def setUp(self):
877 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000878 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879
880 def tearDown(self):
881 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000882 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000883 self.serv_file = None
884 SocketConnectedTest.tearDown(self)
885
886 def clientSetUp(self):
887 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000888 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889
890 def clientTearDown(self):
891 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000892 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893 self.cli_file = None
894 SocketConnectedTest.clientTearDown(self)
895
896 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000897 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000898 first_seg = self.serv_file.read(len(MSG)-3)
899 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000900 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000901 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000902
903 def _testSmallRead(self):
904 self.cli_file.write(MSG)
905 self.cli_file.flush()
906
Guido van Rossum8c943832002-08-08 01:00:28 +0000907 def testFullRead(self):
908 # read until EOF
909 msg = self.serv_file.read()
910 self.assertEqual(msg, MSG)
911
912 def _testFullRead(self):
913 self.cli_file.write(MSG)
914 self.cli_file.close()
915
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000917 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000918 buf = ''
919 while 1:
920 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000921 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000923 buf += char
924 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000925
926 def _testUnbufferedRead(self):
927 self.cli_file.write(MSG)
928 self.cli_file.flush()
929
930 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000931 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000933 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934
935 def _testReadline(self):
936 self.cli_file.write(MSG)
937 self.cli_file.flush()
938
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000939 def testReadlineAfterRead(self):
940 a_baloo_is = self.serv_file.read(len("A baloo is"))
941 self.assertEqual("A baloo is", a_baloo_is)
942 _a_bear = self.serv_file.read(len(" a bear"))
943 self.assertEqual(" a bear", _a_bear)
944 line = self.serv_file.readline()
945 self.assertEqual("\n", line)
946 line = self.serv_file.readline()
947 self.assertEqual("A BALOO IS A BEAR.\n", line)
948 line = self.serv_file.readline()
949 self.assertEqual(MSG, line)
950
951 def _testReadlineAfterRead(self):
952 self.cli_file.write("A baloo is a bear\n")
953 self.cli_file.write("A BALOO IS A BEAR.\n")
954 self.cli_file.write(MSG)
955 self.cli_file.flush()
956
957 def testReadlineAfterReadNoNewline(self):
958 end_of_ = self.serv_file.read(len("End Of "))
959 self.assertEqual("End Of ", end_of_)
960 line = self.serv_file.readline()
961 self.assertEqual("Line", line)
962
963 def _testReadlineAfterReadNoNewline(self):
964 self.cli_file.write("End Of Line")
965
Tim Peters116d83c2004-03-28 02:20:45 +0000966 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000967 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000968
969 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000970 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000971
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000972
973class FileObjectInterruptedTestCase(unittest.TestCase):
974 """Test that the file object correctly handles EINTR internally."""
975
976 class MockSocket(object):
977 def __init__(self, recv_funcs=()):
978 # A generator that returns callables that we'll call for each
979 # call to recv().
980 self._recv_step = iter(recv_funcs)
981
982 def recv(self, size):
983 return self._recv_step.next()()
984
985 @staticmethod
986 def _raise_eintr():
987 raise socket.error(errno.EINTR)
988
989 def _test_readline(self, size=-1, **kwargs):
990 mock_sock = self.MockSocket(recv_funcs=[
991 lambda : "This is the first line\nAnd the sec",
992 self._raise_eintr,
993 lambda : "ond line is here\n",
994 lambda : "",
995 ])
996 fo = socket._fileobject(mock_sock, **kwargs)
997 self.assertEquals(fo.readline(size), "This is the first line\n")
998 self.assertEquals(fo.readline(size), "And the second line is here\n")
999
1000 def _test_read(self, size=-1, **kwargs):
1001 mock_sock = self.MockSocket(recv_funcs=[
1002 lambda : "This is the first line\nAnd the sec",
1003 self._raise_eintr,
1004 lambda : "ond line is here\n",
1005 lambda : "",
1006 ])
1007 fo = socket._fileobject(mock_sock, **kwargs)
1008 self.assertEquals(fo.read(size), "This is the first line\n"
1009 "And the second line is here\n")
1010
1011 def test_default(self):
1012 self._test_readline()
1013 self._test_readline(size=100)
1014 self._test_read()
1015 self._test_read(size=100)
1016
1017 def test_with_1k_buffer(self):
1018 self._test_readline(bufsize=1024)
1019 self._test_readline(size=100, bufsize=1024)
1020 self._test_read(bufsize=1024)
1021 self._test_read(size=100, bufsize=1024)
1022
1023 def _test_readline_no_buffer(self, size=-1):
1024 mock_sock = self.MockSocket(recv_funcs=[
1025 lambda : "aa",
1026 lambda : "\n",
1027 lambda : "BB",
1028 self._raise_eintr,
1029 lambda : "bb",
1030 lambda : "",
1031 ])
1032 fo = socket._fileobject(mock_sock, bufsize=0)
1033 self.assertEquals(fo.readline(size), "aa\n")
1034 self.assertEquals(fo.readline(size), "BBbb")
1035
1036 def test_no_buffer(self):
1037 self._test_readline_no_buffer()
1038 self._test_readline_no_buffer(size=4)
1039 self._test_read(bufsize=0)
1040 self._test_read(size=100, bufsize=0)
1041
1042
Guido van Rossume9f66142002-08-07 15:46:19 +00001043class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1044
1045 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001046
Guido van Rossume9f66142002-08-07 15:46:19 +00001047 In this case (and in this case only), it should be possible to
1048 create a file object, read a line from it, create another file
1049 object, read another line from it, without loss of data in the
1050 first file object's buffer. Note that httplib relies on this
1051 when reading multiple requests from the same socket."""
1052
1053 bufsize = 0 # Use unbuffered mode
1054
1055 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001056 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001057 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001058 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001059 self.serv_file = self.cli_conn.makefile('rb', 0)
1060 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001061 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001062
1063 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001064 self.cli_file.write("A. " + MSG)
1065 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001066 self.cli_file.flush()
1067
Guido van Rossum8c943832002-08-08 01:00:28 +00001068class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1069
1070 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1071
1072
1073class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1074
1075 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001076
Georg Brandldd7b0522007-01-21 10:35:10 +00001077
Facundo Batista07c78be2007-03-23 18:54:07 +00001078class NetworkConnectionTest(object):
1079 """Prove network connection."""
1080 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001081 # We're inherited below by BasicTCPTest2, which also inherits
1082 # BasicTCPTest, which defines self.port referenced below.
1083 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001084 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001085
Facundo Batista07c78be2007-03-23 18:54:07 +00001086class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1087 """Tests that NetworkConnection does not break existing TCP functionality.
1088 """
1089
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001090class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001091 class MockSocket(socket.socket):
1092 def connect(self, *args):
1093 raise socket.timeout('timed out')
1094
1095 @contextlib.contextmanager
1096 def mocked_socket_module(self):
1097 """Return a socket which times out on connect"""
1098 old_socket = socket.socket
1099 socket.socket = self.MockSocket
1100 try:
1101 yield
1102 finally:
1103 socket.socket = old_socket
1104
1105 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001106 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001107 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1108 with self.assertRaises(socket.error) as cm:
1109 cli.connect((HOST, port))
1110 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1111
1112 def test_create_connection(self):
1113 # Issue #9792: errors raised by create_connection() should have
1114 # a proper errno attribute.
1115 port = test_support.find_unused_port()
1116 with self.assertRaises(socket.error) as cm:
1117 socket.create_connection((HOST, port))
1118 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1119
1120 def test_create_connection_timeout(self):
1121 # Issue #9792: create_connection() should not recast timeout errors
1122 # as generic socket errors.
1123 with self.mocked_socket_module():
1124 with self.assertRaises(socket.timeout):
1125 socket.create_connection((HOST, 1234))
1126
Facundo Batista07c78be2007-03-23 18:54:07 +00001127
Victor Stinner6a102812010-04-27 23:55:59 +00001128@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001129class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1130
1131 def __init__(self, methodName='runTest'):
1132 SocketTCPTest.__init__(self, methodName=methodName)
1133 ThreadableTest.__init__(self)
1134
1135 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001136 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001137
1138 def clientTearDown(self):
1139 self.cli.close()
1140 self.cli = None
1141 ThreadableTest.clientTearDown(self)
1142
1143 def _justAccept(self):
1144 conn, addr = self.serv.accept()
1145
1146 testFamily = _justAccept
1147 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001148 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001149 self.assertEqual(self.cli.family, 2)
1150
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001151 testSourceAddress = _justAccept
1152 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001153 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1154 source_address=('', self.source_port))
1155 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001156 # The port number being used is sufficient to show that the bind()
1157 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001158
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001159 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001160 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001161 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001162 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001163 socket.setdefaulttimeout(42)
1164 try:
1165 self.cli = socket.create_connection((HOST, self.port))
1166 finally:
1167 socket.setdefaulttimeout(None)
1168 self.assertEquals(self.cli.gettimeout(), 42)
1169
1170 testTimeoutNone = _justAccept
1171 def _testTimeoutNone(self):
1172 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001173 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001174 socket.setdefaulttimeout(30)
1175 try:
1176 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1177 finally:
1178 socket.setdefaulttimeout(None)
1179 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001180
1181 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001182 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001183 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001184 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001185
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001186 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001187 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001188 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001189 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001190
Victor Stinner6a102812010-04-27 23:55:59 +00001191@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001192class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1193
1194 def __init__(self, methodName='runTest'):
1195 SocketTCPTest.__init__(self, methodName=methodName)
1196 ThreadableTest.__init__(self)
1197
1198 def clientSetUp(self):
1199 pass
1200
1201 def clientTearDown(self):
1202 self.cli.close()
1203 self.cli = None
1204 ThreadableTest.clientTearDown(self)
1205
Facundo Batista07c78be2007-03-23 18:54:07 +00001206 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001207 conn, addr = self.serv.accept()
1208 time.sleep(3)
1209 conn.send("done!")
1210 testOutsideTimeout = testInsideTimeout
1211
1212 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001213 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001214 data = sock.recv(5)
1215 self.assertEqual(data, "done!")
1216
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001217 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001218 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001219 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001220
1221
Georg Brandldd7b0522007-01-21 10:35:10 +00001222class Urllib2FileobjectTest(unittest.TestCase):
1223
1224 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1225 # it close the socket if the close c'tor argument is true
1226
1227 def testClose(self):
1228 class MockSocket:
1229 closed = False
1230 def flush(self): pass
1231 def close(self): self.closed = True
1232
1233 # must not close unless we request it: the original use of _fileobject
1234 # by module socket requires that the underlying socket not be closed until
1235 # the _socketobject that created the _fileobject is closed
1236 s = MockSocket()
1237 f = socket._fileobject(s)
1238 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001239 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001240
1241 s = MockSocket()
1242 f = socket._fileobject(s, close=True)
1243 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001244 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001245
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001246class TCPTimeoutTest(SocketTCPTest):
1247
1248 def testTCPTimeout(self):
1249 def raise_timeout(*args, **kwargs):
1250 self.serv.settimeout(1.0)
1251 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001252 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001253 "Error generating a timeout exception (TCP)")
1254
1255 def testTimeoutZero(self):
1256 ok = False
1257 try:
1258 self.serv.settimeout(0.0)
1259 foo = self.serv.accept()
1260 except socket.timeout:
1261 self.fail("caught timeout instead of error (TCP)")
1262 except socket.error:
1263 ok = True
1264 except:
1265 self.fail("caught unexpected exception (TCP)")
1266 if not ok:
1267 self.fail("accept() returned success when we did not expect it")
1268
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001269 def testInterruptedTimeout(self):
1270 # XXX I don't know how to do this test on MSWindows or any other
1271 # plaform that doesn't support signal.alarm() or os.kill(), though
1272 # the bug should have existed on all platforms.
1273 if not hasattr(signal, "alarm"):
1274 return # can only test on *nix
1275 self.serv.settimeout(5.0) # must be longer than alarm
1276 class Alarm(Exception):
1277 pass
1278 def alarm_handler(signal, frame):
1279 raise Alarm
1280 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1281 try:
1282 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1283 try:
1284 foo = self.serv.accept()
1285 except socket.timeout:
1286 self.fail("caught timeout instead of Alarm")
1287 except Alarm:
1288 pass
1289 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001290 self.fail("caught other exception instead of Alarm:"
1291 " %s(%s):\n%s" %
1292 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001293 else:
1294 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001295 finally:
1296 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001297 except Alarm:
1298 self.fail("got Alarm in wrong place")
1299 finally:
1300 # no alarm can be pending. Safe to restore old handler.
1301 signal.signal(signal.SIGALRM, old_alarm)
1302
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001303class UDPTimeoutTest(SocketTCPTest):
1304
1305 def testUDPTimeout(self):
1306 def raise_timeout(*args, **kwargs):
1307 self.serv.settimeout(1.0)
1308 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001309 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001310 "Error generating a timeout exception (UDP)")
1311
1312 def testTimeoutZero(self):
1313 ok = False
1314 try:
1315 self.serv.settimeout(0.0)
1316 foo = self.serv.recv(1024)
1317 except socket.timeout:
1318 self.fail("caught timeout instead of error (UDP)")
1319 except socket.error:
1320 ok = True
1321 except:
1322 self.fail("caught unexpected exception (UDP)")
1323 if not ok:
1324 self.fail("recv() returned success when we did not expect it")
1325
1326class TestExceptions(unittest.TestCase):
1327
1328 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001329 self.assertTrue(issubclass(socket.error, Exception))
1330 self.assertTrue(issubclass(socket.herror, socket.error))
1331 self.assertTrue(issubclass(socket.gaierror, socket.error))
1332 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001333
Armin Rigoa9017c32006-04-19 11:50:27 +00001334class TestLinuxAbstractNamespace(unittest.TestCase):
1335
1336 UNIX_PATH_MAX = 108
1337
1338 def testLinuxAbstractNamespace(self):
1339 address = "\x00python-test-hello\x00\xff"
1340 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1341 s1.bind(address)
1342 s1.listen(1)
1343 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1344 s2.connect(s1.getsockname())
1345 s1.accept()
1346 self.assertEqual(s1.getsockname(), address)
1347 self.assertEqual(s2.getpeername(), address)
1348
1349 def testMaxName(self):
1350 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1351 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1352 s.bind(address)
1353 self.assertEqual(s.getsockname(), address)
1354
1355 def testNameOverflow(self):
1356 address = "\x00" + "h" * self.UNIX_PATH_MAX
1357 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1358 self.assertRaises(socket.error, s.bind, address)
1359
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001360
Victor Stinner6a102812010-04-27 23:55:59 +00001361@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001362class BufferIOTest(SocketConnectedTest):
1363 """
1364 Test the buffer versions of socket.recv() and socket.send().
1365 """
1366 def __init__(self, methodName='runTest'):
1367 SocketConnectedTest.__init__(self, methodName=methodName)
1368
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001369 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001370 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001371 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001372 self.assertEqual(nbytes, len(MSG))
1373 msg = buf.tostring()[:len(MSG)]
1374 self.assertEqual(msg, MSG)
1375
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001376 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001377 with test_support.check_py3k_warnings():
1378 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001379 self.serv_conn.send(buf)
1380
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001381 def testRecvIntoBytearray(self):
1382 buf = bytearray(1024)
1383 nbytes = self.cli_conn.recv_into(buf)
1384 self.assertEqual(nbytes, len(MSG))
1385 msg = buf[:len(MSG)]
1386 self.assertEqual(msg, MSG)
1387
1388 _testRecvIntoBytearray = _testRecvIntoArray
1389
1390 def testRecvIntoMemoryview(self):
1391 buf = bytearray(1024)
1392 nbytes = self.cli_conn.recv_into(memoryview(buf))
1393 self.assertEqual(nbytes, len(MSG))
1394 msg = buf[:len(MSG)]
1395 self.assertEqual(msg, MSG)
1396
1397 _testRecvIntoMemoryview = _testRecvIntoArray
1398
1399 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001400 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001401 nbytes, addr = self.cli_conn.recvfrom_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 _testRecvFromIntoArray(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 testRecvFromIntoBytearray(self):
1412 buf = bytearray(1024)
1413 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1414 self.assertEqual(nbytes, len(MSG))
1415 msg = buf[:len(MSG)]
1416 self.assertEqual(msg, MSG)
1417
1418 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1419
1420 def testRecvFromIntoMemoryview(self):
1421 buf = bytearray(1024)
1422 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1423 self.assertEqual(nbytes, len(MSG))
1424 msg = buf[:len(MSG)]
1425 self.assertEqual(msg, MSG)
1426
1427 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1428
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001429
1430TIPC_STYPE = 2000
1431TIPC_LOWER = 200
1432TIPC_UPPER = 210
1433
1434def isTipcAvailable():
1435 """Check if the TIPC module is loaded
1436
1437 The TIPC module is not loaded automatically on Ubuntu and probably
1438 other Linux distros.
1439 """
1440 if not hasattr(socket, "AF_TIPC"):
1441 return False
1442 if not os.path.isfile("/proc/modules"):
1443 return False
1444 with open("/proc/modules") as f:
1445 for line in f:
1446 if line.startswith("tipc "):
1447 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001448 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001449 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1450 return False
1451
1452class TIPCTest (unittest.TestCase):
1453 def testRDM(self):
1454 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1455 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1456
1457 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1458 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1459 TIPC_LOWER, TIPC_UPPER)
1460 srv.bind(srvaddr)
1461
1462 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1463 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1464 cli.sendto(MSG, sendaddr)
1465
1466 msg, recvaddr = srv.recvfrom(1024)
1467
1468 self.assertEqual(cli.getsockname(), recvaddr)
1469 self.assertEqual(msg, MSG)
1470
1471
1472class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1473 def __init__(self, methodName = 'runTest'):
1474 unittest.TestCase.__init__(self, methodName = methodName)
1475 ThreadableTest.__init__(self)
1476
1477 def setUp(self):
1478 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1479 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1480 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1481 TIPC_LOWER, TIPC_UPPER)
1482 self.srv.bind(srvaddr)
1483 self.srv.listen(5)
1484 self.serverExplicitReady()
1485 self.conn, self.connaddr = self.srv.accept()
1486
1487 def clientSetUp(self):
1488 # The is a hittable race between serverExplicitReady() and the
1489 # accept() call; sleep a little while to avoid it, otherwise
1490 # we could get an exception
1491 time.sleep(0.1)
1492 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1493 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1494 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1495 self.cli.connect(addr)
1496 self.cliaddr = self.cli.getsockname()
1497
1498 def testStream(self):
1499 msg = self.conn.recv(1024)
1500 self.assertEqual(msg, MSG)
1501 self.assertEqual(self.cliaddr, self.connaddr)
1502
1503 def _testStream(self):
1504 self.cli.send(MSG)
1505 self.cli.close()
1506
1507
Guido van Rossumb995eb72002-07-31 16:08:40 +00001508def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001509 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001510 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1511 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001512
1513 tests.extend([
1514 NonBlockingTCPTests,
1515 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001516 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001517 UnbufferedFileObjectClassTestCase,
1518 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001519 SmallBufferedFileObjectClassTestCase,
1520 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001521 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001522 NetworkConnectionAttributesTest,
1523 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001524 ])
Dave Cole331708b2004-08-09 04:51:41 +00001525 if hasattr(socket, "socketpair"):
1526 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001527 if sys.platform == 'linux2':
1528 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001529 if isTipcAvailable():
1530 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001531 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001532
1533 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001534 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001535 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001536
1537if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001538 test_main()