blob: 37756b145daa627b3ef5bb2dfec7b76dc9c5c369 [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.
Brett Cannon08febeb2004-11-20 21:10:07 +0000354 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000355 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000356 # avoid the 'echo' service on this platform, as there is an
357 # assumption breaking non-standard port/protocol entry
358 services = ('daytime', 'qotd', 'domain')
359 else:
360 services = ('echo', 'daytime', 'domain')
361 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000362 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000363 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000364 break
365 except socket.error:
366 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000367 else:
368 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000369 # Try same call with optional protocol omitted
370 port2 = socket.getservbyname(service)
371 eq(port, port2)
372 # Try udp, but don't barf it it doesn't exist
373 try:
374 udpport = socket.getservbyname(service, 'udp')
375 except socket.error:
376 udpport = None
377 else:
378 eq(udpport, port)
379 # Now make sure the lookup by port returns the same service name
380 eq(socket.getservbyport(port2), service)
381 eq(socket.getservbyport(port, 'tcp'), service)
382 if udpport is not None:
383 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000384 # Make sure getservbyport does not accept out of range ports.
385 self.assertRaises(OverflowError, socket.getservbyport, -1)
386 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000387
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000388 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000389 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000390 # The default timeout should initially be None
391 self.assertEqual(socket.getdefaulttimeout(), None)
392 s = socket.socket()
393 self.assertEqual(s.gettimeout(), None)
394 s.close()
395
396 # Set the default timeout to 10, and see if it propagates
397 socket.setdefaulttimeout(10)
398 self.assertEqual(socket.getdefaulttimeout(), 10)
399 s = socket.socket()
400 self.assertEqual(s.gettimeout(), 10)
401 s.close()
402
403 # Reset the default timeout to None, and see if it propagates
404 socket.setdefaulttimeout(None)
405 self.assertEqual(socket.getdefaulttimeout(), None)
406 s = socket.socket()
407 self.assertEqual(s.gettimeout(), None)
408 s.close()
409
410 # Check that setting it to an invalid value raises ValueError
411 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
412
413 # Check that setting it to an invalid type raises TypeError
414 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
415
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000416 def testIPv4_inet_aton_fourbytes(self):
417 if not hasattr(socket, 'inet_aton'):
418 return # No inet_aton, nothing to check
419 # Test that issue1008086 and issue767150 are fixed.
420 # It must return 4 bytes.
421 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
422 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
423
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000424 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000425 if not hasattr(socket, 'inet_pton'):
426 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000427 from socket import inet_aton as f, inet_pton, AF_INET
428 g = lambda a: inet_pton(AF_INET, a)
429
430 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
431 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
432 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
433 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000434 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000435
436 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
437 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
438 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000439 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000440
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000441 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000442 if not hasattr(socket, 'inet_pton'):
443 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000444 try:
445 from socket import inet_pton, AF_INET6, has_ipv6
446 if not has_ipv6:
447 return
448 except ImportError:
449 return
450 f = lambda a: inet_pton(AF_INET6, a)
451
452 self.assertEquals('\x00' * 16, f('::'))
453 self.assertEquals('\x00' * 16, f('0::0'))
454 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
455 self.assertEquals(
456 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
457 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
458 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000459
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000460 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000461 if not hasattr(socket, 'inet_ntop'):
462 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000463 from socket import inet_ntoa as f, inet_ntop, AF_INET
464 g = lambda a: inet_ntop(AF_INET, a)
465
466 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
467 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
468 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
469 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000470
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000471 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
472 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
473 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
474
475 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000476 if not hasattr(socket, 'inet_ntop'):
477 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000478 try:
479 from socket import inet_ntop, AF_INET6, has_ipv6
480 if not has_ipv6:
481 return
482 except ImportError:
483 return
484 f = lambda a: inet_ntop(AF_INET6, a)
485
486 self.assertEquals('::', f('\x00' * 16))
487 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
488 self.assertEquals(
489 'aef:b01:506:1001:ffff:9997:55:170',
490 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
491 )
492
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000493 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000494
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000495 def _get_unused_port(self, bind_address='0.0.0.0'):
496 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000497
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000498 Args:
499 bind_address: Hostname or IP address to search for a port on.
500
501 Returns: A most likely to be unused port.
502 """
503 tempsock = socket.socket()
504 tempsock.bind((bind_address, 0))
505 host, port = tempsock.getsockname()
506 tempsock.close()
507 return port
508
509 def testSockName(self):
510 # Testing getsockname()
511 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +0000513 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000514 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000515 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
516 # it reasonable to get the host's addr in addition to 0.0.0.0.
517 # At least for eCos. This is required for the S/390 to pass.
518 my_ip_addr = socket.gethostbyname(socket.gethostname())
Ezio Melottiaa980582010-01-23 23:04:36 +0000519 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000520 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521
522 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000523 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000524 # We know a socket should start without reuse==0
525 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
526 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000527 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000528
529 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000530 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
532 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
533 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000534 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000536 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000537 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000538 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
539 sock.settimeout(1)
540 sock.close()
541 self.assertRaises(socket.error, sock.send, "spam")
542
Georg Brandlbb03ac02006-03-21 18:17:25 +0000543 def testNewAttributes(self):
544 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000545 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000546 self.assertEqual(sock.family, socket.AF_INET)
547 self.assertEqual(sock.type, socket.SOCK_STREAM)
548 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000549 sock.close()
550
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000551 def test_getsockaddrarg(self):
552 host = '0.0.0.0'
553 port = self._get_unused_port(bind_address=host)
554 big_port = port + 65536
555 neg_port = port - 65536
556 sock = socket.socket()
557 try:
558 self.assertRaises(OverflowError, sock.bind, (host, big_port))
559 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
560 sock.bind((host, port))
561 finally:
562 sock.close()
563
Christian Heimesa47b75b2008-01-04 15:48:06 +0000564 def test_sock_ioctl(self):
565 if os.name != "nt":
566 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000567 self.assertTrue(hasattr(socket.socket, 'ioctl'))
568 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
569 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
570 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000571 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
572 s = socket.socket()
573 self.assertRaises(ValueError, s.ioctl, -1, None)
574 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000575
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000576 def testGetaddrinfo(self):
577 try:
578 socket.getaddrinfo('localhost', 80)
579 except socket.gaierror as err:
580 if err.errno == socket.EAI_SERVICE:
581 # see http://bugs.python.org/issue1282647
582 self.skipTest("buggy libc version")
583 raise
584 # len of every sequence is supposed to be == 5
585 for info in socket.getaddrinfo(HOST, None):
586 self.assertEqual(len(info), 5)
587 # host can be a domain name, a string representation of an
588 # IPv4/v6 address or None
589 socket.getaddrinfo('localhost', 80)
590 socket.getaddrinfo('127.0.0.1', 80)
591 socket.getaddrinfo(None, 80)
592 if SUPPORTS_IPV6:
593 socket.getaddrinfo('::1', 80)
594 # port can be a string service name such as "http", a numeric
595 # port number or None
596 socket.getaddrinfo(HOST, "http")
597 socket.getaddrinfo(HOST, 80)
598 socket.getaddrinfo(HOST, None)
599 # test family and socktype filters
600 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
601 for family, _, _, _, _ in infos:
602 self.assertEqual(family, socket.AF_INET)
603 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
604 for _, socktype, _, _, _ in infos:
605 self.assertEqual(socktype, socket.SOCK_STREAM)
606 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000607 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000608 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
609 # a server willing to support both IPv4 and IPv6 will
610 # usually do this
611 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
612 socket.AI_PASSIVE)
613
Christian Heimesa47b75b2008-01-04 15:48:06 +0000614
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000615 def check_sendall_interrupted(self, with_timeout):
616 # socketpair() is not stricly required, but it makes things easier.
617 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
618 self.skipTest("signal.alarm and socket.socketpair required for this test")
619 # Our signal handlers clobber the C errno by calling a math function
620 # with an invalid domain value.
621 def ok_handler(*args):
622 self.assertRaises(ValueError, math.acosh, 0)
623 def raising_handler(*args):
624 self.assertRaises(ValueError, math.acosh, 0)
625 1 // 0
626 c, s = socket.socketpair()
627 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
628 try:
629 if with_timeout:
630 # Just above the one second minimum for signal.alarm
631 c.settimeout(1.5)
632 with self.assertRaises(ZeroDivisionError):
633 signal.alarm(1)
634 c.sendall(b"x" * (1024**2))
635 if with_timeout:
636 signal.signal(signal.SIGALRM, ok_handler)
637 signal.alarm(1)
638 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
639 finally:
640 signal.signal(signal.SIGALRM, old_alarm)
641 c.close()
642 s.close()
643
644 def test_sendall_interrupted(self):
645 self.check_sendall_interrupted(False)
646
647 def test_sendall_interrupted_with_timeout(self):
648 self.check_sendall_interrupted(True)
649
650
Victor Stinner6a102812010-04-27 23:55:59 +0000651@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000652class BasicTCPTest(SocketConnectedTest):
653
654 def __init__(self, methodName='runTest'):
655 SocketConnectedTest.__init__(self, methodName=methodName)
656
657 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000658 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000660 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661
662 def _testRecv(self):
663 self.serv_conn.send(MSG)
664
665 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000666 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667 seg1 = self.cli_conn.recv(len(MSG) - 3)
668 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000669 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000670 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000671
672 def _testOverFlowRecv(self):
673 self.serv_conn.send(MSG)
674
675 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000676 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000677 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000678 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679
680 def _testRecvFrom(self):
681 self.serv_conn.send(MSG)
682
683 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000684 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
686 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000687 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000688 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689
690 def _testOverFlowRecvFrom(self):
691 self.serv_conn.send(MSG)
692
693 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000694 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000695 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696 while 1:
697 read = self.cli_conn.recv(1024)
698 if not read:
699 break
Guido van Rossume531e292002-08-08 20:28:34 +0000700 msg += read
701 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000702
703 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000704 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705 self.serv_conn.sendall(big_chunk)
706
707 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000708 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000709 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000710 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 fd = self.cli_conn.fileno()
712 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
713 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000714 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715
716 def _testFromFd(self):
717 self.serv_conn.send(MSG)
718
719 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000720 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000722 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000723 # wait for _testShutdown to finish: on OS X, when the server
724 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000725 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000726 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727
728 def _testShutdown(self):
729 self.serv_conn.send(MSG)
730 self.serv_conn.shutdown(2)
731
Victor Stinner6a102812010-04-27 23:55:59 +0000732@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733class BasicUDPTest(ThreadedUDPSocketTest):
734
735 def __init__(self, methodName='runTest'):
736 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
737
738 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000739 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000741 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000742
743 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000744 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000745
Guido van Rossum1c938012002-06-12 21:17:20 +0000746 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000747 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000749 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750
Guido van Rossum1c938012002-06-12 21:17:20 +0000751 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000752 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753
Facundo Batista1fe9f962007-03-28 03:45:20 +0000754 def testRecvFromNegative(self):
755 # Negative lengths passed to recvfrom should give ValueError.
756 self.assertRaises(ValueError, self.serv.recvfrom, -1)
757
758 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000759 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000760
Victor Stinner6a102812010-04-27 23:55:59 +0000761@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000762class TCPCloserTest(ThreadedTCPSocketTest):
763
764 def testClose(self):
765 conn, addr = self.serv.accept()
766 conn.close()
767
768 sd = self.cli
769 read, write, err = select.select([sd], [], [], 1.0)
770 self.assertEqual(read, [sd])
771 self.assertEqual(sd.recv(1), '')
772
773 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000774 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000775 time.sleep(1.0)
776
Victor Stinner6a102812010-04-27 23:55:59 +0000777@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000778class BasicSocketPairTest(SocketPairTest):
779
780 def __init__(self, methodName='runTest'):
781 SocketPairTest.__init__(self, methodName=methodName)
782
783 def testRecv(self):
784 msg = self.serv.recv(1024)
785 self.assertEqual(msg, MSG)
786
787 def _testRecv(self):
788 self.cli.send(MSG)
789
790 def testSend(self):
791 self.serv.send(MSG)
792
793 def _testSend(self):
794 msg = self.cli.recv(1024)
795 self.assertEqual(msg, MSG)
796
Victor Stinner6a102812010-04-27 23:55:59 +0000797@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798class NonBlockingTCPTests(ThreadedTCPSocketTest):
799
800 def __init__(self, methodName='runTest'):
801 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
802
803 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000804 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000805 self.serv.setblocking(0)
806 start = time.time()
807 try:
808 self.serv.accept()
809 except socket.error:
810 pass
811 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000812 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813
814 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000815 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000816
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000818 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000820 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 conn, addr = self.serv.accept()
822 except socket.error:
823 pass
824 else:
825 self.fail("Error trying to do non-blocking accept.")
826 read, write, err = select.select([self.serv], [], [])
827 if self.serv in read:
828 conn, addr = self.serv.accept()
829 else:
830 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000831
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000833 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000834 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000835
836 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000837 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 conn, addr = self.serv.accept()
839
840 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000841 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000842 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000843
844 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000845 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 conn, addr = self.serv.accept()
847 conn.setblocking(0)
848 try:
849 msg = conn.recv(len(MSG))
850 except socket.error:
851 pass
852 else:
853 self.fail("Error trying to do non-blocking recv.")
854 read, write, err = select.select([conn], [], [])
855 if conn in read:
856 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000857 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858 else:
859 self.fail("Error during select call to non-blocking socket.")
860
861 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000862 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000863 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000864 self.cli.send(MSG)
865
Victor Stinner6a102812010-04-27 23:55:59 +0000866@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867class FileObjectClassTestCase(SocketConnectedTest):
868
Guido van Rossume9f66142002-08-07 15:46:19 +0000869 bufsize = -1 # Use default buffer size
870
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871 def __init__(self, methodName='runTest'):
872 SocketConnectedTest.__init__(self, methodName=methodName)
873
874 def setUp(self):
875 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000876 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000877
878 def tearDown(self):
879 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000880 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000881 self.serv_file = None
882 SocketConnectedTest.tearDown(self)
883
884 def clientSetUp(self):
885 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000886 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887
888 def clientTearDown(self):
889 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000890 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000891 self.cli_file = None
892 SocketConnectedTest.clientTearDown(self)
893
894 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000895 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000896 first_seg = self.serv_file.read(len(MSG)-3)
897 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000898 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000899 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000900
901 def _testSmallRead(self):
902 self.cli_file.write(MSG)
903 self.cli_file.flush()
904
Guido van Rossum8c943832002-08-08 01:00:28 +0000905 def testFullRead(self):
906 # read until EOF
907 msg = self.serv_file.read()
908 self.assertEqual(msg, MSG)
909
910 def _testFullRead(self):
911 self.cli_file.write(MSG)
912 self.cli_file.close()
913
Guido van Rossum24e4af82002-06-12 19:18:08 +0000914 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000915 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916 buf = ''
917 while 1:
918 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000919 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000921 buf += char
922 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923
924 def _testUnbufferedRead(self):
925 self.cli_file.write(MSG)
926 self.cli_file.flush()
927
928 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000929 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000931 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932
933 def _testReadline(self):
934 self.cli_file.write(MSG)
935 self.cli_file.flush()
936
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000937 def testReadlineAfterRead(self):
938 a_baloo_is = self.serv_file.read(len("A baloo is"))
939 self.assertEqual("A baloo is", a_baloo_is)
940 _a_bear = self.serv_file.read(len(" a bear"))
941 self.assertEqual(" a bear", _a_bear)
942 line = self.serv_file.readline()
943 self.assertEqual("\n", line)
944 line = self.serv_file.readline()
945 self.assertEqual("A BALOO IS A BEAR.\n", line)
946 line = self.serv_file.readline()
947 self.assertEqual(MSG, line)
948
949 def _testReadlineAfterRead(self):
950 self.cli_file.write("A baloo is a bear\n")
951 self.cli_file.write("A BALOO IS A BEAR.\n")
952 self.cli_file.write(MSG)
953 self.cli_file.flush()
954
955 def testReadlineAfterReadNoNewline(self):
956 end_of_ = self.serv_file.read(len("End Of "))
957 self.assertEqual("End Of ", end_of_)
958 line = self.serv_file.readline()
959 self.assertEqual("Line", line)
960
961 def _testReadlineAfterReadNoNewline(self):
962 self.cli_file.write("End Of Line")
963
Tim Peters116d83c2004-03-28 02:20:45 +0000964 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000965 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000966
967 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000968 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000969
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000970
971class FileObjectInterruptedTestCase(unittest.TestCase):
972 """Test that the file object correctly handles EINTR internally."""
973
974 class MockSocket(object):
975 def __init__(self, recv_funcs=()):
976 # A generator that returns callables that we'll call for each
977 # call to recv().
978 self._recv_step = iter(recv_funcs)
979
980 def recv(self, size):
981 return self._recv_step.next()()
982
983 @staticmethod
984 def _raise_eintr():
985 raise socket.error(errno.EINTR)
986
987 def _test_readline(self, size=-1, **kwargs):
988 mock_sock = self.MockSocket(recv_funcs=[
989 lambda : "This is the first line\nAnd the sec",
990 self._raise_eintr,
991 lambda : "ond line is here\n",
992 lambda : "",
993 ])
994 fo = socket._fileobject(mock_sock, **kwargs)
995 self.assertEquals(fo.readline(size), "This is the first line\n")
996 self.assertEquals(fo.readline(size), "And the second line is here\n")
997
998 def _test_read(self, size=-1, **kwargs):
999 mock_sock = self.MockSocket(recv_funcs=[
1000 lambda : "This is the first line\nAnd the sec",
1001 self._raise_eintr,
1002 lambda : "ond line is here\n",
1003 lambda : "",
1004 ])
1005 fo = socket._fileobject(mock_sock, **kwargs)
1006 self.assertEquals(fo.read(size), "This is the first line\n"
1007 "And the second line is here\n")
1008
1009 def test_default(self):
1010 self._test_readline()
1011 self._test_readline(size=100)
1012 self._test_read()
1013 self._test_read(size=100)
1014
1015 def test_with_1k_buffer(self):
1016 self._test_readline(bufsize=1024)
1017 self._test_readline(size=100, bufsize=1024)
1018 self._test_read(bufsize=1024)
1019 self._test_read(size=100, bufsize=1024)
1020
1021 def _test_readline_no_buffer(self, size=-1):
1022 mock_sock = self.MockSocket(recv_funcs=[
1023 lambda : "aa",
1024 lambda : "\n",
1025 lambda : "BB",
1026 self._raise_eintr,
1027 lambda : "bb",
1028 lambda : "",
1029 ])
1030 fo = socket._fileobject(mock_sock, bufsize=0)
1031 self.assertEquals(fo.readline(size), "aa\n")
1032 self.assertEquals(fo.readline(size), "BBbb")
1033
1034 def test_no_buffer(self):
1035 self._test_readline_no_buffer()
1036 self._test_readline_no_buffer(size=4)
1037 self._test_read(bufsize=0)
1038 self._test_read(size=100, bufsize=0)
1039
1040
Guido van Rossume9f66142002-08-07 15:46:19 +00001041class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1042
1043 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001044
Guido van Rossume9f66142002-08-07 15:46:19 +00001045 In this case (and in this case only), it should be possible to
1046 create a file object, read a line from it, create another file
1047 object, read another line from it, without loss of data in the
1048 first file object's buffer. Note that httplib relies on this
1049 when reading multiple requests from the same socket."""
1050
1051 bufsize = 0 # Use unbuffered mode
1052
1053 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001054 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001055 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001056 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001057 self.serv_file = self.cli_conn.makefile('rb', 0)
1058 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001059 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001060
1061 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001062 self.cli_file.write("A. " + MSG)
1063 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001064 self.cli_file.flush()
1065
Guido van Rossum8c943832002-08-08 01:00:28 +00001066class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1067
1068 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1069
1070
1071class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1072
1073 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001074
Georg Brandldd7b0522007-01-21 10:35:10 +00001075
Facundo Batista07c78be2007-03-23 18:54:07 +00001076class NetworkConnectionTest(object):
1077 """Prove network connection."""
1078 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001079 # We're inherited below by BasicTCPTest2, which also inherits
1080 # BasicTCPTest, which defines self.port referenced below.
1081 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001082 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001083
Facundo Batista07c78be2007-03-23 18:54:07 +00001084class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1085 """Tests that NetworkConnection does not break existing TCP functionality.
1086 """
1087
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001088class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001089 class MockSocket(socket.socket):
1090 def connect(self, *args):
1091 raise socket.timeout('timed out')
1092
1093 @contextlib.contextmanager
1094 def mocked_socket_module(self):
1095 """Return a socket which times out on connect"""
1096 old_socket = socket.socket
1097 socket.socket = self.MockSocket
1098 try:
1099 yield
1100 finally:
1101 socket.socket = old_socket
1102
1103 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001104 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001105 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1106 with self.assertRaises(socket.error) as cm:
1107 cli.connect((HOST, port))
1108 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1109
1110 def test_create_connection(self):
1111 # Issue #9792: errors raised by create_connection() should have
1112 # a proper errno attribute.
1113 port = test_support.find_unused_port()
1114 with self.assertRaises(socket.error) as cm:
1115 socket.create_connection((HOST, port))
1116 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1117
1118 def test_create_connection_timeout(self):
1119 # Issue #9792: create_connection() should not recast timeout errors
1120 # as generic socket errors.
1121 with self.mocked_socket_module():
1122 with self.assertRaises(socket.timeout):
1123 socket.create_connection((HOST, 1234))
1124
Facundo Batista07c78be2007-03-23 18:54:07 +00001125
Victor Stinner6a102812010-04-27 23:55:59 +00001126@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001127class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1128
1129 def __init__(self, methodName='runTest'):
1130 SocketTCPTest.__init__(self, methodName=methodName)
1131 ThreadableTest.__init__(self)
1132
1133 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001134 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001135
1136 def clientTearDown(self):
1137 self.cli.close()
1138 self.cli = None
1139 ThreadableTest.clientTearDown(self)
1140
1141 def _justAccept(self):
1142 conn, addr = self.serv.accept()
1143
1144 testFamily = _justAccept
1145 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001146 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001147 self.assertEqual(self.cli.family, 2)
1148
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001149 testSourceAddress = _justAccept
1150 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001151 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1152 source_address=('', self.source_port))
1153 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001154 # The port number being used is sufficient to show that the bind()
1155 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001156
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001157 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001158 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001159 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001160 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001161 socket.setdefaulttimeout(42)
1162 try:
1163 self.cli = socket.create_connection((HOST, self.port))
1164 finally:
1165 socket.setdefaulttimeout(None)
1166 self.assertEquals(self.cli.gettimeout(), 42)
1167
1168 testTimeoutNone = _justAccept
1169 def _testTimeoutNone(self):
1170 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001171 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001172 socket.setdefaulttimeout(30)
1173 try:
1174 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1175 finally:
1176 socket.setdefaulttimeout(None)
1177 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001178
1179 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001180 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001181 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001182 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001183
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001184 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001185 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001186 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001187 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001188
Victor Stinner6a102812010-04-27 23:55:59 +00001189@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001190class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1191
1192 def __init__(self, methodName='runTest'):
1193 SocketTCPTest.__init__(self, methodName=methodName)
1194 ThreadableTest.__init__(self)
1195
1196 def clientSetUp(self):
1197 pass
1198
1199 def clientTearDown(self):
1200 self.cli.close()
1201 self.cli = None
1202 ThreadableTest.clientTearDown(self)
1203
Facundo Batista07c78be2007-03-23 18:54:07 +00001204 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001205 conn, addr = self.serv.accept()
1206 time.sleep(3)
1207 conn.send("done!")
1208 testOutsideTimeout = testInsideTimeout
1209
1210 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001211 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001212 data = sock.recv(5)
1213 self.assertEqual(data, "done!")
1214
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001215 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001216 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001217 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001218
1219
Georg Brandldd7b0522007-01-21 10:35:10 +00001220class Urllib2FileobjectTest(unittest.TestCase):
1221
1222 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1223 # it close the socket if the close c'tor argument is true
1224
1225 def testClose(self):
1226 class MockSocket:
1227 closed = False
1228 def flush(self): pass
1229 def close(self): self.closed = True
1230
1231 # must not close unless we request it: the original use of _fileobject
1232 # by module socket requires that the underlying socket not be closed until
1233 # the _socketobject that created the _fileobject is closed
1234 s = MockSocket()
1235 f = socket._fileobject(s)
1236 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001237 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001238
1239 s = MockSocket()
1240 f = socket._fileobject(s, close=True)
1241 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001242 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001243
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001244class TCPTimeoutTest(SocketTCPTest):
1245
1246 def testTCPTimeout(self):
1247 def raise_timeout(*args, **kwargs):
1248 self.serv.settimeout(1.0)
1249 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001250 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001251 "Error generating a timeout exception (TCP)")
1252
1253 def testTimeoutZero(self):
1254 ok = False
1255 try:
1256 self.serv.settimeout(0.0)
1257 foo = self.serv.accept()
1258 except socket.timeout:
1259 self.fail("caught timeout instead of error (TCP)")
1260 except socket.error:
1261 ok = True
1262 except:
1263 self.fail("caught unexpected exception (TCP)")
1264 if not ok:
1265 self.fail("accept() returned success when we did not expect it")
1266
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001267 def testInterruptedTimeout(self):
1268 # XXX I don't know how to do this test on MSWindows or any other
1269 # plaform that doesn't support signal.alarm() or os.kill(), though
1270 # the bug should have existed on all platforms.
1271 if not hasattr(signal, "alarm"):
1272 return # can only test on *nix
1273 self.serv.settimeout(5.0) # must be longer than alarm
1274 class Alarm(Exception):
1275 pass
1276 def alarm_handler(signal, frame):
1277 raise Alarm
1278 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1279 try:
1280 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1281 try:
1282 foo = self.serv.accept()
1283 except socket.timeout:
1284 self.fail("caught timeout instead of Alarm")
1285 except Alarm:
1286 pass
1287 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001288 self.fail("caught other exception instead of Alarm:"
1289 " %s(%s):\n%s" %
1290 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001291 else:
1292 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001293 finally:
1294 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001295 except Alarm:
1296 self.fail("got Alarm in wrong place")
1297 finally:
1298 # no alarm can be pending. Safe to restore old handler.
1299 signal.signal(signal.SIGALRM, old_alarm)
1300
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001301class UDPTimeoutTest(SocketTCPTest):
1302
1303 def testUDPTimeout(self):
1304 def raise_timeout(*args, **kwargs):
1305 self.serv.settimeout(1.0)
1306 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001307 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001308 "Error generating a timeout exception (UDP)")
1309
1310 def testTimeoutZero(self):
1311 ok = False
1312 try:
1313 self.serv.settimeout(0.0)
1314 foo = self.serv.recv(1024)
1315 except socket.timeout:
1316 self.fail("caught timeout instead of error (UDP)")
1317 except socket.error:
1318 ok = True
1319 except:
1320 self.fail("caught unexpected exception (UDP)")
1321 if not ok:
1322 self.fail("recv() returned success when we did not expect it")
1323
1324class TestExceptions(unittest.TestCase):
1325
1326 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001327 self.assertTrue(issubclass(socket.error, Exception))
1328 self.assertTrue(issubclass(socket.herror, socket.error))
1329 self.assertTrue(issubclass(socket.gaierror, socket.error))
1330 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001331
Armin Rigoa9017c32006-04-19 11:50:27 +00001332class TestLinuxAbstractNamespace(unittest.TestCase):
1333
1334 UNIX_PATH_MAX = 108
1335
1336 def testLinuxAbstractNamespace(self):
1337 address = "\x00python-test-hello\x00\xff"
1338 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1339 s1.bind(address)
1340 s1.listen(1)
1341 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1342 s2.connect(s1.getsockname())
1343 s1.accept()
1344 self.assertEqual(s1.getsockname(), address)
1345 self.assertEqual(s2.getpeername(), address)
1346
1347 def testMaxName(self):
1348 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1349 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1350 s.bind(address)
1351 self.assertEqual(s.getsockname(), address)
1352
1353 def testNameOverflow(self):
1354 address = "\x00" + "h" * self.UNIX_PATH_MAX
1355 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1356 self.assertRaises(socket.error, s.bind, address)
1357
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001358
Victor Stinner6a102812010-04-27 23:55:59 +00001359@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001360class BufferIOTest(SocketConnectedTest):
1361 """
1362 Test the buffer versions of socket.recv() and socket.send().
1363 """
1364 def __init__(self, methodName='runTest'):
1365 SocketConnectedTest.__init__(self, methodName=methodName)
1366
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001367 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001368 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001369 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001370 self.assertEqual(nbytes, len(MSG))
1371 msg = buf.tostring()[:len(MSG)]
1372 self.assertEqual(msg, MSG)
1373
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001374 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001375 with test_support.check_py3k_warnings():
1376 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001377 self.serv_conn.send(buf)
1378
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001379 def testRecvIntoBytearray(self):
1380 buf = bytearray(1024)
1381 nbytes = self.cli_conn.recv_into(buf)
1382 self.assertEqual(nbytes, len(MSG))
1383 msg = buf[:len(MSG)]
1384 self.assertEqual(msg, MSG)
1385
1386 _testRecvIntoBytearray = _testRecvIntoArray
1387
1388 def testRecvIntoMemoryview(self):
1389 buf = bytearray(1024)
1390 nbytes = self.cli_conn.recv_into(memoryview(buf))
1391 self.assertEqual(nbytes, len(MSG))
1392 msg = buf[:len(MSG)]
1393 self.assertEqual(msg, MSG)
1394
1395 _testRecvIntoMemoryview = _testRecvIntoArray
1396
1397 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001398 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001399 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001400 self.assertEqual(nbytes, len(MSG))
1401 msg = buf.tostring()[:len(MSG)]
1402 self.assertEqual(msg, MSG)
1403
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001404 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001405 with test_support.check_py3k_warnings():
1406 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001407 self.serv_conn.send(buf)
1408
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001409 def testRecvFromIntoBytearray(self):
1410 buf = bytearray(1024)
1411 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1412 self.assertEqual(nbytes, len(MSG))
1413 msg = buf[:len(MSG)]
1414 self.assertEqual(msg, MSG)
1415
1416 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1417
1418 def testRecvFromIntoMemoryview(self):
1419 buf = bytearray(1024)
1420 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1421 self.assertEqual(nbytes, len(MSG))
1422 msg = buf[:len(MSG)]
1423 self.assertEqual(msg, MSG)
1424
1425 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1426
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001427
1428TIPC_STYPE = 2000
1429TIPC_LOWER = 200
1430TIPC_UPPER = 210
1431
1432def isTipcAvailable():
1433 """Check if the TIPC module is loaded
1434
1435 The TIPC module is not loaded automatically on Ubuntu and probably
1436 other Linux distros.
1437 """
1438 if not hasattr(socket, "AF_TIPC"):
1439 return False
1440 if not os.path.isfile("/proc/modules"):
1441 return False
1442 with open("/proc/modules") as f:
1443 for line in f:
1444 if line.startswith("tipc "):
1445 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001446 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001447 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1448 return False
1449
1450class TIPCTest (unittest.TestCase):
1451 def testRDM(self):
1452 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1453 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1454
1455 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1456 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1457 TIPC_LOWER, TIPC_UPPER)
1458 srv.bind(srvaddr)
1459
1460 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1461 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1462 cli.sendto(MSG, sendaddr)
1463
1464 msg, recvaddr = srv.recvfrom(1024)
1465
1466 self.assertEqual(cli.getsockname(), recvaddr)
1467 self.assertEqual(msg, MSG)
1468
1469
1470class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1471 def __init__(self, methodName = 'runTest'):
1472 unittest.TestCase.__init__(self, methodName = methodName)
1473 ThreadableTest.__init__(self)
1474
1475 def setUp(self):
1476 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1477 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1478 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1479 TIPC_LOWER, TIPC_UPPER)
1480 self.srv.bind(srvaddr)
1481 self.srv.listen(5)
1482 self.serverExplicitReady()
1483 self.conn, self.connaddr = self.srv.accept()
1484
1485 def clientSetUp(self):
1486 # The is a hittable race between serverExplicitReady() and the
1487 # accept() call; sleep a little while to avoid it, otherwise
1488 # we could get an exception
1489 time.sleep(0.1)
1490 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1491 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1492 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1493 self.cli.connect(addr)
1494 self.cliaddr = self.cli.getsockname()
1495
1496 def testStream(self):
1497 msg = self.conn.recv(1024)
1498 self.assertEqual(msg, MSG)
1499 self.assertEqual(self.cliaddr, self.connaddr)
1500
1501 def _testStream(self):
1502 self.cli.send(MSG)
1503 self.cli.close()
1504
1505
Guido van Rossumb995eb72002-07-31 16:08:40 +00001506def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001507 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001508 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1509 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001510
1511 tests.extend([
1512 NonBlockingTCPTests,
1513 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001514 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001515 UnbufferedFileObjectClassTestCase,
1516 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001517 SmallBufferedFileObjectClassTestCase,
1518 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001519 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001520 NetworkConnectionAttributesTest,
1521 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001522 ])
Dave Cole331708b2004-08-09 04:51:41 +00001523 if hasattr(socket, "socketpair"):
1524 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001525 if sys.platform == 'linux2':
1526 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001527 if isTipcAvailable():
1528 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001529 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001530
1531 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001532 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001533 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001534
1535if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001536 test_main()