blob: 28fd37813f03677371a4971c6e657ee66c7e4e8b [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
Charles-François Natali5a1427c2014-07-26 13:44:50 +01005import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00008import time
9import traceback
Georg Brandla6168f92008-05-25 07:20:14 +000010import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000011import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000012import os
Martin Blais2856e5f2006-05-26 12:03:27 +000013import array
Antoine Pitrouc818ed42010-09-07 21:40:25 +000014import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000015from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000016import signal
Antoine Pitrou66b5df62010-09-27 18:16:46 +000017import math
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Giampaolo Rodolà633e4742010-08-14 17:04:46 +000019def try_address(host, port=0, family=socket.AF_INET):
20 """Try to bind a socket on the given host:port and return True
21 if that has been possible."""
22 try:
23 sock = socket.socket(family, socket.SOCK_STREAM)
24 sock.bind((host, port))
25 except (socket.error, socket.gaierror):
26 return False
27 else:
28 sock.close()
29 return True
30
31HOST = test_support.HOST
32MSG = b'Michael Gilfix was here\n'
33SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
34
Victor Stinner6a102812010-04-27 23:55:59 +000035try:
36 import thread
37 import threading
38except ImportError:
39 thread = None
40 threading = None
41
Trent Nelsone41b0062008-04-08 23:47:30 +000042HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000043MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000044
Guido van Rossum24e4af82002-06-12 19:18:08 +000045class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000046
Guido van Rossum24e4af82002-06-12 19:18:08 +000047 def setUp(self):
48 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000049 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000050 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000051
Guido van Rossum24e4af82002-06-12 19:18:08 +000052 def tearDown(self):
53 self.serv.close()
54 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000055
Guido van Rossum24e4af82002-06-12 19:18:08 +000056class SocketUDPTest(unittest.TestCase):
57
58 def setUp(self):
59 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000060 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000061
62 def tearDown(self):
63 self.serv.close()
64 self.serv = None
65
66class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000067 """Threadable Test class
68
69 The ThreadableTest class makes it easy to create a threaded
70 client/server pair from an existing unit test. To create a
71 new threaded class from an existing unit test, use multiple
72 inheritance:
73
74 class NewClass (OldClass, ThreadableTest):
75 pass
76
77 This class defines two new fixture functions with obvious
78 purposes for overriding:
79
80 clientSetUp ()
81 clientTearDown ()
82
83 Any new test functions within the class must then define
84 tests in pairs, where the test name is preceeded with a
85 '_' to indicate the client portion of the test. Ex:
86
87 def testFoo(self):
88 # Server portion
89
90 def _testFoo(self):
91 # Client portion
92
93 Any exceptions raised by the clients during their tests
94 are caught and transferred to the main thread to alert
95 the testing framework.
96
97 Note, the server setup function cannot call any blocking
98 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000099 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000100 the blocking call (such as in setting up a client/server
101 connection and performing the accept() in setUp().
102 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000103
104 def __init__(self):
105 # Swap the true setup function
106 self.__setUp = self.setUp
107 self.__tearDown = self.tearDown
108 self.setUp = self._setUp
109 self.tearDown = self._tearDown
110
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 def serverExplicitReady(self):
112 """This method allows the server to explicitly indicate that
113 it wants the client thread to proceed. This is useful if the
114 server is about to execute a blocking routine that is
115 dependent upon the client thread during its setup routine."""
116 self.server_ready.set()
117
Guido van Rossum24e4af82002-06-12 19:18:08 +0000118 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000119 self.server_ready = threading.Event()
120 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +0000122 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123
124 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000125 methodname = self.id()
126 i = methodname.rfind('.')
127 methodname = methodname[i+1:]
128 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000129 self.client_thread = thread.start_new_thread(
130 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000131
132 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000133 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000134 self.server_ready.set()
135 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 def _tearDown(self):
138 self.__tearDown()
139 self.done.wait()
140
141 if not self.queue.empty():
142 msg = self.queue.get()
143 self.fail(msg)
144
145 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000147 self.clientSetUp()
Charles-François Natali21565942011-09-21 22:02:27 +0200148 self.client_ready.set()
Ezio Melottib22c3fe2011-11-06 17:50:52 +0200149 if not callable(test_func):
150 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000151 try:
152 test_func()
153 except Exception, strerror:
154 self.queue.put(strerror)
155 self.clientTearDown()
156
157 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000158 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000159
160 def clientTearDown(self):
161 self.done.set()
162 thread.exit()
163
164class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
165
166 def __init__(self, methodName='runTest'):
167 SocketTCPTest.__init__(self, methodName=methodName)
168 ThreadableTest.__init__(self)
169
170 def clientSetUp(self):
171 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
172
173 def clientTearDown(self):
174 self.cli.close()
175 self.cli = None
176 ThreadableTest.clientTearDown(self)
177
178class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
179
180 def __init__(self, methodName='runTest'):
181 SocketUDPTest.__init__(self, methodName=methodName)
182 ThreadableTest.__init__(self)
183
184 def clientSetUp(self):
185 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
186
Brian Curtindd8564f2010-11-04 03:54:23 +0000187 def clientTearDown(self):
188 self.cli.close()
189 self.cli = None
190 ThreadableTest.clientTearDown(self)
191
Guido van Rossum24e4af82002-06-12 19:18:08 +0000192class SocketConnectedTest(ThreadedTCPSocketTest):
193
194 def __init__(self, methodName='runTest'):
195 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
196
197 def setUp(self):
198 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000199 # Indicate explicitly we're ready for the client thread to
200 # proceed and then perform the blocking call to accept
201 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000202 conn, addr = self.serv.accept()
203 self.cli_conn = conn
204
205 def tearDown(self):
206 self.cli_conn.close()
207 self.cli_conn = None
208 ThreadedTCPSocketTest.tearDown(self)
209
210 def clientSetUp(self):
211 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000212 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000213 self.serv_conn = self.cli
214
215 def clientTearDown(self):
216 self.serv_conn.close()
217 self.serv_conn = None
218 ThreadedTCPSocketTest.clientTearDown(self)
219
Dave Cole331708b2004-08-09 04:51:41 +0000220class SocketPairTest(unittest.TestCase, ThreadableTest):
221
222 def __init__(self, methodName='runTest'):
223 unittest.TestCase.__init__(self, methodName=methodName)
224 ThreadableTest.__init__(self)
225
226 def setUp(self):
227 self.serv, self.cli = socket.socketpair()
228
229 def tearDown(self):
230 self.serv.close()
231 self.serv = None
232
233 def clientSetUp(self):
234 pass
235
236 def clientTearDown(self):
237 self.cli.close()
238 self.cli = None
239 ThreadableTest.clientTearDown(self)
240
Tim Peters494aaee2004-08-09 18:54:11 +0000241
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242#######################################################################
243## Begin Tests
244
245class GeneralModuleTests(unittest.TestCase):
246
Raymond Hettinger027bb632004-05-31 03:09:25 +0000247 def test_weakref(self):
248 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
249 p = proxy(s)
250 self.assertEqual(p.fileno(), s.fileno())
251 s.close()
252 s = None
253 try:
254 p.fileno()
255 except ReferenceError:
256 pass
257 else:
258 self.fail('Socket proxy still exists')
259
Guido van Rossum24e4af82002-06-12 19:18:08 +0000260 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000261 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262 def raise_error(*args, **kwargs):
263 raise socket.error
264 def raise_herror(*args, **kwargs):
265 raise socket.herror
266 def raise_gaierror(*args, **kwargs):
267 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000268 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000269 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000270 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000272 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 "Error raising socket exception.")
274
Ezio Melotti0639be62011-05-07 19:21:22 +0300275 def testSendtoErrors(self):
276 # Testing that sendto doens't masks failures. See #10169.
277 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
278 self.addCleanup(s.close)
279 s.bind(('', 0))
280 sockname = s.getsockname()
281 # 2 args
282 with self.assertRaises(UnicodeEncodeError):
283 s.sendto(u'\u2620', sockname)
284 with self.assertRaises(TypeError) as cm:
285 s.sendto(5j, sockname)
286 self.assertIn('not complex', str(cm.exception))
287 with self.assertRaises(TypeError) as cm:
288 s.sendto('foo', None)
289 self.assertIn('not NoneType', str(cm.exception))
290 # 3 args
291 with self.assertRaises(UnicodeEncodeError):
292 s.sendto(u'\u2620', 0, sockname)
293 with self.assertRaises(TypeError) as cm:
294 s.sendto(5j, 0, sockname)
295 self.assertIn('not complex', str(cm.exception))
296 with self.assertRaises(TypeError) as cm:
297 s.sendto('foo', 0, None)
298 self.assertIn('not NoneType', str(cm.exception))
299 with self.assertRaises(TypeError) as cm:
300 s.sendto('foo', 'bar', sockname)
301 self.assertIn('an integer is required', str(cm.exception))
302 with self.assertRaises(TypeError) as cm:
303 s.sendto('foo', None, None)
304 self.assertIn('an integer is required', str(cm.exception))
305 # wrong number of args
306 with self.assertRaises(TypeError) as cm:
307 s.sendto('foo')
308 self.assertIn('(1 given)', str(cm.exception))
309 with self.assertRaises(TypeError) as cm:
310 s.sendto('foo', 0, sockname, 4)
311 self.assertIn('(4 given)', str(cm.exception))
312
313
Guido van Rossum24e4af82002-06-12 19:18:08 +0000314 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000315 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000316 socket.AF_INET
317 socket.SOCK_STREAM
318 socket.SOCK_DGRAM
319 socket.SOCK_RAW
320 socket.SOCK_RDM
321 socket.SOCK_SEQPACKET
322 socket.SOL_SOCKET
323 socket.SO_REUSEADDR
324
Guido van Rossum654c11e2002-06-13 20:24:17 +0000325 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000326 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000327 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000328 try:
329 ip = socket.gethostbyname(hostname)
330 except socket.error:
331 # Probably name lookup wasn't set up right; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600332 self.skipTest('name lookup failure')
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000333 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000334 try:
335 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
336 except socket.error:
337 # Probably a similar problem as above; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600338 self.skipTest('address lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000339 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000340 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000341 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000342 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000343
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200344 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
345 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000346 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000347 # Testing reference count for getnameinfo
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200348 try:
349 # On some versions, this loses a reference
350 orig = sys.getrefcount(__name__)
351 socket.getnameinfo(__name__,0)
352 except TypeError:
353 self.assertEqual(sys.getrefcount(__name__), orig,
354 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000355
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000357 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000358 try:
359 # On some versions, this crashes the interpreter.
360 socket.getnameinfo(('x', 0, 0, 0), 0)
361 except socket.error:
362 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000363
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000364 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000365 # This just checks that htons etc. are their own inverse,
366 # when looking at the lower 16 or 32 bits.
367 sizes = {socket.htonl: 32, socket.ntohl: 32,
368 socket.htons: 16, socket.ntohs: 16}
369 for func, size in sizes.items():
370 mask = (1L<<size) - 1
371 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
372 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000373
Guido van Rossuma2627af2002-09-14 00:58:46 +0000374 swapped = func(mask)
375 self.assertEqual(swapped & mask, mask)
376 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000377
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000378 def testNtoHErrors(self):
379 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
380 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
381 for k in good_values:
382 socket.ntohl(k)
383 socket.ntohs(k)
384 socket.htonl(k)
385 socket.htons(k)
386 for k in bad_values:
387 self.assertRaises(OverflowError, socket.ntohl, k)
388 self.assertRaises(OverflowError, socket.ntohs, k)
389 self.assertRaises(OverflowError, socket.htonl, k)
390 self.assertRaises(OverflowError, socket.htons, k)
391
Barry Warsaw11b91a02004-06-28 00:50:43 +0000392 def testGetServBy(self):
393 eq = self.assertEqual
394 # Find one service that exists, then check all the related interfaces.
395 # I've ordered this by protocols that have both a tcp and udp
396 # protocol, at least for modern Linuxes.
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000397 if (sys.platform.startswith('linux') or
398 sys.platform.startswith('freebsd') or
399 sys.platform.startswith('netbsd') or
400 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000401 # avoid the 'echo' service on this platform, as there is an
402 # assumption breaking non-standard port/protocol entry
403 services = ('daytime', 'qotd', 'domain')
404 else:
405 services = ('echo', 'daytime', 'domain')
406 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000407 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000408 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000409 break
410 except socket.error:
411 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000412 else:
413 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000414 # Try same call with optional protocol omitted
415 port2 = socket.getservbyname(service)
416 eq(port, port2)
Terry Jan Reedya70f60a2013-03-11 17:56:17 -0400417 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000418 try:
419 udpport = socket.getservbyname(service, 'udp')
420 except socket.error:
421 udpport = None
422 else:
423 eq(udpport, port)
424 # Now make sure the lookup by port returns the same service name
425 eq(socket.getservbyport(port2), service)
426 eq(socket.getservbyport(port, 'tcp'), service)
427 if udpport is not None:
428 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000429 # Make sure getservbyport does not accept out of range ports.
430 self.assertRaises(OverflowError, socket.getservbyport, -1)
431 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000432
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000433 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000434 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000435 # The default timeout should initially be None
436 self.assertEqual(socket.getdefaulttimeout(), None)
437 s = socket.socket()
438 self.assertEqual(s.gettimeout(), None)
439 s.close()
440
441 # Set the default timeout to 10, and see if it propagates
442 socket.setdefaulttimeout(10)
443 self.assertEqual(socket.getdefaulttimeout(), 10)
444 s = socket.socket()
445 self.assertEqual(s.gettimeout(), 10)
446 s.close()
447
448 # Reset the default timeout to None, and see if it propagates
449 socket.setdefaulttimeout(None)
450 self.assertEqual(socket.getdefaulttimeout(), None)
451 s = socket.socket()
452 self.assertEqual(s.gettimeout(), None)
453 s.close()
454
455 # Check that setting it to an invalid value raises ValueError
456 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
457
458 # Check that setting it to an invalid type raises TypeError
459 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
460
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200461 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
462 'test needs socket.inet_aton()')
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000463 def testIPv4_inet_aton_fourbytes(self):
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000464 # Test that issue1008086 and issue767150 are fixed.
465 # It must return 4 bytes.
Ezio Melotti2623a372010-11-21 13:34:58 +0000466 self.assertEqual('\x00'*4, socket.inet_aton('0.0.0.0'))
467 self.assertEqual('\xff'*4, socket.inet_aton('255.255.255.255'))
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000468
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200469 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
470 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000471 def testIPv4toString(self):
472 from socket import inet_aton as f, inet_pton, AF_INET
473 g = lambda a: inet_pton(AF_INET, a)
474
Ezio Melotti2623a372010-11-21 13:34:58 +0000475 self.assertEqual('\x00\x00\x00\x00', f('0.0.0.0'))
476 self.assertEqual('\xff\x00\xff\x00', f('255.0.255.0'))
477 self.assertEqual('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
478 self.assertEqual('\x01\x02\x03\x04', f('1.2.3.4'))
479 self.assertEqual('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000480
Ezio Melotti2623a372010-11-21 13:34:58 +0000481 self.assertEqual('\x00\x00\x00\x00', g('0.0.0.0'))
482 self.assertEqual('\xff\x00\xff\x00', g('255.0.255.0'))
483 self.assertEqual('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
484 self.assertEqual('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000485
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200486 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
487 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000488 def testIPv6toString(self):
489 try:
490 from socket import inet_pton, AF_INET6, has_ipv6
491 if not has_ipv6:
Zachary Ware1f702212013-12-10 14:09:20 -0600492 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000493 except ImportError:
Zachary Ware1f702212013-12-10 14:09:20 -0600494 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000495 f = lambda a: inet_pton(AF_INET6, a)
496
Ezio Melotti2623a372010-11-21 13:34:58 +0000497 self.assertEqual('\x00' * 16, f('::'))
498 self.assertEqual('\x00' * 16, f('0::0'))
499 self.assertEqual('\x00\x01' + '\x00' * 14, f('1::'))
500 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000501 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
502 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
503 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000504
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200505 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
506 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000507 def testStringToIPv4(self):
508 from socket import inet_ntoa as f, inet_ntop, AF_INET
509 g = lambda a: inet_ntop(AF_INET, a)
510
Ezio Melotti2623a372010-11-21 13:34:58 +0000511 self.assertEqual('1.0.1.0', f('\x01\x00\x01\x00'))
512 self.assertEqual('170.85.170.85', f('\xaa\x55\xaa\x55'))
513 self.assertEqual('255.255.255.255', f('\xff\xff\xff\xff'))
514 self.assertEqual('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000515
Ezio Melotti2623a372010-11-21 13:34:58 +0000516 self.assertEqual('1.0.1.0', g('\x01\x00\x01\x00'))
517 self.assertEqual('170.85.170.85', g('\xaa\x55\xaa\x55'))
518 self.assertEqual('255.255.255.255', g('\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000519
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200520 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
521 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000522 def testStringToIPv6(self):
523 try:
524 from socket import inet_ntop, AF_INET6, has_ipv6
525 if not has_ipv6:
Zachary Ware1f702212013-12-10 14:09:20 -0600526 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000527 except ImportError:
Zachary Ware1f702212013-12-10 14:09:20 -0600528 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000529 f = lambda a: inet_ntop(AF_INET6, a)
530
Ezio Melotti2623a372010-11-21 13:34:58 +0000531 self.assertEqual('::', f('\x00' * 16))
532 self.assertEqual('::1', f('\x00' * 15 + '\x01'))
533 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000534 'aef:b01:506:1001:ffff:9997:55:170',
535 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
536 )
537
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000538 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000539
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000540 def _get_unused_port(self, bind_address='0.0.0.0'):
541 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000542
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000543 Args:
544 bind_address: Hostname or IP address to search for a port on.
545
546 Returns: A most likely to be unused port.
547 """
548 tempsock = socket.socket()
549 tempsock.bind((bind_address, 0))
550 host, port = tempsock.getsockname()
551 tempsock.close()
552 return port
553
554 def testSockName(self):
555 # Testing getsockname()
556 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000558 self.addCleanup(sock.close)
Trent Nelsone41b0062008-04-08 23:47:30 +0000559 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000561 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
562 # it reasonable to get the host's addr in addition to 0.0.0.0.
563 # At least for eCos. This is required for the S/390 to pass.
Georg Brandlb7276502010-11-26 08:28:05 +0000564 try:
565 my_ip_addr = socket.gethostbyname(socket.gethostname())
566 except socket.error:
567 # Probably name lookup wasn't set up right; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600568 self.skipTest('name lookup failure')
Ezio Melottiaa980582010-01-23 23:04:36 +0000569 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000570 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571
572 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000573 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000574 # We know a socket should start without reuse==0
575 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000576 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000577 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000578 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000579
580 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000581 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000582 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000583 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
585 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000586 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000588 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000589 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000590 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
591 sock.settimeout(1)
592 sock.close()
593 self.assertRaises(socket.error, sock.send, "spam")
594
Georg Brandlbb03ac02006-03-21 18:17:25 +0000595 def testNewAttributes(self):
596 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000597 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000598 self.assertEqual(sock.family, socket.AF_INET)
599 self.assertEqual(sock.type, socket.SOCK_STREAM)
600 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000601 sock.close()
602
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000603 def test_getsockaddrarg(self):
Charles-François Natali5a1427c2014-07-26 13:44:50 +0100604 sock = socket.socket()
605 self.addCleanup(sock.close)
606 port = test_support.find_unused_port()
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000607 big_port = port + 65536
608 neg_port = port - 65536
Charles-François Natali5a1427c2014-07-26 13:44:50 +0100609 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
610 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
611 # Since find_unused_port() is inherently subject to race conditions, we
612 # call it a couple times if necessary.
613 for i in itertools.count():
614 port = test_support.find_unused_port()
615 try:
616 sock.bind((HOST, port))
617 except OSError as e:
618 if e.errno != errno.EADDRINUSE or i == 5:
619 raise
620 else:
621 break
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000622
Brian Curtin91a5b812010-11-05 15:52:20 +0000623 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesa47b75b2008-01-04 15:48:06 +0000624 def test_sock_ioctl(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000625 self.assertTrue(hasattr(socket.socket, 'ioctl'))
626 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
627 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
628 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000629 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
630 s = socket.socket()
Brian Curtin91a5b812010-11-05 15:52:20 +0000631 self.addCleanup(s.close)
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000632 self.assertRaises(ValueError, s.ioctl, -1, None)
633 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000634
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000635 def testGetaddrinfo(self):
636 try:
637 socket.getaddrinfo('localhost', 80)
638 except socket.gaierror as err:
639 if err.errno == socket.EAI_SERVICE:
640 # see http://bugs.python.org/issue1282647
641 self.skipTest("buggy libc version")
642 raise
643 # len of every sequence is supposed to be == 5
644 for info in socket.getaddrinfo(HOST, None):
645 self.assertEqual(len(info), 5)
646 # host can be a domain name, a string representation of an
647 # IPv4/v6 address or None
648 socket.getaddrinfo('localhost', 80)
649 socket.getaddrinfo('127.0.0.1', 80)
650 socket.getaddrinfo(None, 80)
651 if SUPPORTS_IPV6:
652 socket.getaddrinfo('::1', 80)
653 # port can be a string service name such as "http", a numeric
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200654 # port number (int or long), or None
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000655 socket.getaddrinfo(HOST, "http")
656 socket.getaddrinfo(HOST, 80)
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200657 socket.getaddrinfo(HOST, 80L)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000658 socket.getaddrinfo(HOST, None)
659 # test family and socktype filters
660 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
661 for family, _, _, _, _ in infos:
662 self.assertEqual(family, socket.AF_INET)
663 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
664 for _, socktype, _, _, _ in infos:
665 self.assertEqual(socktype, socket.SOCK_STREAM)
666 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000667 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000668 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
669 # a server willing to support both IPv4 and IPv6 will
670 # usually do this
671 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
672 socket.AI_PASSIVE)
673
Ned Deilye789a1d2014-02-13 22:49:30 -0800674 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussoren0e6283e2013-06-10 10:35:36 +0200675 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilye789a1d2014-02-13 22:49:30 -0800676 try:
677 # The arguments here are undefined and the call may succeed
678 # or fail. All we care here is that it doesn't segfault.
679 socket.getaddrinfo("localhost", None, 0, 0, 0,
680 socket.AI_NUMERICSERV)
681 except socket.gaierror:
682 pass
Christian Heimesa47b75b2008-01-04 15:48:06 +0000683
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000684 def check_sendall_interrupted(self, with_timeout):
685 # socketpair() is not stricly required, but it makes things easier.
686 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
687 self.skipTest("signal.alarm and socket.socketpair required for this test")
688 # Our signal handlers clobber the C errno by calling a math function
689 # with an invalid domain value.
690 def ok_handler(*args):
691 self.assertRaises(ValueError, math.acosh, 0)
692 def raising_handler(*args):
693 self.assertRaises(ValueError, math.acosh, 0)
694 1 // 0
695 c, s = socket.socketpair()
696 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
697 try:
698 if with_timeout:
699 # Just above the one second minimum for signal.alarm
700 c.settimeout(1.5)
701 with self.assertRaises(ZeroDivisionError):
702 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200703 c.sendall(b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000704 if with_timeout:
705 signal.signal(signal.SIGALRM, ok_handler)
706 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200707 self.assertRaises(socket.timeout, c.sendall,
708 b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000709 finally:
710 signal.signal(signal.SIGALRM, old_alarm)
711 c.close()
712 s.close()
713
714 def test_sendall_interrupted(self):
715 self.check_sendall_interrupted(False)
716
717 def test_sendall_interrupted_with_timeout(self):
718 self.check_sendall_interrupted(True)
719
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200720 def test_listen_backlog(self):
721 for backlog in 0, -1:
722 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
723 srv.bind((HOST, 0))
724 srv.listen(backlog)
725 srv.close()
726
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200727 @test_support.cpython_only
728 def test_listen_backlog_overflow(self):
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200729 # Issue 15989
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200730 import _testcapi
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200731 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
732 srv.bind((HOST, 0))
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200733 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200734 srv.close()
735
Charles-François Natali3aa59e32012-01-02 15:38:27 +0100736 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
737 def test_flowinfo(self):
738 self.assertRaises(OverflowError, socket.getnameinfo,
739 ('::1',0, 0xffffffff), 0)
740 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
741 try:
742 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
743 finally:
744 s.close()
745
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000746
Victor Stinner6a102812010-04-27 23:55:59 +0000747@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748class BasicTCPTest(SocketConnectedTest):
749
750 def __init__(self, methodName='runTest'):
751 SocketConnectedTest.__init__(self, methodName=methodName)
752
753 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000754 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000756 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757
758 def _testRecv(self):
759 self.serv_conn.send(MSG)
760
761 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000762 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000763 seg1 = self.cli_conn.recv(len(MSG) - 3)
764 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000765 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000766 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000767
768 def _testOverFlowRecv(self):
769 self.serv_conn.send(MSG)
770
771 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000772 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000774 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775
776 def _testRecvFrom(self):
777 self.serv_conn.send(MSG)
778
779 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000780 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
782 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000783 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000784 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785
786 def _testOverFlowRecvFrom(self):
787 self.serv_conn.send(MSG)
788
789 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000790 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000791 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000792 while 1:
793 read = self.cli_conn.recv(1024)
794 if not read:
795 break
Guido van Rossume531e292002-08-08 20:28:34 +0000796 msg += read
797 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798
799 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000800 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000801 self.serv_conn.sendall(big_chunk)
802
Zachary Ware1f702212013-12-10 14:09:20 -0600803 @unittest.skipUnless(hasattr(socket, 'fromfd'),
804 'socket.fromfd not availble')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000805 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000806 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000807 fd = self.cli_conn.fileno()
808 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000809 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000810 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000811 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812
813 def _testFromFd(self):
814 self.serv_conn.send(MSG)
815
Brian Curtin62c20b62010-11-02 02:59:55 +0000816 def testDup(self):
817 # Testing dup()
818 sock = self.cli_conn.dup()
819 self.addCleanup(sock.close)
820 msg = sock.recv(1024)
821 self.assertEqual(msg, MSG)
822
823 def _testDup(self):
824 self.serv_conn.send(MSG)
825
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000827 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000829 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000830 # wait for _testShutdown to finish: on OS X, when the server
831 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000832 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000833 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834
835 def _testShutdown(self):
836 self.serv_conn.send(MSG)
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200837 self.serv_conn.shutdown(2)
838
839 testShutdown_overflow = test_support.cpython_only(testShutdown)
840
841 @test_support.cpython_only
842 def _testShutdown_overflow(self):
843 import _testcapi
844 self.serv_conn.send(MSG)
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200845 # Issue 15989
846 self.assertRaises(OverflowError, self.serv_conn.shutdown,
847 _testcapi.INT_MAX + 1)
848 self.assertRaises(OverflowError, self.serv_conn.shutdown,
849 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850 self.serv_conn.shutdown(2)
851
Victor Stinner6a102812010-04-27 23:55:59 +0000852@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853class BasicUDPTest(ThreadedUDPSocketTest):
854
855 def __init__(self, methodName='runTest'):
856 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
857
858 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000859 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000861 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862
863 def _testSendtoAndRecv(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
Guido van Rossum1c938012002-06-12 21:17:20 +0000866 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000867 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000869 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870
Guido van Rossum1c938012002-06-12 21:17:20 +0000871 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000872 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000873
Facundo Batista1fe9f962007-03-28 03:45:20 +0000874 def testRecvFromNegative(self):
875 # Negative lengths passed to recvfrom should give ValueError.
876 self.assertRaises(ValueError, self.serv.recvfrom, -1)
877
878 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000879 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000880
Victor Stinner6a102812010-04-27 23:55:59 +0000881@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000882class TCPCloserTest(ThreadedTCPSocketTest):
883
884 def testClose(self):
885 conn, addr = self.serv.accept()
886 conn.close()
887
888 sd = self.cli
889 read, write, err = select.select([sd], [], [], 1.0)
890 self.assertEqual(read, [sd])
891 self.assertEqual(sd.recv(1), '')
892
893 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000894 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000895 time.sleep(1.0)
896
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200897@unittest.skipUnless(hasattr(socket, 'socketpair'),
898 'test needs socket.socketpair()')
Victor Stinner6a102812010-04-27 23:55:59 +0000899@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000900class BasicSocketPairTest(SocketPairTest):
901
902 def __init__(self, methodName='runTest'):
903 SocketPairTest.__init__(self, methodName=methodName)
904
905 def testRecv(self):
906 msg = self.serv.recv(1024)
907 self.assertEqual(msg, MSG)
908
909 def _testRecv(self):
910 self.cli.send(MSG)
911
912 def testSend(self):
913 self.serv.send(MSG)
914
915 def _testSend(self):
916 msg = self.cli.recv(1024)
917 self.assertEqual(msg, MSG)
918
Victor Stinner6a102812010-04-27 23:55:59 +0000919@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920class NonBlockingTCPTests(ThreadedTCPSocketTest):
921
922 def __init__(self, methodName='runTest'):
923 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
924
925 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000926 # Testing whether set blocking works
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200927 self.serv.setblocking(True)
928 self.assertIsNone(self.serv.gettimeout())
929 self.serv.setblocking(False)
930 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931 start = time.time()
932 try:
933 self.serv.accept()
934 except socket.error:
935 pass
936 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000937 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000938
939 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000940 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000941
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200942 @test_support.cpython_only
943 def testSetBlocking_overflow(self):
944 # Issue 15989
945 import _testcapi
946 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
947 self.skipTest('needs UINT_MAX < ULONG_MAX')
948 self.serv.setblocking(False)
949 self.assertEqual(self.serv.gettimeout(), 0.0)
950 self.serv.setblocking(_testcapi.UINT_MAX + 1)
951 self.assertIsNone(self.serv.gettimeout())
952
953 _testSetBlocking_overflow = test_support.cpython_only(_testSetBlocking)
954
Guido van Rossum24e4af82002-06-12 19:18:08 +0000955 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000956 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000957 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000958 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000959 conn, addr = self.serv.accept()
960 except socket.error:
961 pass
962 else:
963 self.fail("Error trying to do non-blocking accept.")
964 read, write, err = select.select([self.serv], [], [])
965 if self.serv in read:
966 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000967 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000968 else:
969 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000970
Guido van Rossum24e4af82002-06-12 19:18:08 +0000971 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000972 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000973 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000974
975 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000976 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000978 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979
980 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000981 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000982 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000983
984 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000985 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986 conn, addr = self.serv.accept()
987 conn.setblocking(0)
988 try:
989 msg = conn.recv(len(MSG))
990 except socket.error:
991 pass
992 else:
993 self.fail("Error trying to do non-blocking recv.")
994 read, write, err = select.select([conn], [], [])
995 if conn in read:
996 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +0000997 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +0000998 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000999 else:
1000 self.fail("Error during select call to non-blocking socket.")
1001
1002 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001003 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001004 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001005 self.cli.send(MSG)
1006
Victor Stinner6a102812010-04-27 23:55:59 +00001007@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001008class FileObjectClassTestCase(SocketConnectedTest):
1009
Guido van Rossume9f66142002-08-07 15:46:19 +00001010 bufsize = -1 # Use default buffer size
1011
Guido van Rossum24e4af82002-06-12 19:18:08 +00001012 def __init__(self, methodName='runTest'):
1013 SocketConnectedTest.__init__(self, methodName=methodName)
1014
1015 def setUp(self):
1016 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001017 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001018
1019 def tearDown(self):
1020 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001021 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001022 SocketConnectedTest.tearDown(self)
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001023 self.serv_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001024
1025 def clientSetUp(self):
1026 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001027 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001028
1029 def clientTearDown(self):
1030 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001031 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001032 self.cli_file = None
1033 SocketConnectedTest.clientTearDown(self)
1034
1035 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001036 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001037 first_seg = self.serv_file.read(len(MSG)-3)
1038 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001039 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +00001040 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001041
1042 def _testSmallRead(self):
1043 self.cli_file.write(MSG)
1044 self.cli_file.flush()
1045
Guido van Rossum8c943832002-08-08 01:00:28 +00001046 def testFullRead(self):
1047 # read until EOF
1048 msg = self.serv_file.read()
1049 self.assertEqual(msg, MSG)
1050
1051 def _testFullRead(self):
1052 self.cli_file.write(MSG)
1053 self.cli_file.close()
1054
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001056 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001057 buf = ''
1058 while 1:
1059 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001060 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001062 buf += char
1063 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001064
1065 def _testUnbufferedRead(self):
1066 self.cli_file.write(MSG)
1067 self.cli_file.flush()
1068
1069 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001070 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001071 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001072 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001073
1074 def _testReadline(self):
1075 self.cli_file.write(MSG)
1076 self.cli_file.flush()
1077
Gregory P. Smith24237ea2008-05-05 21:53:45 +00001078 def testReadlineAfterRead(self):
1079 a_baloo_is = self.serv_file.read(len("A baloo is"))
1080 self.assertEqual("A baloo is", a_baloo_is)
1081 _a_bear = self.serv_file.read(len(" a bear"))
1082 self.assertEqual(" a bear", _a_bear)
1083 line = self.serv_file.readline()
1084 self.assertEqual("\n", line)
1085 line = self.serv_file.readline()
1086 self.assertEqual("A BALOO IS A BEAR.\n", line)
1087 line = self.serv_file.readline()
1088 self.assertEqual(MSG, line)
1089
1090 def _testReadlineAfterRead(self):
1091 self.cli_file.write("A baloo is a bear\n")
1092 self.cli_file.write("A BALOO IS A BEAR.\n")
1093 self.cli_file.write(MSG)
1094 self.cli_file.flush()
1095
1096 def testReadlineAfterReadNoNewline(self):
1097 end_of_ = self.serv_file.read(len("End Of "))
1098 self.assertEqual("End Of ", end_of_)
1099 line = self.serv_file.readline()
1100 self.assertEqual("Line", line)
1101
1102 def _testReadlineAfterReadNoNewline(self):
1103 self.cli_file.write("End Of Line")
1104
Tim Peters116d83c2004-03-28 02:20:45 +00001105 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001106 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001107
1108 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001109 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001110
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001111
1112class FileObjectInterruptedTestCase(unittest.TestCase):
1113 """Test that the file object correctly handles EINTR internally."""
1114
1115 class MockSocket(object):
1116 def __init__(self, recv_funcs=()):
1117 # A generator that returns callables that we'll call for each
1118 # call to recv().
1119 self._recv_step = iter(recv_funcs)
1120
1121 def recv(self, size):
1122 return self._recv_step.next()()
1123
1124 @staticmethod
1125 def _raise_eintr():
1126 raise socket.error(errno.EINTR)
1127
1128 def _test_readline(self, size=-1, **kwargs):
1129 mock_sock = self.MockSocket(recv_funcs=[
1130 lambda : "This is the first line\nAnd the sec",
1131 self._raise_eintr,
1132 lambda : "ond line is here\n",
1133 lambda : "",
1134 ])
1135 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001136 self.assertEqual(fo.readline(size), "This is the first line\n")
1137 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001138
1139 def _test_read(self, size=-1, **kwargs):
1140 mock_sock = self.MockSocket(recv_funcs=[
1141 lambda : "This is the first line\nAnd the sec",
1142 self._raise_eintr,
1143 lambda : "ond line is here\n",
1144 lambda : "",
1145 ])
1146 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001147 self.assertEqual(fo.read(size), "This is the first line\n"
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001148 "And the second line is here\n")
1149
1150 def test_default(self):
1151 self._test_readline()
1152 self._test_readline(size=100)
1153 self._test_read()
1154 self._test_read(size=100)
1155
1156 def test_with_1k_buffer(self):
1157 self._test_readline(bufsize=1024)
1158 self._test_readline(size=100, bufsize=1024)
1159 self._test_read(bufsize=1024)
1160 self._test_read(size=100, bufsize=1024)
1161
1162 def _test_readline_no_buffer(self, size=-1):
1163 mock_sock = self.MockSocket(recv_funcs=[
1164 lambda : "aa",
1165 lambda : "\n",
1166 lambda : "BB",
1167 self._raise_eintr,
1168 lambda : "bb",
1169 lambda : "",
1170 ])
1171 fo = socket._fileobject(mock_sock, bufsize=0)
Ezio Melotti2623a372010-11-21 13:34:58 +00001172 self.assertEqual(fo.readline(size), "aa\n")
1173 self.assertEqual(fo.readline(size), "BBbb")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001174
1175 def test_no_buffer(self):
1176 self._test_readline_no_buffer()
1177 self._test_readline_no_buffer(size=4)
1178 self._test_read(bufsize=0)
1179 self._test_read(size=100, bufsize=0)
1180
1181
Guido van Rossume9f66142002-08-07 15:46:19 +00001182class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1183
1184 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001185
Guido van Rossume9f66142002-08-07 15:46:19 +00001186 In this case (and in this case only), it should be possible to
1187 create a file object, read a line from it, create another file
1188 object, read another line from it, without loss of data in the
1189 first file object's buffer. Note that httplib relies on this
1190 when reading multiple requests from the same socket."""
1191
1192 bufsize = 0 # Use unbuffered mode
1193
1194 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001195 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001196 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001197 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001198 self.serv_file = self.cli_conn.makefile('rb', 0)
1199 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001200 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001201
1202 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001203 self.cli_file.write("A. " + MSG)
1204 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001205 self.cli_file.flush()
1206
Guido van Rossum8c943832002-08-08 01:00:28 +00001207class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1208
1209 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1210
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001211 class SocketMemo(object):
1212 """A wrapper to keep track of sent data, needed to examine write behaviour"""
1213 def __init__(self, sock):
1214 self._sock = sock
1215 self.sent = []
1216
1217 def send(self, data, flags=0):
1218 n = self._sock.send(data, flags)
1219 self.sent.append(data[:n])
1220 return n
1221
1222 def sendall(self, data, flags=0):
1223 self._sock.sendall(data, flags)
1224 self.sent.append(data)
1225
1226 def __getattr__(self, attr):
1227 return getattr(self._sock, attr)
1228
1229 def getsent(self):
1230 return [e.tobytes() if isinstance(e, memoryview) else e for e in self.sent]
1231
1232 def setUp(self):
1233 FileObjectClassTestCase.setUp(self)
1234 self.serv_file._sock = self.SocketMemo(self.serv_file._sock)
1235
1236 def testLinebufferedWrite(self):
1237 # Write two lines, in small chunks
1238 msg = MSG.strip()
1239 print >> self.serv_file, msg,
1240 print >> self.serv_file, msg
1241
1242 # second line:
1243 print >> self.serv_file, msg,
1244 print >> self.serv_file, msg,
1245 print >> self.serv_file, msg
1246
1247 # third line
1248 print >> self.serv_file, ''
1249
1250 self.serv_file.flush()
1251
1252 msg1 = "%s %s\n"%(msg, msg)
1253 msg2 = "%s %s %s\n"%(msg, msg, msg)
1254 msg3 = "\n"
1255 self.assertEqual(self.serv_file._sock.getsent(), [msg1, msg2, msg3])
1256
1257 def _testLinebufferedWrite(self):
1258 msg = MSG.strip()
1259 msg1 = "%s %s\n"%(msg, msg)
1260 msg2 = "%s %s %s\n"%(msg, msg, msg)
1261 msg3 = "\n"
1262 l1 = self.cli_file.readline()
1263 self.assertEqual(l1, msg1)
1264 l2 = self.cli_file.readline()
1265 self.assertEqual(l2, msg2)
1266 l3 = self.cli_file.readline()
1267 self.assertEqual(l3, msg3)
1268
Guido van Rossum8c943832002-08-08 01:00:28 +00001269
1270class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1271
1272 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001273
Georg Brandldd7b0522007-01-21 10:35:10 +00001274
Facundo Batista07c78be2007-03-23 18:54:07 +00001275class NetworkConnectionTest(object):
1276 """Prove network connection."""
1277 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001278 # We're inherited below by BasicTCPTest2, which also inherits
1279 # BasicTCPTest, which defines self.port referenced below.
1280 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001281 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001282
Facundo Batista07c78be2007-03-23 18:54:07 +00001283class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1284 """Tests that NetworkConnection does not break existing TCP functionality.
1285 """
1286
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001287class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001288 class MockSocket(socket.socket):
1289 def connect(self, *args):
1290 raise socket.timeout('timed out')
1291
1292 @contextlib.contextmanager
1293 def mocked_socket_module(self):
1294 """Return a socket which times out on connect"""
1295 old_socket = socket.socket
1296 socket.socket = self.MockSocket
1297 try:
1298 yield
1299 finally:
1300 socket.socket = old_socket
1301
1302 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001303 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001304 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001305 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001306 with self.assertRaises(socket.error) as cm:
1307 cli.connect((HOST, port))
1308 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1309
1310 def test_create_connection(self):
1311 # Issue #9792: errors raised by create_connection() should have
1312 # a proper errno attribute.
1313 port = test_support.find_unused_port()
1314 with self.assertRaises(socket.error) as cm:
1315 socket.create_connection((HOST, port))
Trent Nelson6a7f8672012-10-18 01:35:32 -04001316
1317 # Issue #16257: create_connection() calls getaddrinfo() against
1318 # 'localhost'. This may result in an IPV6 addr being returned
1319 # as well as an IPV4 one:
1320 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1321 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1322 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1323 #
1324 # create_connection() enumerates through all the addresses returned
1325 # and if it doesn't successfully bind to any of them, it propagates
1326 # the last exception it encountered.
1327 #
1328 # On Solaris, ENETUNREACH is returned in this circumstance instead
1329 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1330 # expected errnos.
1331 expected_errnos = [ errno.ECONNREFUSED, ]
1332 if hasattr(errno, 'ENETUNREACH'):
1333 expected_errnos.append(errno.ENETUNREACH)
1334
1335 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001336
1337 def test_create_connection_timeout(self):
1338 # Issue #9792: create_connection() should not recast timeout errors
1339 # as generic socket errors.
1340 with self.mocked_socket_module():
1341 with self.assertRaises(socket.timeout):
1342 socket.create_connection((HOST, 1234))
1343
Facundo Batista07c78be2007-03-23 18:54:07 +00001344
Victor Stinner6a102812010-04-27 23:55:59 +00001345@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001346class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1347
1348 def __init__(self, methodName='runTest'):
1349 SocketTCPTest.__init__(self, methodName=methodName)
1350 ThreadableTest.__init__(self)
1351
1352 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001353 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001354
1355 def clientTearDown(self):
1356 self.cli.close()
1357 self.cli = None
1358 ThreadableTest.clientTearDown(self)
1359
1360 def _justAccept(self):
1361 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001362 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001363
1364 testFamily = _justAccept
1365 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001366 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001367 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001368 self.assertEqual(self.cli.family, 2)
1369
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001370 testSourceAddress = _justAccept
1371 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001372 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1373 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001374 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001375 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001376 # The port number being used is sufficient to show that the bind()
1377 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001378
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001379 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001380 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001381 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001382 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001383 socket.setdefaulttimeout(42)
1384 try:
1385 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001386 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001387 finally:
1388 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001389 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001390
1391 testTimeoutNone = _justAccept
1392 def _testTimeoutNone(self):
1393 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001394 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001395 socket.setdefaulttimeout(30)
1396 try:
1397 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001398 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001399 finally:
1400 socket.setdefaulttimeout(None)
1401 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001402
1403 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001404 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001405 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001406 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001407
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001408 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001409 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001410 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001411 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001412 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001413
Victor Stinner6a102812010-04-27 23:55:59 +00001414@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001415class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1416
1417 def __init__(self, methodName='runTest'):
1418 SocketTCPTest.__init__(self, methodName=methodName)
1419 ThreadableTest.__init__(self)
1420
1421 def clientSetUp(self):
1422 pass
1423
1424 def clientTearDown(self):
1425 self.cli.close()
1426 self.cli = None
1427 ThreadableTest.clientTearDown(self)
1428
Facundo Batista07c78be2007-03-23 18:54:07 +00001429 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001430 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001431 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001432 time.sleep(3)
1433 conn.send("done!")
1434 testOutsideTimeout = testInsideTimeout
1435
1436 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001437 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001438 data = sock.recv(5)
1439 self.assertEqual(data, "done!")
1440
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001441 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001442 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001443 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001444
1445
Georg Brandldd7b0522007-01-21 10:35:10 +00001446class Urllib2FileobjectTest(unittest.TestCase):
1447
1448 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1449 # it close the socket if the close c'tor argument is true
1450
1451 def testClose(self):
1452 class MockSocket:
1453 closed = False
1454 def flush(self): pass
1455 def close(self): self.closed = True
1456
1457 # must not close unless we request it: the original use of _fileobject
1458 # by module socket requires that the underlying socket not be closed until
1459 # the _socketobject that created the _fileobject is closed
1460 s = MockSocket()
1461 f = socket._fileobject(s)
1462 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001463 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001464
1465 s = MockSocket()
1466 f = socket._fileobject(s, close=True)
1467 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001468 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001469
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001470class TCPTimeoutTest(SocketTCPTest):
1471
1472 def testTCPTimeout(self):
1473 def raise_timeout(*args, **kwargs):
1474 self.serv.settimeout(1.0)
1475 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001476 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001477 "Error generating a timeout exception (TCP)")
1478
1479 def testTimeoutZero(self):
1480 ok = False
1481 try:
1482 self.serv.settimeout(0.0)
1483 foo = self.serv.accept()
1484 except socket.timeout:
1485 self.fail("caught timeout instead of error (TCP)")
1486 except socket.error:
1487 ok = True
1488 except:
1489 self.fail("caught unexpected exception (TCP)")
1490 if not ok:
1491 self.fail("accept() returned success when we did not expect it")
1492
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001493 @unittest.skipUnless(hasattr(signal, 'alarm'),
1494 'test needs signal.alarm()')
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001495 def testInterruptedTimeout(self):
1496 # XXX I don't know how to do this test on MSWindows or any other
1497 # plaform that doesn't support signal.alarm() or os.kill(), though
1498 # the bug should have existed on all platforms.
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001499 self.serv.settimeout(5.0) # must be longer than alarm
1500 class Alarm(Exception):
1501 pass
1502 def alarm_handler(signal, frame):
1503 raise Alarm
1504 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1505 try:
1506 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1507 try:
1508 foo = self.serv.accept()
1509 except socket.timeout:
1510 self.fail("caught timeout instead of Alarm")
1511 except Alarm:
1512 pass
1513 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001514 self.fail("caught other exception instead of Alarm:"
1515 " %s(%s):\n%s" %
1516 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001517 else:
1518 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001519 finally:
1520 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001521 except Alarm:
1522 self.fail("got Alarm in wrong place")
1523 finally:
1524 # no alarm can be pending. Safe to restore old handler.
1525 signal.signal(signal.SIGALRM, old_alarm)
1526
Ezio Melotti169ed592011-11-18 18:33:14 +02001527class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001528
1529 def testUDPTimeout(self):
1530 def raise_timeout(*args, **kwargs):
1531 self.serv.settimeout(1.0)
1532 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001533 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001534 "Error generating a timeout exception (UDP)")
1535
1536 def testTimeoutZero(self):
1537 ok = False
1538 try:
1539 self.serv.settimeout(0.0)
1540 foo = self.serv.recv(1024)
1541 except socket.timeout:
1542 self.fail("caught timeout instead of error (UDP)")
1543 except socket.error:
1544 ok = True
1545 except:
1546 self.fail("caught unexpected exception (UDP)")
1547 if not ok:
1548 self.fail("recv() returned success when we did not expect it")
1549
1550class TestExceptions(unittest.TestCase):
1551
1552 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001553 self.assertTrue(issubclass(socket.error, Exception))
1554 self.assertTrue(issubclass(socket.herror, socket.error))
1555 self.assertTrue(issubclass(socket.gaierror, socket.error))
1556 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001557
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001558@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Armin Rigoa9017c32006-04-19 11:50:27 +00001559class TestLinuxAbstractNamespace(unittest.TestCase):
1560
1561 UNIX_PATH_MAX = 108
1562
1563 def testLinuxAbstractNamespace(self):
1564 address = "\x00python-test-hello\x00\xff"
1565 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1566 s1.bind(address)
1567 s1.listen(1)
1568 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1569 s2.connect(s1.getsockname())
1570 s1.accept()
1571 self.assertEqual(s1.getsockname(), address)
1572 self.assertEqual(s2.getpeername(), address)
1573
1574 def testMaxName(self):
1575 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1576 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1577 s.bind(address)
1578 self.assertEqual(s.getsockname(), address)
1579
1580 def testNameOverflow(self):
1581 address = "\x00" + "h" * self.UNIX_PATH_MAX
1582 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1583 self.assertRaises(socket.error, s.bind, address)
1584
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001585
Victor Stinner6a102812010-04-27 23:55:59 +00001586@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001587class BufferIOTest(SocketConnectedTest):
1588 """
1589 Test the buffer versions of socket.recv() and socket.send().
1590 """
1591 def __init__(self, methodName='runTest'):
1592 SocketConnectedTest.__init__(self, methodName=methodName)
1593
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001594 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001595 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001596 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001597 self.assertEqual(nbytes, len(MSG))
1598 msg = buf.tostring()[:len(MSG)]
1599 self.assertEqual(msg, MSG)
1600
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001601 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001602 with test_support.check_py3k_warnings():
1603 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001604 self.serv_conn.send(buf)
1605
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001606 def testRecvIntoBytearray(self):
1607 buf = bytearray(1024)
1608 nbytes = self.cli_conn.recv_into(buf)
1609 self.assertEqual(nbytes, len(MSG))
1610 msg = buf[:len(MSG)]
1611 self.assertEqual(msg, MSG)
1612
1613 _testRecvIntoBytearray = _testRecvIntoArray
1614
1615 def testRecvIntoMemoryview(self):
1616 buf = bytearray(1024)
1617 nbytes = self.cli_conn.recv_into(memoryview(buf))
1618 self.assertEqual(nbytes, len(MSG))
1619 msg = buf[:len(MSG)]
1620 self.assertEqual(msg, MSG)
1621
1622 _testRecvIntoMemoryview = _testRecvIntoArray
1623
1624 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001625 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001626 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001627 self.assertEqual(nbytes, len(MSG))
1628 msg = buf.tostring()[:len(MSG)]
1629 self.assertEqual(msg, MSG)
1630
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001631 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001632 with test_support.check_py3k_warnings():
1633 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001634 self.serv_conn.send(buf)
1635
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001636 def testRecvFromIntoBytearray(self):
1637 buf = bytearray(1024)
1638 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1639 self.assertEqual(nbytes, len(MSG))
1640 msg = buf[:len(MSG)]
1641 self.assertEqual(msg, MSG)
1642
1643 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1644
1645 def testRecvFromIntoMemoryview(self):
1646 buf = bytearray(1024)
1647 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1648 self.assertEqual(nbytes, len(MSG))
1649 msg = buf[:len(MSG)]
1650 self.assertEqual(msg, MSG)
1651
1652 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1653
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001654 def testRecvFromIntoSmallBuffer(self):
1655 # See issue #20246.
1656 buf = bytearray(8)
1657 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
1658
1659 def _testRecvFromIntoSmallBuffer(self):
1660 with test_support.check_py3k_warnings():
Stefan Krah70df6672014-01-21 23:05:52 +01001661 buf = buffer(MSG)
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001662 self.serv_conn.send(buf)
1663
Benjamin Petersond93d6332014-01-14 00:27:42 -05001664 def testRecvFromIntoEmptyBuffer(self):
1665 buf = bytearray()
1666 self.cli_conn.recvfrom_into(buf)
1667 self.cli_conn.recvfrom_into(buf, 0)
1668
1669 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
1670
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001671
1672TIPC_STYPE = 2000
1673TIPC_LOWER = 200
1674TIPC_UPPER = 210
1675
1676def isTipcAvailable():
1677 """Check if the TIPC module is loaded
1678
1679 The TIPC module is not loaded automatically on Ubuntu and probably
1680 other Linux distros.
1681 """
1682 if not hasattr(socket, "AF_TIPC"):
1683 return False
1684 if not os.path.isfile("/proc/modules"):
1685 return False
1686 with open("/proc/modules") as f:
1687 for line in f:
1688 if line.startswith("tipc "):
1689 return True
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001690 return False
1691
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001692@unittest.skipUnless(isTipcAvailable(),
1693 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1694class TIPCTest(unittest.TestCase):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001695 def testRDM(self):
1696 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1697 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1698
1699 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1700 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1701 TIPC_LOWER, TIPC_UPPER)
1702 srv.bind(srvaddr)
1703
1704 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1705 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1706 cli.sendto(MSG, sendaddr)
1707
1708 msg, recvaddr = srv.recvfrom(1024)
1709
1710 self.assertEqual(cli.getsockname(), recvaddr)
1711 self.assertEqual(msg, MSG)
1712
1713
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001714@unittest.skipUnless(isTipcAvailable(),
1715 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1716class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001717 def __init__(self, methodName = 'runTest'):
1718 unittest.TestCase.__init__(self, methodName = methodName)
1719 ThreadableTest.__init__(self)
1720
1721 def setUp(self):
1722 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1723 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1724 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1725 TIPC_LOWER, TIPC_UPPER)
1726 self.srv.bind(srvaddr)
1727 self.srv.listen(5)
1728 self.serverExplicitReady()
1729 self.conn, self.connaddr = self.srv.accept()
1730
1731 def clientSetUp(self):
1732 # The is a hittable race between serverExplicitReady() and the
1733 # accept() call; sleep a little while to avoid it, otherwise
1734 # we could get an exception
1735 time.sleep(0.1)
1736 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1737 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1738 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1739 self.cli.connect(addr)
1740 self.cliaddr = self.cli.getsockname()
1741
1742 def testStream(self):
1743 msg = self.conn.recv(1024)
1744 self.assertEqual(msg, MSG)
1745 self.assertEqual(self.cliaddr, self.connaddr)
1746
1747 def _testStream(self):
1748 self.cli.send(MSG)
1749 self.cli.close()
1750
1751
Guido van Rossumb995eb72002-07-31 16:08:40 +00001752def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001753 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001754 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1755 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001756
1757 tests.extend([
1758 NonBlockingTCPTests,
1759 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001760 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001761 UnbufferedFileObjectClassTestCase,
1762 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001763 SmallBufferedFileObjectClassTestCase,
1764 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001765 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001766 NetworkConnectionAttributesTest,
1767 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001768 ])
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001769 tests.append(BasicSocketPairTest)
1770 tests.append(TestLinuxAbstractNamespace)
1771 tests.extend([TIPCTest, TIPCThreadableTest])
Neal Norwitz9602cc22006-06-18 19:35:01 +00001772
1773 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001774 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001775 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001776
1777if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001778 test_main()