blob: 5fd96fec64117b4583e214cb17f0b23646f21f73 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00002from test import test_support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Trent Nelsone41b0062008-04-08 23:47:30 +00004import errno
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00006import select
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00007import time
8import traceback
Georg Brandla6168f92008-05-25 07:20:14 +00009import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000010import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000011import os
Martin Blais2856e5f2006-05-26 12:03:27 +000012import array
Antoine Pitrouc818ed42010-09-07 21:40:25 +000013import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000014from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000015import signal
Antoine Pitrou66b5df62010-09-27 18:16:46 +000016import math
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Giampaolo Rodolà633e4742010-08-14 17:04:46 +000018def try_address(host, port=0, family=socket.AF_INET):
19 """Try to bind a socket on the given host:port and return True
20 if that has been possible."""
21 try:
22 sock = socket.socket(family, socket.SOCK_STREAM)
23 sock.bind((host, port))
24 except (socket.error, socket.gaierror):
25 return False
26 else:
27 sock.close()
28 return True
29
30HOST = test_support.HOST
31MSG = b'Michael Gilfix was here\n'
32SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
33
Victor Stinner6a102812010-04-27 23:55:59 +000034try:
35 import thread
36 import threading
37except ImportError:
38 thread = None
39 threading = None
40
Trent Nelsone41b0062008-04-08 23:47:30 +000041HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000042MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000043
Guido van Rossum24e4af82002-06-12 19:18:08 +000044class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000045
Guido van Rossum24e4af82002-06-12 19:18:08 +000046 def setUp(self):
47 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000048 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000049 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000050
Guido van Rossum24e4af82002-06-12 19:18:08 +000051 def tearDown(self):
52 self.serv.close()
53 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000054
Guido van Rossum24e4af82002-06-12 19:18:08 +000055class SocketUDPTest(unittest.TestCase):
56
57 def setUp(self):
58 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000059 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000060
61 def tearDown(self):
62 self.serv.close()
63 self.serv = None
64
65class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000066 """Threadable Test class
67
68 The ThreadableTest class makes it easy to create a threaded
69 client/server pair from an existing unit test. To create a
70 new threaded class from an existing unit test, use multiple
71 inheritance:
72
73 class NewClass (OldClass, ThreadableTest):
74 pass
75
76 This class defines two new fixture functions with obvious
77 purposes for overriding:
78
79 clientSetUp ()
80 clientTearDown ()
81
82 Any new test functions within the class must then define
83 tests in pairs, where the test name is preceeded with a
84 '_' to indicate the client portion of the test. Ex:
85
86 def testFoo(self):
87 # Server portion
88
89 def _testFoo(self):
90 # Client portion
91
92 Any exceptions raised by the clients during their tests
93 are caught and transferred to the main thread to alert
94 the testing framework.
95
96 Note, the server setup function cannot call any blocking
97 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000098 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000099 the blocking call (such as in setting up a client/server
100 connection and performing the accept() in setUp().
101 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000102
103 def __init__(self):
104 # Swap the true setup function
105 self.__setUp = self.setUp
106 self.__tearDown = self.tearDown
107 self.setUp = self._setUp
108 self.tearDown = self._tearDown
109
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000110 def serverExplicitReady(self):
111 """This method allows the server to explicitly indicate that
112 it wants the client thread to proceed. This is useful if the
113 server is about to execute a blocking routine that is
114 dependent upon the client thread during its setup routine."""
115 self.server_ready.set()
116
Guido van Rossum24e4af82002-06-12 19:18:08 +0000117 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000118 self.server_ready = threading.Event()
119 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000120 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +0000121 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122
123 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000124 methodname = self.id()
125 i = methodname.rfind('.')
126 methodname = methodname[i+1:]
127 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000128 self.client_thread = thread.start_new_thread(
129 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130
131 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000132 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000133 self.server_ready.set()
134 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 def _tearDown(self):
137 self.__tearDown()
138 self.done.wait()
139
140 if not self.queue.empty():
141 msg = self.queue.get()
142 self.fail(msg)
143
144 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000145 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000146 self.clientSetUp()
Charles-François Natali21565942011-09-21 22:02:27 +0200147 self.client_ready.set()
Ezio Melottib22c3fe2011-11-06 17:50:52 +0200148 if not callable(test_func):
149 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000150 try:
151 test_func()
152 except Exception, strerror:
153 self.queue.put(strerror)
154 self.clientTearDown()
155
156 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000157 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000158
159 def clientTearDown(self):
160 self.done.set()
161 thread.exit()
162
163class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
164
165 def __init__(self, methodName='runTest'):
166 SocketTCPTest.__init__(self, methodName=methodName)
167 ThreadableTest.__init__(self)
168
169 def clientSetUp(self):
170 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
171
172 def clientTearDown(self):
173 self.cli.close()
174 self.cli = None
175 ThreadableTest.clientTearDown(self)
176
177class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
178
179 def __init__(self, methodName='runTest'):
180 SocketUDPTest.__init__(self, methodName=methodName)
181 ThreadableTest.__init__(self)
182
183 def clientSetUp(self):
184 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
185
Brian Curtindd8564f2010-11-04 03:54:23 +0000186 def clientTearDown(self):
187 self.cli.close()
188 self.cli = None
189 ThreadableTest.clientTearDown(self)
190
Guido van Rossum24e4af82002-06-12 19:18:08 +0000191class SocketConnectedTest(ThreadedTCPSocketTest):
192
193 def __init__(self, methodName='runTest'):
194 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
195
196 def setUp(self):
197 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000198 # Indicate explicitly we're ready for the client thread to
199 # proceed and then perform the blocking call to accept
200 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000201 conn, addr = self.serv.accept()
202 self.cli_conn = conn
203
204 def tearDown(self):
205 self.cli_conn.close()
206 self.cli_conn = None
207 ThreadedTCPSocketTest.tearDown(self)
208
209 def clientSetUp(self):
210 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000211 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000212 self.serv_conn = self.cli
213
214 def clientTearDown(self):
215 self.serv_conn.close()
216 self.serv_conn = None
217 ThreadedTCPSocketTest.clientTearDown(self)
218
Dave Cole331708b2004-08-09 04:51:41 +0000219class SocketPairTest(unittest.TestCase, ThreadableTest):
220
221 def __init__(self, methodName='runTest'):
222 unittest.TestCase.__init__(self, methodName=methodName)
223 ThreadableTest.__init__(self)
224
225 def setUp(self):
226 self.serv, self.cli = socket.socketpair()
227
228 def tearDown(self):
229 self.serv.close()
230 self.serv = None
231
232 def clientSetUp(self):
233 pass
234
235 def clientTearDown(self):
236 self.cli.close()
237 self.cli = None
238 ThreadableTest.clientTearDown(self)
239
Tim Peters494aaee2004-08-09 18:54:11 +0000240
Guido van Rossum24e4af82002-06-12 19:18:08 +0000241#######################################################################
242## Begin Tests
243
244class GeneralModuleTests(unittest.TestCase):
245
Raymond Hettinger027bb632004-05-31 03:09:25 +0000246 def test_weakref(self):
247 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
248 p = proxy(s)
249 self.assertEqual(p.fileno(), s.fileno())
250 s.close()
251 s = None
252 try:
253 p.fileno()
254 except ReferenceError:
255 pass
256 else:
257 self.fail('Socket proxy still exists')
258
Guido van Rossum24e4af82002-06-12 19:18:08 +0000259 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000260 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261 def raise_error(*args, **kwargs):
262 raise socket.error
263 def raise_herror(*args, **kwargs):
264 raise socket.herror
265 def raise_gaierror(*args, **kwargs):
266 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000267 self.assertRaises(socket.error, raise_error,
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_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000271 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272 "Error raising socket exception.")
273
Ezio Melotti0639be62011-05-07 19:21:22 +0300274 def testSendtoErrors(self):
275 # Testing that sendto doens't masks failures. See #10169.
276 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
277 self.addCleanup(s.close)
278 s.bind(('', 0))
279 sockname = s.getsockname()
280 # 2 args
281 with self.assertRaises(UnicodeEncodeError):
282 s.sendto(u'\u2620', sockname)
283 with self.assertRaises(TypeError) as cm:
284 s.sendto(5j, sockname)
285 self.assertIn('not complex', str(cm.exception))
286 with self.assertRaises(TypeError) as cm:
287 s.sendto('foo', None)
288 self.assertIn('not NoneType', str(cm.exception))
289 # 3 args
290 with self.assertRaises(UnicodeEncodeError):
291 s.sendto(u'\u2620', 0, sockname)
292 with self.assertRaises(TypeError) as cm:
293 s.sendto(5j, 0, sockname)
294 self.assertIn('not complex', str(cm.exception))
295 with self.assertRaises(TypeError) as cm:
296 s.sendto('foo', 0, None)
297 self.assertIn('not NoneType', str(cm.exception))
298 with self.assertRaises(TypeError) as cm:
299 s.sendto('foo', 'bar', sockname)
300 self.assertIn('an integer is required', str(cm.exception))
301 with self.assertRaises(TypeError) as cm:
302 s.sendto('foo', None, None)
303 self.assertIn('an integer is required', str(cm.exception))
304 # wrong number of args
305 with self.assertRaises(TypeError) as cm:
306 s.sendto('foo')
307 self.assertIn('(1 given)', str(cm.exception))
308 with self.assertRaises(TypeError) as cm:
309 s.sendto('foo', 0, sockname, 4)
310 self.assertIn('(4 given)', str(cm.exception))
311
312
Guido van Rossum24e4af82002-06-12 19:18:08 +0000313 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000314 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000315 socket.AF_INET
316 socket.SOCK_STREAM
317 socket.SOCK_DGRAM
318 socket.SOCK_RAW
319 socket.SOCK_RDM
320 socket.SOCK_SEQPACKET
321 socket.SOL_SOCKET
322 socket.SO_REUSEADDR
323
Guido van Rossum654c11e2002-06-13 20:24:17 +0000324 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000325 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000326 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000327 try:
328 ip = socket.gethostbyname(hostname)
329 except socket.error:
330 # Probably name lookup wasn't set up right; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600331 self.skipTest('name lookup failure')
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000332 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000333 try:
334 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
335 except socket.error:
336 # Probably a similar problem as above; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600337 self.skipTest('address lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000338 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000339 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000340 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000341 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000342
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200343 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
344 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000345 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000346 # Testing reference count for getnameinfo
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200347 try:
348 # On some versions, this loses a reference
349 orig = sys.getrefcount(__name__)
350 socket.getnameinfo(__name__,0)
351 except TypeError:
352 self.assertEqual(sys.getrefcount(__name__), orig,
353 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000354
Guido van Rossum24e4af82002-06-12 19:18:08 +0000355 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000356 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357 try:
358 # On some versions, this crashes the interpreter.
359 socket.getnameinfo(('x', 0, 0, 0), 0)
360 except socket.error:
361 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000362
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000363 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000364 # This just checks that htons etc. are their own inverse,
365 # when looking at the lower 16 or 32 bits.
366 sizes = {socket.htonl: 32, socket.ntohl: 32,
367 socket.htons: 16, socket.ntohs: 16}
368 for func, size in sizes.items():
369 mask = (1L<<size) - 1
370 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
371 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000372
Guido van Rossuma2627af2002-09-14 00:58:46 +0000373 swapped = func(mask)
374 self.assertEqual(swapped & mask, mask)
375 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000376
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000377 def testNtoHErrors(self):
378 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
379 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
380 for k in good_values:
381 socket.ntohl(k)
382 socket.ntohs(k)
383 socket.htonl(k)
384 socket.htons(k)
385 for k in bad_values:
386 self.assertRaises(OverflowError, socket.ntohl, k)
387 self.assertRaises(OverflowError, socket.ntohs, k)
388 self.assertRaises(OverflowError, socket.htonl, k)
389 self.assertRaises(OverflowError, socket.htons, k)
390
Barry Warsaw11b91a02004-06-28 00:50:43 +0000391 def testGetServBy(self):
392 eq = self.assertEqual
393 # Find one service that exists, then check all the related interfaces.
394 # I've ordered this by protocols that have both a tcp and udp
395 # protocol, at least for modern Linuxes.
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000396 if (sys.platform.startswith('linux') or
397 sys.platform.startswith('freebsd') or
398 sys.platform.startswith('netbsd') or
399 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000400 # avoid the 'echo' service on this platform, as there is an
401 # assumption breaking non-standard port/protocol entry
402 services = ('daytime', 'qotd', 'domain')
403 else:
404 services = ('echo', 'daytime', 'domain')
405 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000406 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000407 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000408 break
409 except socket.error:
410 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000411 else:
412 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000413 # Try same call with optional protocol omitted
414 port2 = socket.getservbyname(service)
415 eq(port, port2)
Terry Jan Reedya70f60a2013-03-11 17:56:17 -0400416 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000417 try:
418 udpport = socket.getservbyname(service, 'udp')
419 except socket.error:
420 udpport = None
421 else:
422 eq(udpport, port)
423 # Now make sure the lookup by port returns the same service name
424 eq(socket.getservbyport(port2), service)
425 eq(socket.getservbyport(port, 'tcp'), service)
426 if udpport is not None:
427 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000428 # Make sure getservbyport does not accept out of range ports.
429 self.assertRaises(OverflowError, socket.getservbyport, -1)
430 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000431
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000432 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000433 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000434 # The default timeout should initially be None
435 self.assertEqual(socket.getdefaulttimeout(), None)
436 s = socket.socket()
437 self.assertEqual(s.gettimeout(), None)
438 s.close()
439
440 # Set the default timeout to 10, and see if it propagates
441 socket.setdefaulttimeout(10)
442 self.assertEqual(socket.getdefaulttimeout(), 10)
443 s = socket.socket()
444 self.assertEqual(s.gettimeout(), 10)
445 s.close()
446
447 # Reset the default timeout to None, and see if it propagates
448 socket.setdefaulttimeout(None)
449 self.assertEqual(socket.getdefaulttimeout(), None)
450 s = socket.socket()
451 self.assertEqual(s.gettimeout(), None)
452 s.close()
453
454 # Check that setting it to an invalid value raises ValueError
455 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
456
457 # Check that setting it to an invalid type raises TypeError
458 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
459
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200460 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
461 'test needs socket.inet_aton()')
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000462 def testIPv4_inet_aton_fourbytes(self):
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000463 # Test that issue1008086 and issue767150 are fixed.
464 # It must return 4 bytes.
Ezio Melotti2623a372010-11-21 13:34:58 +0000465 self.assertEqual('\x00'*4, socket.inet_aton('0.0.0.0'))
466 self.assertEqual('\xff'*4, socket.inet_aton('255.255.255.255'))
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000467
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200468 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
469 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000470 def testIPv4toString(self):
471 from socket import inet_aton as f, inet_pton, AF_INET
472 g = lambda a: inet_pton(AF_INET, a)
473
Ezio Melotti2623a372010-11-21 13:34:58 +0000474 self.assertEqual('\x00\x00\x00\x00', f('0.0.0.0'))
475 self.assertEqual('\xff\x00\xff\x00', f('255.0.255.0'))
476 self.assertEqual('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
477 self.assertEqual('\x01\x02\x03\x04', f('1.2.3.4'))
478 self.assertEqual('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000479
Ezio Melotti2623a372010-11-21 13:34:58 +0000480 self.assertEqual('\x00\x00\x00\x00', g('0.0.0.0'))
481 self.assertEqual('\xff\x00\xff\x00', g('255.0.255.0'))
482 self.assertEqual('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
483 self.assertEqual('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000484
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200485 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
486 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000487 def testIPv6toString(self):
488 try:
489 from socket import inet_pton, AF_INET6, has_ipv6
490 if not has_ipv6:
Zachary Ware1f702212013-12-10 14:09:20 -0600491 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000492 except ImportError:
Zachary Ware1f702212013-12-10 14:09:20 -0600493 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000494 f = lambda a: inet_pton(AF_INET6, a)
495
Ezio Melotti2623a372010-11-21 13:34:58 +0000496 self.assertEqual('\x00' * 16, f('::'))
497 self.assertEqual('\x00' * 16, f('0::0'))
498 self.assertEqual('\x00\x01' + '\x00' * 14, f('1::'))
499 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000500 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
501 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
502 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000503
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200504 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
505 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000506 def testStringToIPv4(self):
507 from socket import inet_ntoa as f, inet_ntop, AF_INET
508 g = lambda a: inet_ntop(AF_INET, a)
509
Ezio Melotti2623a372010-11-21 13:34:58 +0000510 self.assertEqual('1.0.1.0', f('\x01\x00\x01\x00'))
511 self.assertEqual('170.85.170.85', f('\xaa\x55\xaa\x55'))
512 self.assertEqual('255.255.255.255', f('\xff\xff\xff\xff'))
513 self.assertEqual('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000514
Ezio Melotti2623a372010-11-21 13:34:58 +0000515 self.assertEqual('1.0.1.0', g('\x01\x00\x01\x00'))
516 self.assertEqual('170.85.170.85', g('\xaa\x55\xaa\x55'))
517 self.assertEqual('255.255.255.255', g('\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000518
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200519 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
520 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000521 def testStringToIPv6(self):
522 try:
523 from socket import inet_ntop, AF_INET6, has_ipv6
524 if not has_ipv6:
Zachary Ware1f702212013-12-10 14:09:20 -0600525 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000526 except ImportError:
Zachary Ware1f702212013-12-10 14:09:20 -0600527 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000528 f = lambda a: inet_ntop(AF_INET6, a)
529
Ezio Melotti2623a372010-11-21 13:34:58 +0000530 self.assertEqual('::', f('\x00' * 16))
531 self.assertEqual('::1', f('\x00' * 15 + '\x01'))
532 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000533 'aef:b01:506:1001:ffff:9997:55:170',
534 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
535 )
536
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000537 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000538
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000539 def _get_unused_port(self, bind_address='0.0.0.0'):
540 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000541
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000542 Args:
543 bind_address: Hostname or IP address to search for a port on.
544
545 Returns: A most likely to be unused port.
546 """
547 tempsock = socket.socket()
548 tempsock.bind((bind_address, 0))
549 host, port = tempsock.getsockname()
550 tempsock.close()
551 return port
552
553 def testSockName(self):
554 # Testing getsockname()
555 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000556 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000557 self.addCleanup(sock.close)
Trent Nelsone41b0062008-04-08 23:47:30 +0000558 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000559 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000560 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
561 # it reasonable to get the host's addr in addition to 0.0.0.0.
562 # At least for eCos. This is required for the S/390 to pass.
Georg Brandlb7276502010-11-26 08:28:05 +0000563 try:
564 my_ip_addr = socket.gethostbyname(socket.gethostname())
565 except socket.error:
566 # Probably name lookup wasn't set up right; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600567 self.skipTest('name lookup failure')
Ezio Melottiaa980582010-01-23 23:04:36 +0000568 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000569 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000570
571 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000572 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573 # We know a socket should start without reuse==0
574 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000575 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000576 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000577 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578
579 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000580 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000581 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000582 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000583 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
584 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000585 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000586
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000587 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000588 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000589 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
590 sock.settimeout(1)
591 sock.close()
592 self.assertRaises(socket.error, sock.send, "spam")
593
Georg Brandlbb03ac02006-03-21 18:17:25 +0000594 def testNewAttributes(self):
595 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000596 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000597 self.assertEqual(sock.family, socket.AF_INET)
598 self.assertEqual(sock.type, socket.SOCK_STREAM)
599 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000600 sock.close()
601
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000602 def test_getsockaddrarg(self):
603 host = '0.0.0.0'
604 port = self._get_unused_port(bind_address=host)
605 big_port = port + 65536
606 neg_port = port - 65536
607 sock = socket.socket()
608 try:
609 self.assertRaises(OverflowError, sock.bind, (host, big_port))
610 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
611 sock.bind((host, port))
612 finally:
613 sock.close()
614
Brian Curtin91a5b812010-11-05 15:52:20 +0000615 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesa47b75b2008-01-04 15:48:06 +0000616 def test_sock_ioctl(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000617 self.assertTrue(hasattr(socket.socket, 'ioctl'))
618 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
619 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
620 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000621 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
622 s = socket.socket()
Brian Curtin91a5b812010-11-05 15:52:20 +0000623 self.addCleanup(s.close)
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000624 self.assertRaises(ValueError, s.ioctl, -1, None)
625 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000626
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000627 def testGetaddrinfo(self):
628 try:
629 socket.getaddrinfo('localhost', 80)
630 except socket.gaierror as err:
631 if err.errno == socket.EAI_SERVICE:
632 # see http://bugs.python.org/issue1282647
633 self.skipTest("buggy libc version")
634 raise
635 # len of every sequence is supposed to be == 5
636 for info in socket.getaddrinfo(HOST, None):
637 self.assertEqual(len(info), 5)
638 # host can be a domain name, a string representation of an
639 # IPv4/v6 address or None
640 socket.getaddrinfo('localhost', 80)
641 socket.getaddrinfo('127.0.0.1', 80)
642 socket.getaddrinfo(None, 80)
643 if SUPPORTS_IPV6:
644 socket.getaddrinfo('::1', 80)
645 # port can be a string service name such as "http", a numeric
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200646 # port number (int or long), or None
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000647 socket.getaddrinfo(HOST, "http")
648 socket.getaddrinfo(HOST, 80)
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200649 socket.getaddrinfo(HOST, 80L)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000650 socket.getaddrinfo(HOST, None)
651 # test family and socktype filters
652 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
653 for family, _, _, _, _ in infos:
654 self.assertEqual(family, socket.AF_INET)
655 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
656 for _, socktype, _, _, _ in infos:
657 self.assertEqual(socktype, socket.SOCK_STREAM)
658 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000659 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000660 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
661 # a server willing to support both IPv4 and IPv6 will
662 # usually do this
663 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
664 socket.AI_PASSIVE)
665
Ronald Oussoren16c52a32013-05-24 13:45:27 +0200666 # Issue 17269
Ronald Oussoren0e6283e2013-06-10 10:35:36 +0200667 if hasattr(socket, 'AI_NUMERICSERV'):
668 socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
Christian Heimesa47b75b2008-01-04 15:48:06 +0000669
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000670 def check_sendall_interrupted(self, with_timeout):
671 # socketpair() is not stricly required, but it makes things easier.
672 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
673 self.skipTest("signal.alarm and socket.socketpair required for this test")
674 # Our signal handlers clobber the C errno by calling a math function
675 # with an invalid domain value.
676 def ok_handler(*args):
677 self.assertRaises(ValueError, math.acosh, 0)
678 def raising_handler(*args):
679 self.assertRaises(ValueError, math.acosh, 0)
680 1 // 0
681 c, s = socket.socketpair()
682 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
683 try:
684 if with_timeout:
685 # Just above the one second minimum for signal.alarm
686 c.settimeout(1.5)
687 with self.assertRaises(ZeroDivisionError):
688 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200689 c.sendall(b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000690 if with_timeout:
691 signal.signal(signal.SIGALRM, ok_handler)
692 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200693 self.assertRaises(socket.timeout, c.sendall,
694 b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000695 finally:
696 signal.signal(signal.SIGALRM, old_alarm)
697 c.close()
698 s.close()
699
700 def test_sendall_interrupted(self):
701 self.check_sendall_interrupted(False)
702
703 def test_sendall_interrupted_with_timeout(self):
704 self.check_sendall_interrupted(True)
705
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200706 def test_listen_backlog(self):
707 for backlog in 0, -1:
708 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
709 srv.bind((HOST, 0))
710 srv.listen(backlog)
711 srv.close()
712
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200713 @test_support.cpython_only
714 def test_listen_backlog_overflow(self):
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200715 # Issue 15989
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200716 import _testcapi
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200717 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
718 srv.bind((HOST, 0))
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200719 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200720 srv.close()
721
Charles-François Natali3aa59e32012-01-02 15:38:27 +0100722 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
723 def test_flowinfo(self):
724 self.assertRaises(OverflowError, socket.getnameinfo,
725 ('::1',0, 0xffffffff), 0)
726 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
727 try:
728 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
729 finally:
730 s.close()
731
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000732
Victor Stinner6a102812010-04-27 23:55:59 +0000733@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000734class BasicTCPTest(SocketConnectedTest):
735
736 def __init__(self, methodName='runTest'):
737 SocketConnectedTest.__init__(self, methodName=methodName)
738
739 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000740 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000742 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743
744 def _testRecv(self):
745 self.serv_conn.send(MSG)
746
747 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000748 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749 seg1 = self.cli_conn.recv(len(MSG) - 3)
750 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000751 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000752 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753
754 def _testOverFlowRecv(self):
755 self.serv_conn.send(MSG)
756
757 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000758 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000759 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000760 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000761
762 def _testRecvFrom(self):
763 self.serv_conn.send(MSG)
764
765 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000766 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000767 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
768 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000769 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000770 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771
772 def _testOverFlowRecvFrom(self):
773 self.serv_conn.send(MSG)
774
775 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000776 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000777 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778 while 1:
779 read = self.cli_conn.recv(1024)
780 if not read:
781 break
Guido van Rossume531e292002-08-08 20:28:34 +0000782 msg += read
783 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784
785 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000786 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787 self.serv_conn.sendall(big_chunk)
788
Zachary Ware1f702212013-12-10 14:09:20 -0600789 @unittest.skipUnless(hasattr(socket, 'fromfd'),
790 'socket.fromfd not availble')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000791 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000792 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793 fd = self.cli_conn.fileno()
794 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000795 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000796 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000797 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798
799 def _testFromFd(self):
800 self.serv_conn.send(MSG)
801
Brian Curtin62c20b62010-11-02 02:59:55 +0000802 def testDup(self):
803 # Testing dup()
804 sock = self.cli_conn.dup()
805 self.addCleanup(sock.close)
806 msg = sock.recv(1024)
807 self.assertEqual(msg, MSG)
808
809 def _testDup(self):
810 self.serv_conn.send(MSG)
811
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000813 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000815 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000816 # wait for _testShutdown to finish: on OS X, when the server
817 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000818 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000819 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820
821 def _testShutdown(self):
822 self.serv_conn.send(MSG)
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200823 self.serv_conn.shutdown(2)
824
825 testShutdown_overflow = test_support.cpython_only(testShutdown)
826
827 @test_support.cpython_only
828 def _testShutdown_overflow(self):
829 import _testcapi
830 self.serv_conn.send(MSG)
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200831 # Issue 15989
832 self.assertRaises(OverflowError, self.serv_conn.shutdown,
833 _testcapi.INT_MAX + 1)
834 self.assertRaises(OverflowError, self.serv_conn.shutdown,
835 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836 self.serv_conn.shutdown(2)
837
Victor Stinner6a102812010-04-27 23:55:59 +0000838@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000839class BasicUDPTest(ThreadedUDPSocketTest):
840
841 def __init__(self, methodName='runTest'):
842 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
843
844 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000845 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000847 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848
849 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000850 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000851
Guido van Rossum1c938012002-06-12 21:17:20 +0000852 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000853 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000855 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856
Guido van Rossum1c938012002-06-12 21:17:20 +0000857 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000858 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859
Facundo Batista1fe9f962007-03-28 03:45:20 +0000860 def testRecvFromNegative(self):
861 # Negative lengths passed to recvfrom should give ValueError.
862 self.assertRaises(ValueError, self.serv.recvfrom, -1)
863
864 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000865 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000866
Victor Stinner6a102812010-04-27 23:55:59 +0000867@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000868class TCPCloserTest(ThreadedTCPSocketTest):
869
870 def testClose(self):
871 conn, addr = self.serv.accept()
872 conn.close()
873
874 sd = self.cli
875 read, write, err = select.select([sd], [], [], 1.0)
876 self.assertEqual(read, [sd])
877 self.assertEqual(sd.recv(1), '')
878
879 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000880 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000881 time.sleep(1.0)
882
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200883@unittest.skipUnless(hasattr(socket, 'socketpair'),
884 'test needs socket.socketpair()')
Victor Stinner6a102812010-04-27 23:55:59 +0000885@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000886class BasicSocketPairTest(SocketPairTest):
887
888 def __init__(self, methodName='runTest'):
889 SocketPairTest.__init__(self, methodName=methodName)
890
891 def testRecv(self):
892 msg = self.serv.recv(1024)
893 self.assertEqual(msg, MSG)
894
895 def _testRecv(self):
896 self.cli.send(MSG)
897
898 def testSend(self):
899 self.serv.send(MSG)
900
901 def _testSend(self):
902 msg = self.cli.recv(1024)
903 self.assertEqual(msg, MSG)
904
Victor Stinner6a102812010-04-27 23:55:59 +0000905@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000906class NonBlockingTCPTests(ThreadedTCPSocketTest):
907
908 def __init__(self, methodName='runTest'):
909 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
910
911 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000912 # Testing whether set blocking works
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200913 self.serv.setblocking(True)
914 self.assertIsNone(self.serv.gettimeout())
915 self.serv.setblocking(False)
916 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000917 start = time.time()
918 try:
919 self.serv.accept()
920 except socket.error:
921 pass
922 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000923 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000924
925 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000926 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000927
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200928 @test_support.cpython_only
929 def testSetBlocking_overflow(self):
930 # Issue 15989
931 import _testcapi
932 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
933 self.skipTest('needs UINT_MAX < ULONG_MAX')
934 self.serv.setblocking(False)
935 self.assertEqual(self.serv.gettimeout(), 0.0)
936 self.serv.setblocking(_testcapi.UINT_MAX + 1)
937 self.assertIsNone(self.serv.gettimeout())
938
939 _testSetBlocking_overflow = test_support.cpython_only(_testSetBlocking)
940
Guido van Rossum24e4af82002-06-12 19:18:08 +0000941 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000942 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000943 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000944 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000945 conn, addr = self.serv.accept()
946 except socket.error:
947 pass
948 else:
949 self.fail("Error trying to do non-blocking accept.")
950 read, write, err = select.select([self.serv], [], [])
951 if self.serv in read:
952 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000953 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000954 else:
955 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000956
Guido van Rossum24e4af82002-06-12 19:18:08 +0000957 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000958 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000959 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000960
961 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000962 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000963 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000964 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965
966 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000967 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000968 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000969
970 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000971 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000972 conn, addr = self.serv.accept()
973 conn.setblocking(0)
974 try:
975 msg = conn.recv(len(MSG))
976 except socket.error:
977 pass
978 else:
979 self.fail("Error trying to do non-blocking recv.")
980 read, write, err = select.select([conn], [], [])
981 if conn in read:
982 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +0000983 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +0000984 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000985 else:
986 self.fail("Error during select call to non-blocking socket.")
987
988 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000989 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000990 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000991 self.cli.send(MSG)
992
Victor Stinner6a102812010-04-27 23:55:59 +0000993@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000994class FileObjectClassTestCase(SocketConnectedTest):
995
Guido van Rossume9f66142002-08-07 15:46:19 +0000996 bufsize = -1 # Use default buffer size
997
Guido van Rossum24e4af82002-06-12 19:18:08 +0000998 def __init__(self, methodName='runTest'):
999 SocketConnectedTest.__init__(self, methodName=methodName)
1000
1001 def setUp(self):
1002 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001003 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004
1005 def tearDown(self):
1006 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001007 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001008 SocketConnectedTest.tearDown(self)
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001009 self.serv_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001010
1011 def clientSetUp(self):
1012 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001013 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001014
1015 def clientTearDown(self):
1016 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001017 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001018 self.cli_file = None
1019 SocketConnectedTest.clientTearDown(self)
1020
1021 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001022 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001023 first_seg = self.serv_file.read(len(MSG)-3)
1024 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001025 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +00001026 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001027
1028 def _testSmallRead(self):
1029 self.cli_file.write(MSG)
1030 self.cli_file.flush()
1031
Guido van Rossum8c943832002-08-08 01:00:28 +00001032 def testFullRead(self):
1033 # read until EOF
1034 msg = self.serv_file.read()
1035 self.assertEqual(msg, MSG)
1036
1037 def _testFullRead(self):
1038 self.cli_file.write(MSG)
1039 self.cli_file.close()
1040
Guido van Rossum24e4af82002-06-12 19:18:08 +00001041 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001042 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001043 buf = ''
1044 while 1:
1045 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001046 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001047 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001048 buf += char
1049 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050
1051 def _testUnbufferedRead(self):
1052 self.cli_file.write(MSG)
1053 self.cli_file.flush()
1054
1055 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001056 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001057 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001058 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059
1060 def _testReadline(self):
1061 self.cli_file.write(MSG)
1062 self.cli_file.flush()
1063
Gregory P. Smith24237ea2008-05-05 21:53:45 +00001064 def testReadlineAfterRead(self):
1065 a_baloo_is = self.serv_file.read(len("A baloo is"))
1066 self.assertEqual("A baloo is", a_baloo_is)
1067 _a_bear = self.serv_file.read(len(" a bear"))
1068 self.assertEqual(" a bear", _a_bear)
1069 line = self.serv_file.readline()
1070 self.assertEqual("\n", line)
1071 line = self.serv_file.readline()
1072 self.assertEqual("A BALOO IS A BEAR.\n", line)
1073 line = self.serv_file.readline()
1074 self.assertEqual(MSG, line)
1075
1076 def _testReadlineAfterRead(self):
1077 self.cli_file.write("A baloo is a bear\n")
1078 self.cli_file.write("A BALOO IS A BEAR.\n")
1079 self.cli_file.write(MSG)
1080 self.cli_file.flush()
1081
1082 def testReadlineAfterReadNoNewline(self):
1083 end_of_ = self.serv_file.read(len("End Of "))
1084 self.assertEqual("End Of ", end_of_)
1085 line = self.serv_file.readline()
1086 self.assertEqual("Line", line)
1087
1088 def _testReadlineAfterReadNoNewline(self):
1089 self.cli_file.write("End Of Line")
1090
Tim Peters116d83c2004-03-28 02:20:45 +00001091 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001092 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001093
1094 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001095 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001096
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001097
1098class FileObjectInterruptedTestCase(unittest.TestCase):
1099 """Test that the file object correctly handles EINTR internally."""
1100
1101 class MockSocket(object):
1102 def __init__(self, recv_funcs=()):
1103 # A generator that returns callables that we'll call for each
1104 # call to recv().
1105 self._recv_step = iter(recv_funcs)
1106
1107 def recv(self, size):
1108 return self._recv_step.next()()
1109
1110 @staticmethod
1111 def _raise_eintr():
1112 raise socket.error(errno.EINTR)
1113
1114 def _test_readline(self, size=-1, **kwargs):
1115 mock_sock = self.MockSocket(recv_funcs=[
1116 lambda : "This is the first line\nAnd the sec",
1117 self._raise_eintr,
1118 lambda : "ond line is here\n",
1119 lambda : "",
1120 ])
1121 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001122 self.assertEqual(fo.readline(size), "This is the first line\n")
1123 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001124
1125 def _test_read(self, size=-1, **kwargs):
1126 mock_sock = self.MockSocket(recv_funcs=[
1127 lambda : "This is the first line\nAnd the sec",
1128 self._raise_eintr,
1129 lambda : "ond line is here\n",
1130 lambda : "",
1131 ])
1132 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001133 self.assertEqual(fo.read(size), "This is the first line\n"
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001134 "And the second line is here\n")
1135
1136 def test_default(self):
1137 self._test_readline()
1138 self._test_readline(size=100)
1139 self._test_read()
1140 self._test_read(size=100)
1141
1142 def test_with_1k_buffer(self):
1143 self._test_readline(bufsize=1024)
1144 self._test_readline(size=100, bufsize=1024)
1145 self._test_read(bufsize=1024)
1146 self._test_read(size=100, bufsize=1024)
1147
1148 def _test_readline_no_buffer(self, size=-1):
1149 mock_sock = self.MockSocket(recv_funcs=[
1150 lambda : "aa",
1151 lambda : "\n",
1152 lambda : "BB",
1153 self._raise_eintr,
1154 lambda : "bb",
1155 lambda : "",
1156 ])
1157 fo = socket._fileobject(mock_sock, bufsize=0)
Ezio Melotti2623a372010-11-21 13:34:58 +00001158 self.assertEqual(fo.readline(size), "aa\n")
1159 self.assertEqual(fo.readline(size), "BBbb")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001160
1161 def test_no_buffer(self):
1162 self._test_readline_no_buffer()
1163 self._test_readline_no_buffer(size=4)
1164 self._test_read(bufsize=0)
1165 self._test_read(size=100, bufsize=0)
1166
1167
Guido van Rossume9f66142002-08-07 15:46:19 +00001168class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1169
1170 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001171
Guido van Rossume9f66142002-08-07 15:46:19 +00001172 In this case (and in this case only), it should be possible to
1173 create a file object, read a line from it, create another file
1174 object, read another line from it, without loss of data in the
1175 first file object's buffer. Note that httplib relies on this
1176 when reading multiple requests from the same socket."""
1177
1178 bufsize = 0 # Use unbuffered mode
1179
1180 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001181 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001182 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001183 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001184 self.serv_file = self.cli_conn.makefile('rb', 0)
1185 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001186 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001187
1188 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001189 self.cli_file.write("A. " + MSG)
1190 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001191 self.cli_file.flush()
1192
Guido van Rossum8c943832002-08-08 01:00:28 +00001193class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1194
1195 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1196
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001197 class SocketMemo(object):
1198 """A wrapper to keep track of sent data, needed to examine write behaviour"""
1199 def __init__(self, sock):
1200 self._sock = sock
1201 self.sent = []
1202
1203 def send(self, data, flags=0):
1204 n = self._sock.send(data, flags)
1205 self.sent.append(data[:n])
1206 return n
1207
1208 def sendall(self, data, flags=0):
1209 self._sock.sendall(data, flags)
1210 self.sent.append(data)
1211
1212 def __getattr__(self, attr):
1213 return getattr(self._sock, attr)
1214
1215 def getsent(self):
1216 return [e.tobytes() if isinstance(e, memoryview) else e for e in self.sent]
1217
1218 def setUp(self):
1219 FileObjectClassTestCase.setUp(self)
1220 self.serv_file._sock = self.SocketMemo(self.serv_file._sock)
1221
1222 def testLinebufferedWrite(self):
1223 # Write two lines, in small chunks
1224 msg = MSG.strip()
1225 print >> self.serv_file, msg,
1226 print >> self.serv_file, msg
1227
1228 # second line:
1229 print >> self.serv_file, msg,
1230 print >> self.serv_file, msg,
1231 print >> self.serv_file, msg
1232
1233 # third line
1234 print >> self.serv_file, ''
1235
1236 self.serv_file.flush()
1237
1238 msg1 = "%s %s\n"%(msg, msg)
1239 msg2 = "%s %s %s\n"%(msg, msg, msg)
1240 msg3 = "\n"
1241 self.assertEqual(self.serv_file._sock.getsent(), [msg1, msg2, msg3])
1242
1243 def _testLinebufferedWrite(self):
1244 msg = MSG.strip()
1245 msg1 = "%s %s\n"%(msg, msg)
1246 msg2 = "%s %s %s\n"%(msg, msg, msg)
1247 msg3 = "\n"
1248 l1 = self.cli_file.readline()
1249 self.assertEqual(l1, msg1)
1250 l2 = self.cli_file.readline()
1251 self.assertEqual(l2, msg2)
1252 l3 = self.cli_file.readline()
1253 self.assertEqual(l3, msg3)
1254
Guido van Rossum8c943832002-08-08 01:00:28 +00001255
1256class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1257
1258 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001259
Georg Brandldd7b0522007-01-21 10:35:10 +00001260
Facundo Batista07c78be2007-03-23 18:54:07 +00001261class NetworkConnectionTest(object):
1262 """Prove network connection."""
1263 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001264 # We're inherited below by BasicTCPTest2, which also inherits
1265 # BasicTCPTest, which defines self.port referenced below.
1266 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001267 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001268
Facundo Batista07c78be2007-03-23 18:54:07 +00001269class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1270 """Tests that NetworkConnection does not break existing TCP functionality.
1271 """
1272
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001273class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001274 class MockSocket(socket.socket):
1275 def connect(self, *args):
1276 raise socket.timeout('timed out')
1277
1278 @contextlib.contextmanager
1279 def mocked_socket_module(self):
1280 """Return a socket which times out on connect"""
1281 old_socket = socket.socket
1282 socket.socket = self.MockSocket
1283 try:
1284 yield
1285 finally:
1286 socket.socket = old_socket
1287
1288 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001289 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001290 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001291 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001292 with self.assertRaises(socket.error) as cm:
1293 cli.connect((HOST, port))
1294 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1295
1296 def test_create_connection(self):
1297 # Issue #9792: errors raised by create_connection() should have
1298 # a proper errno attribute.
1299 port = test_support.find_unused_port()
1300 with self.assertRaises(socket.error) as cm:
1301 socket.create_connection((HOST, port))
Trent Nelson6a7f8672012-10-18 01:35:32 -04001302
1303 # Issue #16257: create_connection() calls getaddrinfo() against
1304 # 'localhost'. This may result in an IPV6 addr being returned
1305 # as well as an IPV4 one:
1306 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1307 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1308 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1309 #
1310 # create_connection() enumerates through all the addresses returned
1311 # and if it doesn't successfully bind to any of them, it propagates
1312 # the last exception it encountered.
1313 #
1314 # On Solaris, ENETUNREACH is returned in this circumstance instead
1315 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1316 # expected errnos.
1317 expected_errnos = [ errno.ECONNREFUSED, ]
1318 if hasattr(errno, 'ENETUNREACH'):
1319 expected_errnos.append(errno.ENETUNREACH)
1320
1321 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001322
1323 def test_create_connection_timeout(self):
1324 # Issue #9792: create_connection() should not recast timeout errors
1325 # as generic socket errors.
1326 with self.mocked_socket_module():
1327 with self.assertRaises(socket.timeout):
1328 socket.create_connection((HOST, 1234))
1329
Facundo Batista07c78be2007-03-23 18:54:07 +00001330
Victor Stinner6a102812010-04-27 23:55:59 +00001331@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001332class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1333
1334 def __init__(self, methodName='runTest'):
1335 SocketTCPTest.__init__(self, methodName=methodName)
1336 ThreadableTest.__init__(self)
1337
1338 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001339 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001340
1341 def clientTearDown(self):
1342 self.cli.close()
1343 self.cli = None
1344 ThreadableTest.clientTearDown(self)
1345
1346 def _justAccept(self):
1347 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001348 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001349
1350 testFamily = _justAccept
1351 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001352 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001353 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001354 self.assertEqual(self.cli.family, 2)
1355
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001356 testSourceAddress = _justAccept
1357 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001358 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1359 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001360 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001361 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001362 # The port number being used is sufficient to show that the bind()
1363 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001364
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001365 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001366 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001367 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001368 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001369 socket.setdefaulttimeout(42)
1370 try:
1371 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001372 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001373 finally:
1374 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001375 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001376
1377 testTimeoutNone = _justAccept
1378 def _testTimeoutNone(self):
1379 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001380 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001381 socket.setdefaulttimeout(30)
1382 try:
1383 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001384 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001385 finally:
1386 socket.setdefaulttimeout(None)
1387 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001388
1389 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001390 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001391 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001392 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001393
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001394 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001395 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001396 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001397 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001398 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001399
Victor Stinner6a102812010-04-27 23:55:59 +00001400@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001401class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1402
1403 def __init__(self, methodName='runTest'):
1404 SocketTCPTest.__init__(self, methodName=methodName)
1405 ThreadableTest.__init__(self)
1406
1407 def clientSetUp(self):
1408 pass
1409
1410 def clientTearDown(self):
1411 self.cli.close()
1412 self.cli = None
1413 ThreadableTest.clientTearDown(self)
1414
Facundo Batista07c78be2007-03-23 18:54:07 +00001415 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001416 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001417 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001418 time.sleep(3)
1419 conn.send("done!")
1420 testOutsideTimeout = testInsideTimeout
1421
1422 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001423 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001424 data = sock.recv(5)
1425 self.assertEqual(data, "done!")
1426
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001427 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001428 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001429 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001430
1431
Georg Brandldd7b0522007-01-21 10:35:10 +00001432class Urllib2FileobjectTest(unittest.TestCase):
1433
1434 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1435 # it close the socket if the close c'tor argument is true
1436
1437 def testClose(self):
1438 class MockSocket:
1439 closed = False
1440 def flush(self): pass
1441 def close(self): self.closed = True
1442
1443 # must not close unless we request it: the original use of _fileobject
1444 # by module socket requires that the underlying socket not be closed until
1445 # the _socketobject that created the _fileobject is closed
1446 s = MockSocket()
1447 f = socket._fileobject(s)
1448 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001449 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001450
1451 s = MockSocket()
1452 f = socket._fileobject(s, close=True)
1453 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001454 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001455
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001456class TCPTimeoutTest(SocketTCPTest):
1457
1458 def testTCPTimeout(self):
1459 def raise_timeout(*args, **kwargs):
1460 self.serv.settimeout(1.0)
1461 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001462 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001463 "Error generating a timeout exception (TCP)")
1464
1465 def testTimeoutZero(self):
1466 ok = False
1467 try:
1468 self.serv.settimeout(0.0)
1469 foo = self.serv.accept()
1470 except socket.timeout:
1471 self.fail("caught timeout instead of error (TCP)")
1472 except socket.error:
1473 ok = True
1474 except:
1475 self.fail("caught unexpected exception (TCP)")
1476 if not ok:
1477 self.fail("accept() returned success when we did not expect it")
1478
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001479 @unittest.skipUnless(hasattr(signal, 'alarm'),
1480 'test needs signal.alarm()')
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001481 def testInterruptedTimeout(self):
1482 # XXX I don't know how to do this test on MSWindows or any other
1483 # plaform that doesn't support signal.alarm() or os.kill(), though
1484 # the bug should have existed on all platforms.
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001485 self.serv.settimeout(5.0) # must be longer than alarm
1486 class Alarm(Exception):
1487 pass
1488 def alarm_handler(signal, frame):
1489 raise Alarm
1490 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1491 try:
1492 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1493 try:
1494 foo = self.serv.accept()
1495 except socket.timeout:
1496 self.fail("caught timeout instead of Alarm")
1497 except Alarm:
1498 pass
1499 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001500 self.fail("caught other exception instead of Alarm:"
1501 " %s(%s):\n%s" %
1502 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001503 else:
1504 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001505 finally:
1506 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001507 except Alarm:
1508 self.fail("got Alarm in wrong place")
1509 finally:
1510 # no alarm can be pending. Safe to restore old handler.
1511 signal.signal(signal.SIGALRM, old_alarm)
1512
Ezio Melotti169ed592011-11-18 18:33:14 +02001513class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001514
1515 def testUDPTimeout(self):
1516 def raise_timeout(*args, **kwargs):
1517 self.serv.settimeout(1.0)
1518 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001519 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001520 "Error generating a timeout exception (UDP)")
1521
1522 def testTimeoutZero(self):
1523 ok = False
1524 try:
1525 self.serv.settimeout(0.0)
1526 foo = self.serv.recv(1024)
1527 except socket.timeout:
1528 self.fail("caught timeout instead of error (UDP)")
1529 except socket.error:
1530 ok = True
1531 except:
1532 self.fail("caught unexpected exception (UDP)")
1533 if not ok:
1534 self.fail("recv() returned success when we did not expect it")
1535
1536class TestExceptions(unittest.TestCase):
1537
1538 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001539 self.assertTrue(issubclass(socket.error, Exception))
1540 self.assertTrue(issubclass(socket.herror, socket.error))
1541 self.assertTrue(issubclass(socket.gaierror, socket.error))
1542 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001543
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001544@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Armin Rigoa9017c32006-04-19 11:50:27 +00001545class TestLinuxAbstractNamespace(unittest.TestCase):
1546
1547 UNIX_PATH_MAX = 108
1548
1549 def testLinuxAbstractNamespace(self):
1550 address = "\x00python-test-hello\x00\xff"
1551 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1552 s1.bind(address)
1553 s1.listen(1)
1554 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1555 s2.connect(s1.getsockname())
1556 s1.accept()
1557 self.assertEqual(s1.getsockname(), address)
1558 self.assertEqual(s2.getpeername(), address)
1559
1560 def testMaxName(self):
1561 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1562 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1563 s.bind(address)
1564 self.assertEqual(s.getsockname(), address)
1565
1566 def testNameOverflow(self):
1567 address = "\x00" + "h" * self.UNIX_PATH_MAX
1568 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1569 self.assertRaises(socket.error, s.bind, address)
1570
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001571
Victor Stinner6a102812010-04-27 23:55:59 +00001572@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001573class BufferIOTest(SocketConnectedTest):
1574 """
1575 Test the buffer versions of socket.recv() and socket.send().
1576 """
1577 def __init__(self, methodName='runTest'):
1578 SocketConnectedTest.__init__(self, methodName=methodName)
1579
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001580 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001581 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001582 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001583 self.assertEqual(nbytes, len(MSG))
1584 msg = buf.tostring()[:len(MSG)]
1585 self.assertEqual(msg, MSG)
1586
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001587 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001588 with test_support.check_py3k_warnings():
1589 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001590 self.serv_conn.send(buf)
1591
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001592 def testRecvIntoBytearray(self):
1593 buf = bytearray(1024)
1594 nbytes = self.cli_conn.recv_into(buf)
1595 self.assertEqual(nbytes, len(MSG))
1596 msg = buf[:len(MSG)]
1597 self.assertEqual(msg, MSG)
1598
1599 _testRecvIntoBytearray = _testRecvIntoArray
1600
1601 def testRecvIntoMemoryview(self):
1602 buf = bytearray(1024)
1603 nbytes = self.cli_conn.recv_into(memoryview(buf))
1604 self.assertEqual(nbytes, len(MSG))
1605 msg = buf[:len(MSG)]
1606 self.assertEqual(msg, MSG)
1607
1608 _testRecvIntoMemoryview = _testRecvIntoArray
1609
1610 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001611 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001612 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001613 self.assertEqual(nbytes, len(MSG))
1614 msg = buf.tostring()[:len(MSG)]
1615 self.assertEqual(msg, MSG)
1616
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001617 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001618 with test_support.check_py3k_warnings():
1619 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001620 self.serv_conn.send(buf)
1621
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001622 def testRecvFromIntoBytearray(self):
1623 buf = bytearray(1024)
1624 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1625 self.assertEqual(nbytes, len(MSG))
1626 msg = buf[:len(MSG)]
1627 self.assertEqual(msg, MSG)
1628
1629 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1630
1631 def testRecvFromIntoMemoryview(self):
1632 buf = bytearray(1024)
1633 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1634 self.assertEqual(nbytes, len(MSG))
1635 msg = buf[:len(MSG)]
1636 self.assertEqual(msg, MSG)
1637
1638 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1639
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001640 def testRecvFromIntoSmallBuffer(self):
1641 # See issue #20246.
1642 buf = bytearray(8)
1643 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
1644
1645 def _testRecvFromIntoSmallBuffer(self):
1646 with test_support.check_py3k_warnings():
Stefan Krah70df6672014-01-21 23:05:52 +01001647 buf = buffer(MSG)
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001648 self.serv_conn.send(buf)
1649
Benjamin Petersond93d6332014-01-14 00:27:42 -05001650 def testRecvFromIntoEmptyBuffer(self):
1651 buf = bytearray()
1652 self.cli_conn.recvfrom_into(buf)
1653 self.cli_conn.recvfrom_into(buf, 0)
1654
1655 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
1656
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001657
1658TIPC_STYPE = 2000
1659TIPC_LOWER = 200
1660TIPC_UPPER = 210
1661
1662def isTipcAvailable():
1663 """Check if the TIPC module is loaded
1664
1665 The TIPC module is not loaded automatically on Ubuntu and probably
1666 other Linux distros.
1667 """
1668 if not hasattr(socket, "AF_TIPC"):
1669 return False
1670 if not os.path.isfile("/proc/modules"):
1671 return False
1672 with open("/proc/modules") as f:
1673 for line in f:
1674 if line.startswith("tipc "):
1675 return True
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001676 return False
1677
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001678@unittest.skipUnless(isTipcAvailable(),
1679 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1680class TIPCTest(unittest.TestCase):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001681 def testRDM(self):
1682 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1683 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1684
1685 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1686 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1687 TIPC_LOWER, TIPC_UPPER)
1688 srv.bind(srvaddr)
1689
1690 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1691 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1692 cli.sendto(MSG, sendaddr)
1693
1694 msg, recvaddr = srv.recvfrom(1024)
1695
1696 self.assertEqual(cli.getsockname(), recvaddr)
1697 self.assertEqual(msg, MSG)
1698
1699
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001700@unittest.skipUnless(isTipcAvailable(),
1701 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1702class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001703 def __init__(self, methodName = 'runTest'):
1704 unittest.TestCase.__init__(self, methodName = methodName)
1705 ThreadableTest.__init__(self)
1706
1707 def setUp(self):
1708 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1709 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1710 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1711 TIPC_LOWER, TIPC_UPPER)
1712 self.srv.bind(srvaddr)
1713 self.srv.listen(5)
1714 self.serverExplicitReady()
1715 self.conn, self.connaddr = self.srv.accept()
1716
1717 def clientSetUp(self):
1718 # The is a hittable race between serverExplicitReady() and the
1719 # accept() call; sleep a little while to avoid it, otherwise
1720 # we could get an exception
1721 time.sleep(0.1)
1722 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1723 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1724 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1725 self.cli.connect(addr)
1726 self.cliaddr = self.cli.getsockname()
1727
1728 def testStream(self):
1729 msg = self.conn.recv(1024)
1730 self.assertEqual(msg, MSG)
1731 self.assertEqual(self.cliaddr, self.connaddr)
1732
1733 def _testStream(self):
1734 self.cli.send(MSG)
1735 self.cli.close()
1736
1737
Guido van Rossumb995eb72002-07-31 16:08:40 +00001738def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001739 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001740 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1741 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001742
1743 tests.extend([
1744 NonBlockingTCPTests,
1745 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001746 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001747 UnbufferedFileObjectClassTestCase,
1748 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001749 SmallBufferedFileObjectClassTestCase,
1750 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001751 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001752 NetworkConnectionAttributesTest,
1753 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001754 ])
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001755 tests.append(BasicSocketPairTest)
1756 tests.append(TestLinuxAbstractNamespace)
1757 tests.extend([TIPCTest, TIPCThreadableTest])
Neal Norwitz9602cc22006-06-18 19:35:01 +00001758
1759 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001760 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001761 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001762
1763if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001764 test_main()