blob: 5d5005bc6cd53657725d1f1dc39b9b68db7b66c3 [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
Ned Deilye789a1d2014-02-13 22:49:30 -0800666 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussoren0e6283e2013-06-10 10:35:36 +0200667 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilye789a1d2014-02-13 22:49:30 -0800668 try:
669 # The arguments here are undefined and the call may succeed
670 # or fail. All we care here is that it doesn't segfault.
671 socket.getaddrinfo("localhost", None, 0, 0, 0,
672 socket.AI_NUMERICSERV)
673 except socket.gaierror:
674 pass
Christian Heimesa47b75b2008-01-04 15:48:06 +0000675
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000676 def check_sendall_interrupted(self, with_timeout):
677 # socketpair() is not stricly required, but it makes things easier.
678 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
679 self.skipTest("signal.alarm and socket.socketpair required for this test")
680 # Our signal handlers clobber the C errno by calling a math function
681 # with an invalid domain value.
682 def ok_handler(*args):
683 self.assertRaises(ValueError, math.acosh, 0)
684 def raising_handler(*args):
685 self.assertRaises(ValueError, math.acosh, 0)
686 1 // 0
687 c, s = socket.socketpair()
688 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
689 try:
690 if with_timeout:
691 # Just above the one second minimum for signal.alarm
692 c.settimeout(1.5)
693 with self.assertRaises(ZeroDivisionError):
694 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200695 c.sendall(b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000696 if with_timeout:
697 signal.signal(signal.SIGALRM, ok_handler)
698 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200699 self.assertRaises(socket.timeout, c.sendall,
700 b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000701 finally:
702 signal.signal(signal.SIGALRM, old_alarm)
703 c.close()
704 s.close()
705
706 def test_sendall_interrupted(self):
707 self.check_sendall_interrupted(False)
708
709 def test_sendall_interrupted_with_timeout(self):
710 self.check_sendall_interrupted(True)
711
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200712 def test_listen_backlog(self):
713 for backlog in 0, -1:
714 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
715 srv.bind((HOST, 0))
716 srv.listen(backlog)
717 srv.close()
718
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200719 @test_support.cpython_only
720 def test_listen_backlog_overflow(self):
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200721 # Issue 15989
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200722 import _testcapi
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200723 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
724 srv.bind((HOST, 0))
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200725 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200726 srv.close()
727
Charles-François Natali3aa59e32012-01-02 15:38:27 +0100728 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
729 def test_flowinfo(self):
730 self.assertRaises(OverflowError, socket.getnameinfo,
731 ('::1',0, 0xffffffff), 0)
732 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
733 try:
734 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
735 finally:
736 s.close()
737
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000738
Victor Stinner6a102812010-04-27 23:55:59 +0000739@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740class BasicTCPTest(SocketConnectedTest):
741
742 def __init__(self, methodName='runTest'):
743 SocketConnectedTest.__init__(self, methodName=methodName)
744
745 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000746 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000748 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749
750 def _testRecv(self):
751 self.serv_conn.send(MSG)
752
753 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000754 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 seg1 = self.cli_conn.recv(len(MSG) - 3)
756 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000757 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000758 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000759
760 def _testOverFlowRecv(self):
761 self.serv_conn.send(MSG)
762
763 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000764 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000766 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000767
768 def _testRecvFrom(self):
769 self.serv_conn.send(MSG)
770
771 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000772 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
774 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000775 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000776 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777
778 def _testOverFlowRecvFrom(self):
779 self.serv_conn.send(MSG)
780
781 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000782 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000783 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 while 1:
785 read = self.cli_conn.recv(1024)
786 if not read:
787 break
Guido van Rossume531e292002-08-08 20:28:34 +0000788 msg += read
789 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790
791 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000792 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793 self.serv_conn.sendall(big_chunk)
794
Zachary Ware1f702212013-12-10 14:09:20 -0600795 @unittest.skipUnless(hasattr(socket, 'fromfd'),
796 'socket.fromfd not availble')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000797 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000798 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000799 fd = self.cli_conn.fileno()
800 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000801 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000803 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000804
805 def _testFromFd(self):
806 self.serv_conn.send(MSG)
807
Brian Curtin62c20b62010-11-02 02:59:55 +0000808 def testDup(self):
809 # Testing dup()
810 sock = self.cli_conn.dup()
811 self.addCleanup(sock.close)
812 msg = sock.recv(1024)
813 self.assertEqual(msg, MSG)
814
815 def _testDup(self):
816 self.serv_conn.send(MSG)
817
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000819 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000821 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000822 # wait for _testShutdown to finish: on OS X, when the server
823 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000824 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000825 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826
827 def _testShutdown(self):
828 self.serv_conn.send(MSG)
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200829 self.serv_conn.shutdown(2)
830
831 testShutdown_overflow = test_support.cpython_only(testShutdown)
832
833 @test_support.cpython_only
834 def _testShutdown_overflow(self):
835 import _testcapi
836 self.serv_conn.send(MSG)
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200837 # Issue 15989
838 self.assertRaises(OverflowError, self.serv_conn.shutdown,
839 _testcapi.INT_MAX + 1)
840 self.assertRaises(OverflowError, self.serv_conn.shutdown,
841 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000842 self.serv_conn.shutdown(2)
843
Victor Stinner6a102812010-04-27 23:55:59 +0000844@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000845class BasicUDPTest(ThreadedUDPSocketTest):
846
847 def __init__(self, methodName='runTest'):
848 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
849
850 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000851 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000853 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854
855 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000856 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857
Guido van Rossum1c938012002-06-12 21:17:20 +0000858 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000859 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000861 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862
Guido van Rossum1c938012002-06-12 21:17:20 +0000863 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000864 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865
Facundo Batista1fe9f962007-03-28 03:45:20 +0000866 def testRecvFromNegative(self):
867 # Negative lengths passed to recvfrom should give ValueError.
868 self.assertRaises(ValueError, self.serv.recvfrom, -1)
869
870 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000871 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000872
Victor Stinner6a102812010-04-27 23:55:59 +0000873@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000874class TCPCloserTest(ThreadedTCPSocketTest):
875
876 def testClose(self):
877 conn, addr = self.serv.accept()
878 conn.close()
879
880 sd = self.cli
881 read, write, err = select.select([sd], [], [], 1.0)
882 self.assertEqual(read, [sd])
883 self.assertEqual(sd.recv(1), '')
884
885 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000886 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000887 time.sleep(1.0)
888
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200889@unittest.skipUnless(hasattr(socket, 'socketpair'),
890 'test needs socket.socketpair()')
Victor Stinner6a102812010-04-27 23:55:59 +0000891@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000892class BasicSocketPairTest(SocketPairTest):
893
894 def __init__(self, methodName='runTest'):
895 SocketPairTest.__init__(self, methodName=methodName)
896
897 def testRecv(self):
898 msg = self.serv.recv(1024)
899 self.assertEqual(msg, MSG)
900
901 def _testRecv(self):
902 self.cli.send(MSG)
903
904 def testSend(self):
905 self.serv.send(MSG)
906
907 def _testSend(self):
908 msg = self.cli.recv(1024)
909 self.assertEqual(msg, MSG)
910
Victor Stinner6a102812010-04-27 23:55:59 +0000911@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000912class NonBlockingTCPTests(ThreadedTCPSocketTest):
913
914 def __init__(self, methodName='runTest'):
915 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
916
917 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000918 # Testing whether set blocking works
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200919 self.serv.setblocking(True)
920 self.assertIsNone(self.serv.gettimeout())
921 self.serv.setblocking(False)
922 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923 start = time.time()
924 try:
925 self.serv.accept()
926 except socket.error:
927 pass
928 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000929 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930
931 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000932 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000933
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200934 @test_support.cpython_only
935 def testSetBlocking_overflow(self):
936 # Issue 15989
937 import _testcapi
938 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
939 self.skipTest('needs UINT_MAX < ULONG_MAX')
940 self.serv.setblocking(False)
941 self.assertEqual(self.serv.gettimeout(), 0.0)
942 self.serv.setblocking(_testcapi.UINT_MAX + 1)
943 self.assertIsNone(self.serv.gettimeout())
944
945 _testSetBlocking_overflow = test_support.cpython_only(_testSetBlocking)
946
Guido van Rossum24e4af82002-06-12 19:18:08 +0000947 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000948 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000949 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000950 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000951 conn, addr = self.serv.accept()
952 except socket.error:
953 pass
954 else:
955 self.fail("Error trying to do non-blocking accept.")
956 read, write, err = select.select([self.serv], [], [])
957 if self.serv in read:
958 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000959 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000960 else:
961 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000962
Guido van Rossum24e4af82002-06-12 19:18:08 +0000963 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000964 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000965 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000966
967 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000968 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000969 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000970 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000971
972 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000973 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000974 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000975
976 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000977 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000978 conn, addr = self.serv.accept()
979 conn.setblocking(0)
980 try:
981 msg = conn.recv(len(MSG))
982 except socket.error:
983 pass
984 else:
985 self.fail("Error trying to do non-blocking recv.")
986 read, write, err = select.select([conn], [], [])
987 if conn in read:
988 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +0000989 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +0000990 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000991 else:
992 self.fail("Error during select call to non-blocking socket.")
993
994 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000995 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000996 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000997 self.cli.send(MSG)
998
Victor Stinner6a102812010-04-27 23:55:59 +0000999@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001000class FileObjectClassTestCase(SocketConnectedTest):
1001
Guido van Rossume9f66142002-08-07 15:46:19 +00001002 bufsize = -1 # Use default buffer size
1003
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004 def __init__(self, methodName='runTest'):
1005 SocketConnectedTest.__init__(self, methodName=methodName)
1006
1007 def setUp(self):
1008 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001009 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001010
1011 def tearDown(self):
1012 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001013 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001014 SocketConnectedTest.tearDown(self)
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001015 self.serv_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001016
1017 def clientSetUp(self):
1018 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001019 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001020
1021 def clientTearDown(self):
1022 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001023 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001024 self.cli_file = None
1025 SocketConnectedTest.clientTearDown(self)
1026
1027 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001028 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001029 first_seg = self.serv_file.read(len(MSG)-3)
1030 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001031 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +00001032 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001033
1034 def _testSmallRead(self):
1035 self.cli_file.write(MSG)
1036 self.cli_file.flush()
1037
Guido van Rossum8c943832002-08-08 01:00:28 +00001038 def testFullRead(self):
1039 # read until EOF
1040 msg = self.serv_file.read()
1041 self.assertEqual(msg, MSG)
1042
1043 def _testFullRead(self):
1044 self.cli_file.write(MSG)
1045 self.cli_file.close()
1046
Guido van Rossum24e4af82002-06-12 19:18:08 +00001047 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001048 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001049 buf = ''
1050 while 1:
1051 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001052 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001053 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001054 buf += char
1055 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001056
1057 def _testUnbufferedRead(self):
1058 self.cli_file.write(MSG)
1059 self.cli_file.flush()
1060
1061 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001062 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001063 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001064 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001065
1066 def _testReadline(self):
1067 self.cli_file.write(MSG)
1068 self.cli_file.flush()
1069
Gregory P. Smith24237ea2008-05-05 21:53:45 +00001070 def testReadlineAfterRead(self):
1071 a_baloo_is = self.serv_file.read(len("A baloo is"))
1072 self.assertEqual("A baloo is", a_baloo_is)
1073 _a_bear = self.serv_file.read(len(" a bear"))
1074 self.assertEqual(" a bear", _a_bear)
1075 line = self.serv_file.readline()
1076 self.assertEqual("\n", line)
1077 line = self.serv_file.readline()
1078 self.assertEqual("A BALOO IS A BEAR.\n", line)
1079 line = self.serv_file.readline()
1080 self.assertEqual(MSG, line)
1081
1082 def _testReadlineAfterRead(self):
1083 self.cli_file.write("A baloo is a bear\n")
1084 self.cli_file.write("A BALOO IS A BEAR.\n")
1085 self.cli_file.write(MSG)
1086 self.cli_file.flush()
1087
1088 def testReadlineAfterReadNoNewline(self):
1089 end_of_ = self.serv_file.read(len("End Of "))
1090 self.assertEqual("End Of ", end_of_)
1091 line = self.serv_file.readline()
1092 self.assertEqual("Line", line)
1093
1094 def _testReadlineAfterReadNoNewline(self):
1095 self.cli_file.write("End Of Line")
1096
Tim Peters116d83c2004-03-28 02:20:45 +00001097 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001098 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001099
1100 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001101 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001102
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001103
1104class FileObjectInterruptedTestCase(unittest.TestCase):
1105 """Test that the file object correctly handles EINTR internally."""
1106
1107 class MockSocket(object):
1108 def __init__(self, recv_funcs=()):
1109 # A generator that returns callables that we'll call for each
1110 # call to recv().
1111 self._recv_step = iter(recv_funcs)
1112
1113 def recv(self, size):
1114 return self._recv_step.next()()
1115
1116 @staticmethod
1117 def _raise_eintr():
1118 raise socket.error(errno.EINTR)
1119
1120 def _test_readline(self, size=-1, **kwargs):
1121 mock_sock = self.MockSocket(recv_funcs=[
1122 lambda : "This is the first line\nAnd the sec",
1123 self._raise_eintr,
1124 lambda : "ond line is here\n",
1125 lambda : "",
1126 ])
1127 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001128 self.assertEqual(fo.readline(size), "This is the first line\n")
1129 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001130
1131 def _test_read(self, size=-1, **kwargs):
1132 mock_sock = self.MockSocket(recv_funcs=[
1133 lambda : "This is the first line\nAnd the sec",
1134 self._raise_eintr,
1135 lambda : "ond line is here\n",
1136 lambda : "",
1137 ])
1138 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001139 self.assertEqual(fo.read(size), "This is the first line\n"
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001140 "And the second line is here\n")
1141
1142 def test_default(self):
1143 self._test_readline()
1144 self._test_readline(size=100)
1145 self._test_read()
1146 self._test_read(size=100)
1147
1148 def test_with_1k_buffer(self):
1149 self._test_readline(bufsize=1024)
1150 self._test_readline(size=100, bufsize=1024)
1151 self._test_read(bufsize=1024)
1152 self._test_read(size=100, bufsize=1024)
1153
1154 def _test_readline_no_buffer(self, size=-1):
1155 mock_sock = self.MockSocket(recv_funcs=[
1156 lambda : "aa",
1157 lambda : "\n",
1158 lambda : "BB",
1159 self._raise_eintr,
1160 lambda : "bb",
1161 lambda : "",
1162 ])
1163 fo = socket._fileobject(mock_sock, bufsize=0)
Ezio Melotti2623a372010-11-21 13:34:58 +00001164 self.assertEqual(fo.readline(size), "aa\n")
1165 self.assertEqual(fo.readline(size), "BBbb")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001166
1167 def test_no_buffer(self):
1168 self._test_readline_no_buffer()
1169 self._test_readline_no_buffer(size=4)
1170 self._test_read(bufsize=0)
1171 self._test_read(size=100, bufsize=0)
1172
1173
Guido van Rossume9f66142002-08-07 15:46:19 +00001174class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1175
1176 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001177
Guido van Rossume9f66142002-08-07 15:46:19 +00001178 In this case (and in this case only), it should be possible to
1179 create a file object, read a line from it, create another file
1180 object, read another line from it, without loss of data in the
1181 first file object's buffer. Note that httplib relies on this
1182 when reading multiple requests from the same socket."""
1183
1184 bufsize = 0 # Use unbuffered mode
1185
1186 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001187 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001188 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001189 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001190 self.serv_file = self.cli_conn.makefile('rb', 0)
1191 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001192 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001193
1194 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001195 self.cli_file.write("A. " + MSG)
1196 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001197 self.cli_file.flush()
1198
Guido van Rossum8c943832002-08-08 01:00:28 +00001199class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1200
1201 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1202
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001203 class SocketMemo(object):
1204 """A wrapper to keep track of sent data, needed to examine write behaviour"""
1205 def __init__(self, sock):
1206 self._sock = sock
1207 self.sent = []
1208
1209 def send(self, data, flags=0):
1210 n = self._sock.send(data, flags)
1211 self.sent.append(data[:n])
1212 return n
1213
1214 def sendall(self, data, flags=0):
1215 self._sock.sendall(data, flags)
1216 self.sent.append(data)
1217
1218 def __getattr__(self, attr):
1219 return getattr(self._sock, attr)
1220
1221 def getsent(self):
1222 return [e.tobytes() if isinstance(e, memoryview) else e for e in self.sent]
1223
1224 def setUp(self):
1225 FileObjectClassTestCase.setUp(self)
1226 self.serv_file._sock = self.SocketMemo(self.serv_file._sock)
1227
1228 def testLinebufferedWrite(self):
1229 # Write two lines, in small chunks
1230 msg = MSG.strip()
1231 print >> self.serv_file, msg,
1232 print >> self.serv_file, msg
1233
1234 # second line:
1235 print >> self.serv_file, msg,
1236 print >> self.serv_file, msg,
1237 print >> self.serv_file, msg
1238
1239 # third line
1240 print >> self.serv_file, ''
1241
1242 self.serv_file.flush()
1243
1244 msg1 = "%s %s\n"%(msg, msg)
1245 msg2 = "%s %s %s\n"%(msg, msg, msg)
1246 msg3 = "\n"
1247 self.assertEqual(self.serv_file._sock.getsent(), [msg1, msg2, msg3])
1248
1249 def _testLinebufferedWrite(self):
1250 msg = MSG.strip()
1251 msg1 = "%s %s\n"%(msg, msg)
1252 msg2 = "%s %s %s\n"%(msg, msg, msg)
1253 msg3 = "\n"
1254 l1 = self.cli_file.readline()
1255 self.assertEqual(l1, msg1)
1256 l2 = self.cli_file.readline()
1257 self.assertEqual(l2, msg2)
1258 l3 = self.cli_file.readline()
1259 self.assertEqual(l3, msg3)
1260
Guido van Rossum8c943832002-08-08 01:00:28 +00001261
1262class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1263
1264 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001265
Georg Brandldd7b0522007-01-21 10:35:10 +00001266
Facundo Batista07c78be2007-03-23 18:54:07 +00001267class NetworkConnectionTest(object):
1268 """Prove network connection."""
1269 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001270 # We're inherited below by BasicTCPTest2, which also inherits
1271 # BasicTCPTest, which defines self.port referenced below.
1272 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001273 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001274
Facundo Batista07c78be2007-03-23 18:54:07 +00001275class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1276 """Tests that NetworkConnection does not break existing TCP functionality.
1277 """
1278
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001279class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001280 class MockSocket(socket.socket):
1281 def connect(self, *args):
1282 raise socket.timeout('timed out')
1283
1284 @contextlib.contextmanager
1285 def mocked_socket_module(self):
1286 """Return a socket which times out on connect"""
1287 old_socket = socket.socket
1288 socket.socket = self.MockSocket
1289 try:
1290 yield
1291 finally:
1292 socket.socket = old_socket
1293
1294 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001295 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001296 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001297 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001298 with self.assertRaises(socket.error) as cm:
1299 cli.connect((HOST, port))
1300 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1301
1302 def test_create_connection(self):
1303 # Issue #9792: errors raised by create_connection() should have
1304 # a proper errno attribute.
1305 port = test_support.find_unused_port()
1306 with self.assertRaises(socket.error) as cm:
1307 socket.create_connection((HOST, port))
Trent Nelson6a7f8672012-10-18 01:35:32 -04001308
1309 # Issue #16257: create_connection() calls getaddrinfo() against
1310 # 'localhost'. This may result in an IPV6 addr being returned
1311 # as well as an IPV4 one:
1312 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1313 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1314 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1315 #
1316 # create_connection() enumerates through all the addresses returned
1317 # and if it doesn't successfully bind to any of them, it propagates
1318 # the last exception it encountered.
1319 #
1320 # On Solaris, ENETUNREACH is returned in this circumstance instead
1321 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1322 # expected errnos.
1323 expected_errnos = [ errno.ECONNREFUSED, ]
1324 if hasattr(errno, 'ENETUNREACH'):
1325 expected_errnos.append(errno.ENETUNREACH)
1326
1327 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001328
1329 def test_create_connection_timeout(self):
1330 # Issue #9792: create_connection() should not recast timeout errors
1331 # as generic socket errors.
1332 with self.mocked_socket_module():
1333 with self.assertRaises(socket.timeout):
1334 socket.create_connection((HOST, 1234))
1335
Facundo Batista07c78be2007-03-23 18:54:07 +00001336
Victor Stinner6a102812010-04-27 23:55:59 +00001337@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001338class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1339
1340 def __init__(self, methodName='runTest'):
1341 SocketTCPTest.__init__(self, methodName=methodName)
1342 ThreadableTest.__init__(self)
1343
1344 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001345 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001346
1347 def clientTearDown(self):
1348 self.cli.close()
1349 self.cli = None
1350 ThreadableTest.clientTearDown(self)
1351
1352 def _justAccept(self):
1353 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001354 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001355
1356 testFamily = _justAccept
1357 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001358 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001359 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001360 self.assertEqual(self.cli.family, 2)
1361
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001362 testSourceAddress = _justAccept
1363 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001364 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1365 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001366 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001367 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001368 # The port number being used is sufficient to show that the bind()
1369 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001370
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001371 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001372 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001373 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001374 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001375 socket.setdefaulttimeout(42)
1376 try:
1377 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001378 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001379 finally:
1380 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001381 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001382
1383 testTimeoutNone = _justAccept
1384 def _testTimeoutNone(self):
1385 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001386 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001387 socket.setdefaulttimeout(30)
1388 try:
1389 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001390 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001391 finally:
1392 socket.setdefaulttimeout(None)
1393 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001394
1395 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001396 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001397 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001398 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001399
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001400 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001401 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001402 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001403 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001404 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001405
Victor Stinner6a102812010-04-27 23:55:59 +00001406@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001407class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1408
1409 def __init__(self, methodName='runTest'):
1410 SocketTCPTest.__init__(self, methodName=methodName)
1411 ThreadableTest.__init__(self)
1412
1413 def clientSetUp(self):
1414 pass
1415
1416 def clientTearDown(self):
1417 self.cli.close()
1418 self.cli = None
1419 ThreadableTest.clientTearDown(self)
1420
Facundo Batista07c78be2007-03-23 18:54:07 +00001421 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001422 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001423 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001424 time.sleep(3)
1425 conn.send("done!")
1426 testOutsideTimeout = testInsideTimeout
1427
1428 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001429 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001430 data = sock.recv(5)
1431 self.assertEqual(data, "done!")
1432
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001433 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001434 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001435 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001436
1437
Georg Brandldd7b0522007-01-21 10:35:10 +00001438class Urllib2FileobjectTest(unittest.TestCase):
1439
1440 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1441 # it close the socket if the close c'tor argument is true
1442
1443 def testClose(self):
1444 class MockSocket:
1445 closed = False
1446 def flush(self): pass
1447 def close(self): self.closed = True
1448
1449 # must not close unless we request it: the original use of _fileobject
1450 # by module socket requires that the underlying socket not be closed until
1451 # the _socketobject that created the _fileobject is closed
1452 s = MockSocket()
1453 f = socket._fileobject(s)
1454 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001455 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001456
1457 s = MockSocket()
1458 f = socket._fileobject(s, close=True)
1459 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001460 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001461
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001462class TCPTimeoutTest(SocketTCPTest):
1463
1464 def testTCPTimeout(self):
1465 def raise_timeout(*args, **kwargs):
1466 self.serv.settimeout(1.0)
1467 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001468 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001469 "Error generating a timeout exception (TCP)")
1470
1471 def testTimeoutZero(self):
1472 ok = False
1473 try:
1474 self.serv.settimeout(0.0)
1475 foo = self.serv.accept()
1476 except socket.timeout:
1477 self.fail("caught timeout instead of error (TCP)")
1478 except socket.error:
1479 ok = True
1480 except:
1481 self.fail("caught unexpected exception (TCP)")
1482 if not ok:
1483 self.fail("accept() returned success when we did not expect it")
1484
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001485 @unittest.skipUnless(hasattr(signal, 'alarm'),
1486 'test needs signal.alarm()')
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001487 def testInterruptedTimeout(self):
1488 # XXX I don't know how to do this test on MSWindows or any other
1489 # plaform that doesn't support signal.alarm() or os.kill(), though
1490 # the bug should have existed on all platforms.
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001491 self.serv.settimeout(5.0) # must be longer than alarm
1492 class Alarm(Exception):
1493 pass
1494 def alarm_handler(signal, frame):
1495 raise Alarm
1496 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1497 try:
1498 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1499 try:
1500 foo = self.serv.accept()
1501 except socket.timeout:
1502 self.fail("caught timeout instead of Alarm")
1503 except Alarm:
1504 pass
1505 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001506 self.fail("caught other exception instead of Alarm:"
1507 " %s(%s):\n%s" %
1508 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001509 else:
1510 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001511 finally:
1512 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001513 except Alarm:
1514 self.fail("got Alarm in wrong place")
1515 finally:
1516 # no alarm can be pending. Safe to restore old handler.
1517 signal.signal(signal.SIGALRM, old_alarm)
1518
Ezio Melotti169ed592011-11-18 18:33:14 +02001519class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001520
1521 def testUDPTimeout(self):
1522 def raise_timeout(*args, **kwargs):
1523 self.serv.settimeout(1.0)
1524 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001525 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001526 "Error generating a timeout exception (UDP)")
1527
1528 def testTimeoutZero(self):
1529 ok = False
1530 try:
1531 self.serv.settimeout(0.0)
1532 foo = self.serv.recv(1024)
1533 except socket.timeout:
1534 self.fail("caught timeout instead of error (UDP)")
1535 except socket.error:
1536 ok = True
1537 except:
1538 self.fail("caught unexpected exception (UDP)")
1539 if not ok:
1540 self.fail("recv() returned success when we did not expect it")
1541
1542class TestExceptions(unittest.TestCase):
1543
1544 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001545 self.assertTrue(issubclass(socket.error, Exception))
1546 self.assertTrue(issubclass(socket.herror, socket.error))
1547 self.assertTrue(issubclass(socket.gaierror, socket.error))
1548 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001549
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001550@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Armin Rigoa9017c32006-04-19 11:50:27 +00001551class TestLinuxAbstractNamespace(unittest.TestCase):
1552
1553 UNIX_PATH_MAX = 108
1554
1555 def testLinuxAbstractNamespace(self):
1556 address = "\x00python-test-hello\x00\xff"
1557 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1558 s1.bind(address)
1559 s1.listen(1)
1560 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1561 s2.connect(s1.getsockname())
1562 s1.accept()
1563 self.assertEqual(s1.getsockname(), address)
1564 self.assertEqual(s2.getpeername(), address)
1565
1566 def testMaxName(self):
1567 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1568 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1569 s.bind(address)
1570 self.assertEqual(s.getsockname(), address)
1571
1572 def testNameOverflow(self):
1573 address = "\x00" + "h" * self.UNIX_PATH_MAX
1574 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1575 self.assertRaises(socket.error, s.bind, address)
1576
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001577
Victor Stinner6a102812010-04-27 23:55:59 +00001578@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001579class BufferIOTest(SocketConnectedTest):
1580 """
1581 Test the buffer versions of socket.recv() and socket.send().
1582 """
1583 def __init__(self, methodName='runTest'):
1584 SocketConnectedTest.__init__(self, methodName=methodName)
1585
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001586 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001587 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001588 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001589 self.assertEqual(nbytes, len(MSG))
1590 msg = buf.tostring()[:len(MSG)]
1591 self.assertEqual(msg, MSG)
1592
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001593 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001594 with test_support.check_py3k_warnings():
1595 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001596 self.serv_conn.send(buf)
1597
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001598 def testRecvIntoBytearray(self):
1599 buf = bytearray(1024)
1600 nbytes = self.cli_conn.recv_into(buf)
1601 self.assertEqual(nbytes, len(MSG))
1602 msg = buf[:len(MSG)]
1603 self.assertEqual(msg, MSG)
1604
1605 _testRecvIntoBytearray = _testRecvIntoArray
1606
1607 def testRecvIntoMemoryview(self):
1608 buf = bytearray(1024)
1609 nbytes = self.cli_conn.recv_into(memoryview(buf))
1610 self.assertEqual(nbytes, len(MSG))
1611 msg = buf[:len(MSG)]
1612 self.assertEqual(msg, MSG)
1613
1614 _testRecvIntoMemoryview = _testRecvIntoArray
1615
1616 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001617 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001618 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001619 self.assertEqual(nbytes, len(MSG))
1620 msg = buf.tostring()[:len(MSG)]
1621 self.assertEqual(msg, MSG)
1622
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001623 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001624 with test_support.check_py3k_warnings():
1625 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001626 self.serv_conn.send(buf)
1627
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001628 def testRecvFromIntoBytearray(self):
1629 buf = bytearray(1024)
1630 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1631 self.assertEqual(nbytes, len(MSG))
1632 msg = buf[:len(MSG)]
1633 self.assertEqual(msg, MSG)
1634
1635 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1636
1637 def testRecvFromIntoMemoryview(self):
1638 buf = bytearray(1024)
1639 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1640 self.assertEqual(nbytes, len(MSG))
1641 msg = buf[:len(MSG)]
1642 self.assertEqual(msg, MSG)
1643
1644 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1645
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001646 def testRecvFromIntoSmallBuffer(self):
1647 # See issue #20246.
1648 buf = bytearray(8)
1649 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
1650
1651 def _testRecvFromIntoSmallBuffer(self):
1652 with test_support.check_py3k_warnings():
Stefan Krah70df6672014-01-21 23:05:52 +01001653 buf = buffer(MSG)
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001654 self.serv_conn.send(buf)
1655
Benjamin Petersond93d6332014-01-14 00:27:42 -05001656 def testRecvFromIntoEmptyBuffer(self):
1657 buf = bytearray()
1658 self.cli_conn.recvfrom_into(buf)
1659 self.cli_conn.recvfrom_into(buf, 0)
1660
1661 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
1662
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001663
1664TIPC_STYPE = 2000
1665TIPC_LOWER = 200
1666TIPC_UPPER = 210
1667
1668def isTipcAvailable():
1669 """Check if the TIPC module is loaded
1670
1671 The TIPC module is not loaded automatically on Ubuntu and probably
1672 other Linux distros.
1673 """
1674 if not hasattr(socket, "AF_TIPC"):
1675 return False
1676 if not os.path.isfile("/proc/modules"):
1677 return False
1678 with open("/proc/modules") as f:
1679 for line in f:
1680 if line.startswith("tipc "):
1681 return True
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001682 return False
1683
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001684@unittest.skipUnless(isTipcAvailable(),
1685 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1686class TIPCTest(unittest.TestCase):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001687 def testRDM(self):
1688 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1689 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1690
1691 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1692 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1693 TIPC_LOWER, TIPC_UPPER)
1694 srv.bind(srvaddr)
1695
1696 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1697 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1698 cli.sendto(MSG, sendaddr)
1699
1700 msg, recvaddr = srv.recvfrom(1024)
1701
1702 self.assertEqual(cli.getsockname(), recvaddr)
1703 self.assertEqual(msg, MSG)
1704
1705
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001706@unittest.skipUnless(isTipcAvailable(),
1707 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1708class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001709 def __init__(self, methodName = 'runTest'):
1710 unittest.TestCase.__init__(self, methodName = methodName)
1711 ThreadableTest.__init__(self)
1712
1713 def setUp(self):
1714 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1715 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1716 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1717 TIPC_LOWER, TIPC_UPPER)
1718 self.srv.bind(srvaddr)
1719 self.srv.listen(5)
1720 self.serverExplicitReady()
1721 self.conn, self.connaddr = self.srv.accept()
1722
1723 def clientSetUp(self):
1724 # The is a hittable race between serverExplicitReady() and the
1725 # accept() call; sleep a little while to avoid it, otherwise
1726 # we could get an exception
1727 time.sleep(0.1)
1728 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1729 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1730 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1731 self.cli.connect(addr)
1732 self.cliaddr = self.cli.getsockname()
1733
1734 def testStream(self):
1735 msg = self.conn.recv(1024)
1736 self.assertEqual(msg, MSG)
1737 self.assertEqual(self.cliaddr, self.connaddr)
1738
1739 def _testStream(self):
1740 self.cli.send(MSG)
1741 self.cli.close()
1742
1743
Guido van Rossumb995eb72002-07-31 16:08:40 +00001744def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001745 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001746 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1747 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001748
1749 tests.extend([
1750 NonBlockingTCPTests,
1751 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001752 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001753 UnbufferedFileObjectClassTestCase,
1754 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001755 SmallBufferedFileObjectClassTestCase,
1756 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001757 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001758 NetworkConnectionAttributesTest,
1759 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001760 ])
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001761 tests.append(BasicSocketPairTest)
1762 tests.append(TestLinuxAbstractNamespace)
1763 tests.extend([TIPCTest, TIPCThreadableTest])
Neal Norwitz9602cc22006-06-18 19:35:01 +00001764
1765 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001766 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001767 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001768
1769if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001770 test_main()