blob: d7a521c1cea95bcfe89914d9f0d497c5719702ba [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100010import tempfile
11import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000012import time
13import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000014import queue
Jack Jansen522e7692002-09-06 21:57:50 +000015import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import os
17import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000018import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000019import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000020from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000021import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000022import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010023import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020024import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
26 import fcntl
27except ImportError:
28 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Benjamin Petersonee8712c2008-05-20 21:35:26 +000030HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000031MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Victor Stinner45df8202010-04-28 22:31:17 +000033try:
34 import _thread as thread
35 import threading
36except ImportError:
37 thread = None
38 threading = None
39
Charles-François Natali47413c12011-10-06 19:47:44 +020040def _have_socket_can():
41 """Check whether CAN sockets are supported on this host."""
42 try:
43 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
44 except (AttributeError, socket.error, OSError):
45 return False
46 else:
47 s.close()
48 return True
49
50HAVE_SOCKET_CAN = _have_socket_can()
51
Nick Coghlan96fe56a2011-08-22 11:55:57 +100052# Size in bytes of the int type
53SIZEOF_INT = array.array("i").itemsize
54
Guido van Rossum24e4af82002-06-12 19:18:08 +000055class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000056
Guido van Rossum24e4af82002-06-12 19:18:08 +000057 def setUp(self):
58 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000059 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000060 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000061
Guido van Rossum24e4af82002-06-12 19:18:08 +000062 def tearDown(self):
63 self.serv.close()
64 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000065
Guido van Rossum24e4af82002-06-12 19:18:08 +000066class SocketUDPTest(unittest.TestCase):
67
68 def setUp(self):
69 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000070 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000071
72 def tearDown(self):
73 self.serv.close()
74 self.serv = None
75
Nick Coghlan96fe56a2011-08-22 11:55:57 +100076class ThreadSafeCleanupTestCase(unittest.TestCase):
77 """Subclass of unittest.TestCase with thread-safe cleanup methods.
78
79 This subclass protects the addCleanup() and doCleanups() methods
80 with a recursive lock.
81 """
82
83 if threading:
84 def __init__(self, *args, **kwargs):
85 super().__init__(*args, **kwargs)
86 self._cleanup_lock = threading.RLock()
87
88 def addCleanup(self, *args, **kwargs):
89 with self._cleanup_lock:
90 return super().addCleanup(*args, **kwargs)
91
92 def doCleanups(self, *args, **kwargs):
93 with self._cleanup_lock:
94 return super().doCleanups(*args, **kwargs)
95
Charles-François Natali47413c12011-10-06 19:47:44 +020096class SocketCANTest(unittest.TestCase):
97
98 """To be able to run this test, a `vcan0` CAN interface can be created with
99 the following commands:
100 # modprobe vcan
101 # ip link add dev vcan0 type vcan
102 # ifconfig vcan0 up
103 """
104 interface = 'vcan0'
105 bufsize = 128
106
107 def setUp(self):
108 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200109 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200110 try:
111 self.s.bind((self.interface,))
112 except socket.error:
113 self.skipTest('network interface `%s` does not exist' %
114 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200115
Guido van Rossum24e4af82002-06-12 19:18:08 +0000116class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000117 """Threadable Test class
118
119 The ThreadableTest class makes it easy to create a threaded
120 client/server pair from an existing unit test. To create a
121 new threaded class from an existing unit test, use multiple
122 inheritance:
123
124 class NewClass (OldClass, ThreadableTest):
125 pass
126
127 This class defines two new fixture functions with obvious
128 purposes for overriding:
129
130 clientSetUp ()
131 clientTearDown ()
132
133 Any new test functions within the class must then define
134 tests in pairs, where the test name is preceeded with a
135 '_' to indicate the client portion of the test. Ex:
136
137 def testFoo(self):
138 # Server portion
139
140 def _testFoo(self):
141 # Client portion
142
143 Any exceptions raised by the clients during their tests
144 are caught and transferred to the main thread to alert
145 the testing framework.
146
147 Note, the server setup function cannot call any blocking
148 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000149 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000150 the blocking call (such as in setting up a client/server
151 connection and performing the accept() in setUp().
152 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000153
154 def __init__(self):
155 # Swap the true setup function
156 self.__setUp = self.setUp
157 self.__tearDown = self.tearDown
158 self.setUp = self._setUp
159 self.tearDown = self._tearDown
160
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000161 def serverExplicitReady(self):
162 """This method allows the server to explicitly indicate that
163 it wants the client thread to proceed. This is useful if the
164 server is about to execute a blocking routine that is
165 dependent upon the client thread during its setup routine."""
166 self.server_ready.set()
167
Guido van Rossum24e4af82002-06-12 19:18:08 +0000168 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000169 self.server_ready = threading.Event()
170 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000171 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000172 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200173 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000174
175 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000176 methodname = self.id()
177 i = methodname.rfind('.')
178 methodname = methodname[i+1:]
179 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000180 self.client_thread = thread.start_new_thread(
181 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000182
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200183 try:
184 self.__setUp()
185 except:
186 self.server_crashed = True
187 raise
188 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000189 self.server_ready.set()
190 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000191
192 def _tearDown(self):
193 self.__tearDown()
194 self.done.wait()
195
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000196 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000197 exc = self.queue.get()
198 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000199
200 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000201 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000202 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200203 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200204 if self.server_crashed:
205 self.clientTearDown()
206 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000207 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000208 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000209 try:
210 test_func()
Nick Coghlan2496f332011-09-19 20:26:31 +1000211 except unittest._ExpectedFailure:
212 # We deliberately ignore expected failures
213 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000214 except BaseException as e:
215 self.queue.put(e)
216 finally:
217 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000218
219 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000220 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000221
222 def clientTearDown(self):
223 self.done.set()
224 thread.exit()
225
226class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
227
228 def __init__(self, methodName='runTest'):
229 SocketTCPTest.__init__(self, methodName=methodName)
230 ThreadableTest.__init__(self)
231
232 def clientSetUp(self):
233 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
234
235 def clientTearDown(self):
236 self.cli.close()
237 self.cli = None
238 ThreadableTest.clientTearDown(self)
239
240class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
241
242 def __init__(self, methodName='runTest'):
243 SocketUDPTest.__init__(self, methodName=methodName)
244 ThreadableTest.__init__(self)
245
246 def clientSetUp(self):
247 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
248
Brian Curtin3beb38f2010-11-04 03:41:43 +0000249 def clientTearDown(self):
250 self.cli.close()
251 self.cli = None
252 ThreadableTest.clientTearDown(self)
253
Charles-François Natali47413c12011-10-06 19:47:44 +0200254class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
255
256 def __init__(self, methodName='runTest'):
257 SocketCANTest.__init__(self, methodName=methodName)
258 ThreadableTest.__init__(self)
259
260 def clientSetUp(self):
261 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
262 try:
263 self.cli.bind((self.interface,))
264 except socket.error:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200265 # skipTest should not be called here, and will be called in the
266 # server instead
267 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200268
269 def clientTearDown(self):
270 self.cli.close()
271 self.cli = None
272 ThreadableTest.clientTearDown(self)
273
Guido van Rossum24e4af82002-06-12 19:18:08 +0000274class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000275 """Socket tests for client-server connection.
276
277 self.cli_conn is a client socket connected to the server. The
278 setUp() method guarantees that it is connected to the server.
279 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280
281 def __init__(self, methodName='runTest'):
282 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
283
284 def setUp(self):
285 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000286 # Indicate explicitly we're ready for the client thread to
287 # proceed and then perform the blocking call to accept
288 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289 conn, addr = self.serv.accept()
290 self.cli_conn = conn
291
292 def tearDown(self):
293 self.cli_conn.close()
294 self.cli_conn = None
295 ThreadedTCPSocketTest.tearDown(self)
296
297 def clientSetUp(self):
298 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000299 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000300 self.serv_conn = self.cli
301
302 def clientTearDown(self):
303 self.serv_conn.close()
304 self.serv_conn = None
305 ThreadedTCPSocketTest.clientTearDown(self)
306
Dave Cole331708b2004-08-09 04:51:41 +0000307class SocketPairTest(unittest.TestCase, ThreadableTest):
308
309 def __init__(self, methodName='runTest'):
310 unittest.TestCase.__init__(self, methodName=methodName)
311 ThreadableTest.__init__(self)
312
313 def setUp(self):
314 self.serv, self.cli = socket.socketpair()
315
316 def tearDown(self):
317 self.serv.close()
318 self.serv = None
319
320 def clientSetUp(self):
321 pass
322
323 def clientTearDown(self):
324 self.cli.close()
325 self.cli = None
326 ThreadableTest.clientTearDown(self)
327
Tim Peters494aaee2004-08-09 18:54:11 +0000328
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000329# The following classes are used by the sendmsg()/recvmsg() tests.
330# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
331# gives a drop-in replacement for SocketConnectedTest, but different
332# address families can be used, and the attributes serv_addr and
333# cli_addr will be set to the addresses of the endpoints.
334
335class SocketTestBase(unittest.TestCase):
336 """A base class for socket tests.
337
338 Subclasses must provide methods newSocket() to return a new socket
339 and bindSock(sock) to bind it to an unused address.
340
341 Creates a socket self.serv and sets self.serv_addr to its address.
342 """
343
344 def setUp(self):
345 self.serv = self.newSocket()
346 self.bindServer()
347
348 def bindServer(self):
349 """Bind server socket and set self.serv_addr to its address."""
350 self.bindSock(self.serv)
351 self.serv_addr = self.serv.getsockname()
352
353 def tearDown(self):
354 self.serv.close()
355 self.serv = None
356
357
358class SocketListeningTestMixin(SocketTestBase):
359 """Mixin to listen on the server socket."""
360
361 def setUp(self):
362 super().setUp()
363 self.serv.listen(1)
364
365
366class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
367 ThreadableTest):
368 """Mixin to add client socket and allow client/server tests.
369
370 Client socket is self.cli and its address is self.cli_addr. See
371 ThreadableTest for usage information.
372 """
373
374 def __init__(self, *args, **kwargs):
375 super().__init__(*args, **kwargs)
376 ThreadableTest.__init__(self)
377
378 def clientSetUp(self):
379 self.cli = self.newClientSocket()
380 self.bindClient()
381
382 def newClientSocket(self):
383 """Return a new socket for use as client."""
384 return self.newSocket()
385
386 def bindClient(self):
387 """Bind client socket and set self.cli_addr to its address."""
388 self.bindSock(self.cli)
389 self.cli_addr = self.cli.getsockname()
390
391 def clientTearDown(self):
392 self.cli.close()
393 self.cli = None
394 ThreadableTest.clientTearDown(self)
395
396
397class ConnectedStreamTestMixin(SocketListeningTestMixin,
398 ThreadedSocketTestMixin):
399 """Mixin to allow client/server stream tests with connected client.
400
401 Server's socket representing connection to client is self.cli_conn
402 and client's connection to server is self.serv_conn. (Based on
403 SocketConnectedTest.)
404 """
405
406 def setUp(self):
407 super().setUp()
408 # Indicate explicitly we're ready for the client thread to
409 # proceed and then perform the blocking call to accept
410 self.serverExplicitReady()
411 conn, addr = self.serv.accept()
412 self.cli_conn = conn
413
414 def tearDown(self):
415 self.cli_conn.close()
416 self.cli_conn = None
417 super().tearDown()
418
419 def clientSetUp(self):
420 super().clientSetUp()
421 self.cli.connect(self.serv_addr)
422 self.serv_conn = self.cli
423
424 def clientTearDown(self):
425 self.serv_conn.close()
426 self.serv_conn = None
427 super().clientTearDown()
428
429
430class UnixSocketTestBase(SocketTestBase):
431 """Base class for Unix-domain socket tests."""
432
433 # This class is used for file descriptor passing tests, so we
434 # create the sockets in a private directory so that other users
435 # can't send anything that might be problematic for a privileged
436 # user running the tests.
437
438 def setUp(self):
439 self.dir_path = tempfile.mkdtemp()
440 self.addCleanup(os.rmdir, self.dir_path)
441 super().setUp()
442
443 def bindSock(self, sock):
444 path = tempfile.mktemp(dir=self.dir_path)
445 sock.bind(path)
446 self.addCleanup(support.unlink, path)
447
448class UnixStreamBase(UnixSocketTestBase):
449 """Base class for Unix-domain SOCK_STREAM tests."""
450
451 def newSocket(self):
452 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
453
454
455class InetTestBase(SocketTestBase):
456 """Base class for IPv4 socket tests."""
457
458 host = HOST
459
460 def setUp(self):
461 super().setUp()
462 self.port = self.serv_addr[1]
463
464 def bindSock(self, sock):
465 support.bind_port(sock, host=self.host)
466
467class TCPTestBase(InetTestBase):
468 """Base class for TCP-over-IPv4 tests."""
469
470 def newSocket(self):
471 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
472
473class UDPTestBase(InetTestBase):
474 """Base class for UDP-over-IPv4 tests."""
475
476 def newSocket(self):
477 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
478
479class SCTPStreamBase(InetTestBase):
480 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
481
482 def newSocket(self):
483 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
484 socket.IPPROTO_SCTP)
485
486
487class Inet6TestBase(InetTestBase):
488 """Base class for IPv6 socket tests."""
489
490 # Don't use "localhost" here - it may not have an IPv6 address
491 # assigned to it by default (e.g. in /etc/hosts), and if someone
492 # has assigned it an IPv4-mapped address, then it's unlikely to
493 # work with the full IPv6 API.
494 host = "::1"
495
496class UDP6TestBase(Inet6TestBase):
497 """Base class for UDP-over-IPv6 tests."""
498
499 def newSocket(self):
500 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
501
502
503# Test-skipping decorators for use with ThreadableTest.
504
505def skipWithClientIf(condition, reason):
506 """Skip decorated test if condition is true, add client_skip decorator.
507
508 If the decorated object is not a class, sets its attribute
509 "client_skip" to a decorator which will return an empty function
510 if the test is to be skipped, or the original function if it is
511 not. This can be used to avoid running the client part of a
512 skipped test when using ThreadableTest.
513 """
514 def client_pass(*args, **kwargs):
515 pass
516 def skipdec(obj):
517 retval = unittest.skip(reason)(obj)
518 if not isinstance(obj, type):
519 retval.client_skip = lambda f: client_pass
520 return retval
521 def noskipdec(obj):
522 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
523 obj.client_skip = lambda f: f
524 return obj
525 return skipdec if condition else noskipdec
526
527
528def requireAttrs(obj, *attributes):
529 """Skip decorated test if obj is missing any of the given attributes.
530
531 Sets client_skip attribute as skipWithClientIf() does.
532 """
533 missing = [name for name in attributes if not hasattr(obj, name)]
534 return skipWithClientIf(
535 missing, "don't have " + ", ".join(name for name in missing))
536
537
538def requireSocket(*args):
539 """Skip decorated test if a socket cannot be created with given arguments.
540
541 When an argument is given as a string, will use the value of that
542 attribute of the socket module, or skip the test if it doesn't
543 exist. Sets client_skip attribute as skipWithClientIf() does.
544 """
545 err = None
546 missing = [obj for obj in args if
547 isinstance(obj, str) and not hasattr(socket, obj)]
548 if missing:
549 err = "don't have " + ", ".join(name for name in missing)
550 else:
551 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
552 for obj in args]
553 try:
554 s = socket.socket(*callargs)
555 except socket.error as e:
556 # XXX: check errno?
557 err = str(e)
558 else:
559 s.close()
560 return skipWithClientIf(
561 err is not None,
562 "can't create socket({0}): {1}".format(
563 ", ".join(str(o) for o in args), err))
564
565
Guido van Rossum24e4af82002-06-12 19:18:08 +0000566#######################################################################
567## Begin Tests
568
569class GeneralModuleTests(unittest.TestCase):
570
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000571 def test_repr(self):
572 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000573 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000574 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000575
Raymond Hettinger027bb632004-05-31 03:09:25 +0000576 def test_weakref(self):
577 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
578 p = proxy(s)
579 self.assertEqual(p.fileno(), s.fileno())
580 s.close()
581 s = None
582 try:
583 p.fileno()
584 except ReferenceError:
585 pass
586 else:
587 self.fail('Socket proxy still exists')
588
Guido van Rossum24e4af82002-06-12 19:18:08 +0000589 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000590 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300591 msg = "Error raising socket exception (%s)."
592 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000593 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300594 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000595 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300596 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000598
Ezio Melotti63e42302011-05-07 19:47:48 +0300599 def testSendtoErrors(self):
600 # Testing that sendto doens't masks failures. See #10169.
601 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
602 self.addCleanup(s.close)
603 s.bind(('', 0))
604 sockname = s.getsockname()
605 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300606 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300607 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300608 self.assertEqual(str(cm.exception),
609 "'str' does not support the buffer interface")
610 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300611 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300612 self.assertEqual(str(cm.exception),
613 "'complex' does not support the buffer interface")
614 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300615 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300616 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300617 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300618 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300619 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300620 self.assertEqual(str(cm.exception),
621 "'str' does not support the buffer interface")
622 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300623 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300624 self.assertEqual(str(cm.exception),
625 "'complex' does not support the buffer interface")
626 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300627 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300628 self.assertIn('not NoneType', str(cm.exception))
629 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300630 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300631 self.assertIn('an integer is required', str(cm.exception))
632 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300633 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300634 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300635 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300636 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300637 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300638 self.assertIn('(1 given)', str(cm.exception))
639 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300640 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300641 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300642
Guido van Rossum24e4af82002-06-12 19:18:08 +0000643 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000644 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645 socket.AF_INET
646 socket.SOCK_STREAM
647 socket.SOCK_DGRAM
648 socket.SOCK_RAW
649 socket.SOCK_RDM
650 socket.SOCK_SEQPACKET
651 socket.SOL_SOCKET
652 socket.SO_REUSEADDR
653
Guido van Rossum654c11e2002-06-13 20:24:17 +0000654 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000655 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000656 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000657 try:
658 ip = socket.gethostbyname(hostname)
659 except socket.error:
660 # Probably name lookup wasn't set up right; skip this test
661 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000662 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000663 try:
664 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
665 except socket.error:
666 # Probably a similar problem as above; skip this test
667 return
Brett Cannon01668a12005-03-11 00:04:17 +0000668 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000669 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000670 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000671 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000672
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000673 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
674 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
675 def test_sethostname(self):
676 oldhn = socket.gethostname()
677 try:
678 socket.sethostname('new')
679 except socket.error as e:
680 if e.errno == errno.EPERM:
681 self.skipTest("test should be run as root")
682 else:
683 raise
684 try:
685 # running test as root!
686 self.assertEqual(socket.gethostname(), 'new')
687 # Should work with bytes objects too
688 socket.sethostname(b'bar')
689 self.assertEqual(socket.gethostname(), 'bar')
690 finally:
691 socket.sethostname(oldhn)
692
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700693 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
694 'socket.if_nameindex() not available.')
695 def testInterfaceNameIndex(self):
696 interfaces = socket.if_nameindex()
697 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200698 self.assertIsInstance(index, int)
699 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700700 # interface indices are non-zero integers
701 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200702 _index = socket.if_nametoindex(name)
703 self.assertIsInstance(_index, int)
704 self.assertEqual(index, _index)
705 _name = socket.if_indextoname(index)
706 self.assertIsInstance(_name, str)
707 self.assertEqual(name, _name)
708
709 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
710 'socket.if_nameindex() not available.')
711 def testInvalidInterfaceNameIndex(self):
712 # test nonexistent interface index/name
713 self.assertRaises(socket.error, socket.if_indextoname, 0)
714 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
715 # test with invalid values
716 self.assertRaises(TypeError, socket.if_nametoindex, 0)
717 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700718
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000719 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000720 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000721 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000722 try:
723 # On some versions, this loses a reference
724 orig = sys.getrefcount(__name__)
725 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000726 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000727 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000729
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000731 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732 try:
733 # On some versions, this crashes the interpreter.
734 socket.getnameinfo(('x', 0, 0, 0), 0)
735 except socket.error:
736 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000737
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000738 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000739 # This just checks that htons etc. are their own inverse,
740 # when looking at the lower 16 or 32 bits.
741 sizes = {socket.htonl: 32, socket.ntohl: 32,
742 socket.htons: 16, socket.ntohs: 16}
743 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000744 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000745 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
746 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000747
Guido van Rossuma2627af2002-09-14 00:58:46 +0000748 swapped = func(mask)
749 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000750 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000751
Guido van Rossum018919a2007-01-15 00:07:32 +0000752 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000753 good_values = [ 1, 2, 3, 1, 2, 3 ]
754 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000755 for k in good_values:
756 socket.ntohl(k)
757 socket.ntohs(k)
758 socket.htonl(k)
759 socket.htons(k)
760 for k in bad_values:
761 self.assertRaises(OverflowError, socket.ntohl, k)
762 self.assertRaises(OverflowError, socket.ntohs, k)
763 self.assertRaises(OverflowError, socket.htonl, k)
764 self.assertRaises(OverflowError, socket.htons, k)
765
Barry Warsaw11b91a02004-06-28 00:50:43 +0000766 def testGetServBy(self):
767 eq = self.assertEqual
768 # Find one service that exists, then check all the related interfaces.
769 # I've ordered this by protocols that have both a tcp and udp
770 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200771 if (sys.platform.startswith(('freebsd', 'netbsd'))
772 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000773 # avoid the 'echo' service on this platform, as there is an
774 # assumption breaking non-standard port/protocol entry
775 services = ('daytime', 'qotd', 'domain')
776 else:
777 services = ('echo', 'daytime', 'domain')
778 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000779 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000780 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000781 break
782 except socket.error:
783 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000784 else:
785 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000786 # Try same call with optional protocol omitted
787 port2 = socket.getservbyname(service)
788 eq(port, port2)
789 # Try udp, but don't barf it it doesn't exist
790 try:
791 udpport = socket.getservbyname(service, 'udp')
792 except socket.error:
793 udpport = None
794 else:
795 eq(udpport, port)
796 # Now make sure the lookup by port returns the same service name
797 eq(socket.getservbyport(port2), service)
798 eq(socket.getservbyport(port, 'tcp'), service)
799 if udpport is not None:
800 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000801 # Make sure getservbyport does not accept out of range ports.
802 self.assertRaises(OverflowError, socket.getservbyport, -1)
803 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000804
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000805 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000806 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000807 # The default timeout should initially be None
808 self.assertEqual(socket.getdefaulttimeout(), None)
809 s = socket.socket()
810 self.assertEqual(s.gettimeout(), None)
811 s.close()
812
813 # Set the default timeout to 10, and see if it propagates
814 socket.setdefaulttimeout(10)
815 self.assertEqual(socket.getdefaulttimeout(), 10)
816 s = socket.socket()
817 self.assertEqual(s.gettimeout(), 10)
818 s.close()
819
820 # Reset the default timeout to None, and see if it propagates
821 socket.setdefaulttimeout(None)
822 self.assertEqual(socket.getdefaulttimeout(), None)
823 s = socket.socket()
824 self.assertEqual(s.gettimeout(), None)
825 s.close()
826
827 # Check that setting it to an invalid value raises ValueError
828 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
829
830 # Check that setting it to an invalid type raises TypeError
831 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
832
Benjamin Petersonf91df042009-02-13 02:50:59 +0000833 def testIPv4_inet_aton_fourbytes(self):
834 if not hasattr(socket, 'inet_aton'):
835 return # No inet_aton, nothing to check
836 # Test that issue1008086 and issue767150 are fixed.
837 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000838 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
839 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000840
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000841 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000842 if not hasattr(socket, 'inet_pton'):
843 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000844 from socket import inet_aton as f, inet_pton, AF_INET
845 g = lambda a: inet_pton(AF_INET, a)
846
Ezio Melottib3aedd42010-11-20 19:04:17 +0000847 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
848 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
849 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
850 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
851 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000852
Ezio Melottib3aedd42010-11-20 19:04:17 +0000853 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
854 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
855 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
856 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000857
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000858 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000859 if not hasattr(socket, 'inet_pton'):
860 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000861 try:
862 from socket import inet_pton, AF_INET6, has_ipv6
863 if not has_ipv6:
864 return
865 except ImportError:
866 return
867 f = lambda a: inet_pton(AF_INET6, a)
868
Ezio Melottib3aedd42010-11-20 19:04:17 +0000869 self.assertEqual(b'\x00' * 16, f('::'))
870 self.assertEqual(b'\x00' * 16, f('0::0'))
871 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
872 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000873 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000874 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
875 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000876
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000877 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000878 if not hasattr(socket, 'inet_ntop'):
879 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000880 from socket import inet_ntoa as f, inet_ntop, AF_INET
881 g = lambda a: inet_ntop(AF_INET, a)
882
Ezio Melottib3aedd42010-11-20 19:04:17 +0000883 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
884 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
885 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
886 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000887
Ezio Melottib3aedd42010-11-20 19:04:17 +0000888 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
889 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
890 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000891
892 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000893 if not hasattr(socket, 'inet_ntop'):
894 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000895 try:
896 from socket import inet_ntop, AF_INET6, has_ipv6
897 if not has_ipv6:
898 return
899 except ImportError:
900 return
901 f = lambda a: inet_ntop(AF_INET6, a)
902
Ezio Melottib3aedd42010-11-20 19:04:17 +0000903 self.assertEqual('::', f(b'\x00' * 16))
904 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
905 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000906 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000907 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000908 )
909
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000910 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000911
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000912 def testSockName(self):
913 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200914 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000915 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000916 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000917 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000918 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000919 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
920 # it reasonable to get the host's addr in addition to 0.0.0.0.
921 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000922 try:
923 my_ip_addr = socket.gethostbyname(socket.gethostname())
924 except socket.error:
925 # Probably name lookup wasn't set up right; skip this test
926 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000927 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000928 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929
930 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000931 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 # We know a socket should start without reuse==0
933 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000934 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000935 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000936 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937
938 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000939 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000940 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000941 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
943 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000944 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000945
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000946 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000947 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000948 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
949 sock.settimeout(1)
950 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000951 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000952
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000953 def testNewAttributes(self):
954 # testing .family, .type and .protocol
955 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
956 self.assertEqual(sock.family, socket.AF_INET)
957 self.assertEqual(sock.type, socket.SOCK_STREAM)
958 self.assertEqual(sock.proto, 0)
959 sock.close()
960
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000961 def test_getsockaddrarg(self):
962 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200963 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000964 big_port = port + 65536
965 neg_port = port - 65536
966 sock = socket.socket()
967 try:
968 self.assertRaises(OverflowError, sock.bind, (host, big_port))
969 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
970 sock.bind((host, port))
971 finally:
972 sock.close()
973
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000974 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000975 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000976 self.assertTrue(hasattr(socket.socket, 'ioctl'))
977 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
978 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
979 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000980 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
981 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000982 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000983 self.assertRaises(ValueError, s.ioctl, -1, None)
984 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000985
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000986 def testGetaddrinfo(self):
987 try:
988 socket.getaddrinfo('localhost', 80)
989 except socket.gaierror as err:
990 if err.errno == socket.EAI_SERVICE:
991 # see http://bugs.python.org/issue1282647
992 self.skipTest("buggy libc version")
993 raise
994 # len of every sequence is supposed to be == 5
995 for info in socket.getaddrinfo(HOST, None):
996 self.assertEqual(len(info), 5)
997 # host can be a domain name, a string representation of an
998 # IPv4/v6 address or None
999 socket.getaddrinfo('localhost', 80)
1000 socket.getaddrinfo('127.0.0.1', 80)
1001 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001002 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001003 socket.getaddrinfo('::1', 80)
1004 # port can be a string service name such as "http", a numeric
1005 # port number or None
1006 socket.getaddrinfo(HOST, "http")
1007 socket.getaddrinfo(HOST, 80)
1008 socket.getaddrinfo(HOST, None)
1009 # test family and socktype filters
1010 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1011 for family, _, _, _, _ in infos:
1012 self.assertEqual(family, socket.AF_INET)
1013 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1014 for _, socktype, _, _, _ in infos:
1015 self.assertEqual(socktype, socket.SOCK_STREAM)
1016 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001017 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001018 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1019 # a server willing to support both IPv4 and IPv6 will
1020 # usually do this
1021 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1022 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001023 # test keyword arguments
1024 a = socket.getaddrinfo(HOST, None)
1025 b = socket.getaddrinfo(host=HOST, port=None)
1026 self.assertEqual(a, b)
1027 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1028 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1029 self.assertEqual(a, b)
1030 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1031 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1032 self.assertEqual(a, b)
1033 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1034 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1035 self.assertEqual(a, b)
1036 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1037 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1038 self.assertEqual(a, b)
1039 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1040 socket.AI_PASSIVE)
1041 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1042 type=socket.SOCK_STREAM, proto=0,
1043 flags=socket.AI_PASSIVE)
1044 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001045 # Issue #6697.
1046 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001047
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001048 def test_getnameinfo(self):
1049 # only IP addresses are allowed
1050 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1051
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001052 @unittest.skipUnless(support.is_resource_enabled('network'),
1053 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001054 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +00001055 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001056 # these should all be successful
1057 socket.gethostbyname('испытание.python.org')
1058 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001059 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1060 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1061 # have a reverse entry yet
1062 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001063
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001064 def check_sendall_interrupted(self, with_timeout):
1065 # socketpair() is not stricly required, but it makes things easier.
1066 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1067 self.skipTest("signal.alarm and socket.socketpair required for this test")
1068 # Our signal handlers clobber the C errno by calling a math function
1069 # with an invalid domain value.
1070 def ok_handler(*args):
1071 self.assertRaises(ValueError, math.acosh, 0)
1072 def raising_handler(*args):
1073 self.assertRaises(ValueError, math.acosh, 0)
1074 1 // 0
1075 c, s = socket.socketpair()
1076 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1077 try:
1078 if with_timeout:
1079 # Just above the one second minimum for signal.alarm
1080 c.settimeout(1.5)
1081 with self.assertRaises(ZeroDivisionError):
1082 signal.alarm(1)
1083 c.sendall(b"x" * (1024**2))
1084 if with_timeout:
1085 signal.signal(signal.SIGALRM, ok_handler)
1086 signal.alarm(1)
1087 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1088 finally:
1089 signal.signal(signal.SIGALRM, old_alarm)
1090 c.close()
1091 s.close()
1092
1093 def test_sendall_interrupted(self):
1094 self.check_sendall_interrupted(False)
1095
1096 def test_sendall_interrupted_with_timeout(self):
1097 self.check_sendall_interrupted(True)
1098
Antoine Pitroue033e062010-10-29 10:38:18 +00001099 def test_dealloc_warn(self):
1100 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1101 r = repr(sock)
1102 with self.assertWarns(ResourceWarning) as cm:
1103 sock = None
1104 support.gc_collect()
1105 self.assertIn(r, str(cm.warning.args[0]))
1106 # An open socket file object gets dereferenced after the socket
1107 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1108 f = sock.makefile('rb')
1109 r = repr(sock)
1110 sock = None
1111 support.gc_collect()
1112 with self.assertWarns(ResourceWarning):
1113 f = None
1114 support.gc_collect()
1115
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001116 def test_name_closed_socketio(self):
1117 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1118 fp = sock.makefile("rb")
1119 fp.close()
1120 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1121
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001122 def test_pickle(self):
1123 sock = socket.socket()
1124 with sock:
1125 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1126 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1127
Antoine Pitrou3cade992011-05-10 19:19:13 +02001128 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001129 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1130 srv.bind((HOST, 0))
1131 # backlog = 0
1132 srv.listen(0)
1133 srv.close()
1134
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001135
Charles-François Natali47413c12011-10-06 19:47:44 +02001136@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1137class BasicCANTest(unittest.TestCase):
1138
1139 def testCrucialConstants(self):
1140 socket.AF_CAN
1141 socket.PF_CAN
1142 socket.CAN_RAW
1143
1144 def testCreateSocket(self):
1145 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1146 pass
1147
1148 def testBindAny(self):
1149 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1150 s.bind(('', ))
1151
1152 def testTooLongInterfaceName(self):
1153 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1154 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001155 self.assertRaisesRegex(socket.error, 'interface name too long',
1156 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001157
1158 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1159 'socket.CAN_RAW_LOOPBACK required for this test.')
1160 def testLoopback(self):
1161 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1162 for loopback in (0, 1):
1163 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1164 loopback)
1165 self.assertEqual(loopback,
1166 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1167
1168 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1169 'socket.CAN_RAW_FILTER required for this test.')
1170 def testFilter(self):
1171 can_id, can_mask = 0x200, 0x700
1172 can_filter = struct.pack("=II", can_id, can_mask)
1173 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1174 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1175 self.assertEqual(can_filter,
1176 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1177
1178
1179@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1180@unittest.skipUnless(thread, 'Threading required for this test.')
1181class CANTest(ThreadedCANSocketTest):
1182
1183 """The CAN frame structure is defined in <linux/can.h>:
1184
1185 struct can_frame {
1186 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1187 __u8 can_dlc; /* data length code: 0 .. 8 */
1188 __u8 data[8] __attribute__((aligned(8)));
1189 };
1190 """
1191 can_frame_fmt = "=IB3x8s"
1192
1193 def __init__(self, methodName='runTest'):
1194 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1195
1196 @classmethod
1197 def build_can_frame(cls, can_id, data):
1198 """Build a CAN frame."""
1199 can_dlc = len(data)
1200 data = data.ljust(8, b'\x00')
1201 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1202
1203 @classmethod
1204 def dissect_can_frame(cls, frame):
1205 """Dissect a CAN frame."""
1206 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1207 return (can_id, can_dlc, data[:can_dlc])
1208
1209 def testSendFrame(self):
1210 cf, addr = self.s.recvfrom(self.bufsize)
1211 self.assertEqual(self.cf, cf)
1212 self.assertEqual(addr[0], self.interface)
1213 self.assertEqual(addr[1], socket.AF_CAN)
1214
1215 def _testSendFrame(self):
1216 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1217 self.cli.send(self.cf)
1218
1219 def testSendMaxFrame(self):
1220 cf, addr = self.s.recvfrom(self.bufsize)
1221 self.assertEqual(self.cf, cf)
1222
1223 def _testSendMaxFrame(self):
1224 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1225 self.cli.send(self.cf)
1226
1227 def testSendMultiFrames(self):
1228 cf, addr = self.s.recvfrom(self.bufsize)
1229 self.assertEqual(self.cf1, cf)
1230
1231 cf, addr = self.s.recvfrom(self.bufsize)
1232 self.assertEqual(self.cf2, cf)
1233
1234 def _testSendMultiFrames(self):
1235 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1236 self.cli.send(self.cf1)
1237
1238 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1239 self.cli.send(self.cf2)
1240
1241
Victor Stinner45df8202010-04-28 22:31:17 +00001242@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001243class BasicTCPTest(SocketConnectedTest):
1244
1245 def __init__(self, methodName='runTest'):
1246 SocketConnectedTest.__init__(self, methodName=methodName)
1247
1248 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001249 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001250 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001251 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001252
1253 def _testRecv(self):
1254 self.serv_conn.send(MSG)
1255
1256 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001257 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001258 seg1 = self.cli_conn.recv(len(MSG) - 3)
1259 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001260 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001261 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001262
1263 def _testOverFlowRecv(self):
1264 self.serv_conn.send(MSG)
1265
1266 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001267 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001268 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001269 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001270
1271 def _testRecvFrom(self):
1272 self.serv_conn.send(MSG)
1273
1274 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001275 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001276 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1277 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001278 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001279 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001280
1281 def _testOverFlowRecvFrom(self):
1282 self.serv_conn.send(MSG)
1283
1284 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001285 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001286 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001287 while 1:
1288 read = self.cli_conn.recv(1024)
1289 if not read:
1290 break
Guido van Rossume531e292002-08-08 20:28:34 +00001291 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001292 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001293
1294 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001295 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001296 self.serv_conn.sendall(big_chunk)
1297
1298 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001299 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001300 fd = self.cli_conn.fileno()
1301 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001302 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001303 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001304 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001305 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001306
1307 def _testFromFd(self):
1308 self.serv_conn.send(MSG)
1309
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001310 def testDup(self):
1311 # Testing dup()
1312 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001313 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001314 msg = sock.recv(1024)
1315 self.assertEqual(msg, MSG)
1316
1317 def _testDup(self):
1318 self.serv_conn.send(MSG)
1319
Guido van Rossum24e4af82002-06-12 19:18:08 +00001320 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001321 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001322 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001323 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001324 # wait for _testShutdown to finish: on OS X, when the server
1325 # closes the connection the client also becomes disconnected,
1326 # and the client's shutdown call will fail. (Issue #4397.)
1327 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001328
1329 def _testShutdown(self):
1330 self.serv_conn.send(MSG)
1331 self.serv_conn.shutdown(2)
1332
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001333 def testDetach(self):
1334 # Testing detach()
1335 fileno = self.cli_conn.fileno()
1336 f = self.cli_conn.detach()
1337 self.assertEqual(f, fileno)
1338 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001339 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1340 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001341 # ...but we can create another socket using the (still open)
1342 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001343 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001344 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001345 msg = sock.recv(1024)
1346 self.assertEqual(msg, MSG)
1347
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001348 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001349 self.serv_conn.send(MSG)
1350
Victor Stinner45df8202010-04-28 22:31:17 +00001351@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001352class BasicUDPTest(ThreadedUDPSocketTest):
1353
1354 def __init__(self, methodName='runTest'):
1355 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1356
1357 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001358 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001359 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001360 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001361
1362 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001363 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001364
Guido van Rossum1c938012002-06-12 21:17:20 +00001365 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001366 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001367 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001368 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001369
Guido van Rossum1c938012002-06-12 21:17:20 +00001370 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001371 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001372
Guido van Rossumd8faa362007-04-27 19:54:29 +00001373 def testRecvFromNegative(self):
1374 # Negative lengths passed to recvfrom should give ValueError.
1375 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1376
1377 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001378 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001379
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001380
1381# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1382# same test code is used with different families and types of socket
1383# (e.g. stream, datagram), and tests using recvmsg() are repeated
1384# using recvmsg_into().
1385#
1386# The generic test classes such as SendmsgTests and
1387# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1388# supplied with sockets cli_sock and serv_sock representing the
1389# client's and the server's end of the connection respectively, and
1390# attributes cli_addr and serv_addr holding their (numeric where
1391# appropriate) addresses.
1392#
1393# The final concrete test classes combine these with subclasses of
1394# SocketTestBase which set up client and server sockets of a specific
1395# type, and with subclasses of SendrecvmsgBase such as
1396# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1397# sockets to cli_sock and serv_sock and override the methods and
1398# attributes of SendrecvmsgBase to fill in destination addresses if
1399# needed when sending, check for specific flags in msg_flags, etc.
1400#
1401# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1402# recvmsg_into().
1403
1404# XXX: like the other datagram (UDP) tests in this module, the code
1405# here assumes that datagram delivery on the local machine will be
1406# reliable.
1407
1408class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1409 # Base class for sendmsg()/recvmsg() tests.
1410
1411 # Time in seconds to wait before considering a test failed, or
1412 # None for no timeout. Not all tests actually set a timeout.
1413 fail_timeout = 3.0
1414
1415 def setUp(self):
1416 self.misc_event = threading.Event()
1417 super().setUp()
1418
1419 def sendToServer(self, msg):
1420 # Send msg to the server.
1421 return self.cli_sock.send(msg)
1422
1423 # Tuple of alternative default arguments for sendmsg() when called
1424 # via sendmsgToServer() (e.g. to include a destination address).
1425 sendmsg_to_server_defaults = ()
1426
1427 def sendmsgToServer(self, *args):
1428 # Call sendmsg() on self.cli_sock with the given arguments,
1429 # filling in any arguments which are not supplied with the
1430 # corresponding items of self.sendmsg_to_server_defaults, if
1431 # any.
1432 return self.cli_sock.sendmsg(
1433 *(args + self.sendmsg_to_server_defaults[len(args):]))
1434
1435 def doRecvmsg(self, sock, bufsize, *args):
1436 # Call recvmsg() on sock with given arguments and return its
1437 # result. Should be used for tests which can use either
1438 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1439 # this method with one which emulates it using recvmsg_into(),
1440 # thus allowing the same test to be used for both methods.
1441 result = sock.recvmsg(bufsize, *args)
1442 self.registerRecvmsgResult(result)
1443 return result
1444
1445 def registerRecvmsgResult(self, result):
1446 # Called by doRecvmsg() with the return value of recvmsg() or
1447 # recvmsg_into(). Can be overridden to arrange cleanup based
1448 # on the returned ancillary data, for instance.
1449 pass
1450
1451 def checkRecvmsgAddress(self, addr1, addr2):
1452 # Called to compare the received address with the address of
1453 # the peer.
1454 self.assertEqual(addr1, addr2)
1455
1456 # Flags that are normally unset in msg_flags
1457 msg_flags_common_unset = 0
1458 for name in ("MSG_CTRUNC", "MSG_OOB"):
1459 msg_flags_common_unset |= getattr(socket, name, 0)
1460
1461 # Flags that are normally set
1462 msg_flags_common_set = 0
1463
1464 # Flags set when a complete record has been received (e.g. MSG_EOR
1465 # for SCTP)
1466 msg_flags_eor_indicator = 0
1467
1468 # Flags set when a complete record has not been received
1469 # (e.g. MSG_TRUNC for datagram sockets)
1470 msg_flags_non_eor_indicator = 0
1471
1472 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1473 # Method to check the value of msg_flags returned by recvmsg[_into]().
1474 #
1475 # Checks that all bits in msg_flags_common_set attribute are
1476 # set in "flags" and all bits in msg_flags_common_unset are
1477 # unset.
1478 #
1479 # The "eor" argument specifies whether the flags should
1480 # indicate that a full record (or datagram) has been received.
1481 # If "eor" is None, no checks are done; otherwise, checks
1482 # that:
1483 #
1484 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1485 # set and all bits in msg_flags_non_eor_indicator are unset
1486 #
1487 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1488 # are set and all bits in msg_flags_eor_indicator are unset
1489 #
1490 # If "checkset" and/or "checkunset" are supplied, they require
1491 # the given bits to be set or unset respectively, overriding
1492 # what the attributes require for those bits.
1493 #
1494 # If any bits are set in "ignore", they will not be checked,
1495 # regardless of the other inputs.
1496 #
1497 # Will raise Exception if the inputs require a bit to be both
1498 # set and unset, and it is not ignored.
1499
1500 defaultset = self.msg_flags_common_set
1501 defaultunset = self.msg_flags_common_unset
1502
1503 if eor:
1504 defaultset |= self.msg_flags_eor_indicator
1505 defaultunset |= self.msg_flags_non_eor_indicator
1506 elif eor is not None:
1507 defaultset |= self.msg_flags_non_eor_indicator
1508 defaultunset |= self.msg_flags_eor_indicator
1509
1510 # Function arguments override defaults
1511 defaultset &= ~checkunset
1512 defaultunset &= ~checkset
1513
1514 # Merge arguments with remaining defaults, and check for conflicts
1515 checkset |= defaultset
1516 checkunset |= defaultunset
1517 inboth = checkset & checkunset & ~ignore
1518 if inboth:
1519 raise Exception("contradictory set, unset requirements for flags "
1520 "{0:#x}".format(inboth))
1521
1522 # Compare with given msg_flags value
1523 mask = (checkset | checkunset) & ~ignore
1524 self.assertEqual(flags & mask, checkset & mask)
1525
1526
1527class RecvmsgIntoMixin(SendrecvmsgBase):
1528 # Mixin to implement doRecvmsg() using recvmsg_into().
1529
1530 def doRecvmsg(self, sock, bufsize, *args):
1531 buf = bytearray(bufsize)
1532 result = sock.recvmsg_into([buf], *args)
1533 self.registerRecvmsgResult(result)
1534 self.assertGreaterEqual(result[0], 0)
1535 self.assertLessEqual(result[0], bufsize)
1536 return (bytes(buf[:result[0]]),) + result[1:]
1537
1538
1539class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1540 # Defines flags to be checked in msg_flags for datagram sockets.
1541
1542 @property
1543 def msg_flags_non_eor_indicator(self):
1544 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1545
1546
1547class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1548 # Defines flags to be checked in msg_flags for SCTP sockets.
1549
1550 @property
1551 def msg_flags_eor_indicator(self):
1552 return super().msg_flags_eor_indicator | socket.MSG_EOR
1553
1554
1555class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1556 # Base class for tests on connectionless-mode sockets. Users must
1557 # supply sockets on attributes cli and serv to be mapped to
1558 # cli_sock and serv_sock respectively.
1559
1560 @property
1561 def serv_sock(self):
1562 return self.serv
1563
1564 @property
1565 def cli_sock(self):
1566 return self.cli
1567
1568 @property
1569 def sendmsg_to_server_defaults(self):
1570 return ([], [], 0, self.serv_addr)
1571
1572 def sendToServer(self, msg):
1573 return self.cli_sock.sendto(msg, self.serv_addr)
1574
1575
1576class SendrecvmsgConnectedBase(SendrecvmsgBase):
1577 # Base class for tests on connected sockets. Users must supply
1578 # sockets on attributes serv_conn and cli_conn (representing the
1579 # connections *to* the server and the client), to be mapped to
1580 # cli_sock and serv_sock respectively.
1581
1582 @property
1583 def serv_sock(self):
1584 return self.cli_conn
1585
1586 @property
1587 def cli_sock(self):
1588 return self.serv_conn
1589
1590 def checkRecvmsgAddress(self, addr1, addr2):
1591 # Address is currently "unspecified" for a connected socket,
1592 # so we don't examine it
1593 pass
1594
1595
1596class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1597 # Base class to set a timeout on server's socket.
1598
1599 def setUp(self):
1600 super().setUp()
1601 self.serv_sock.settimeout(self.fail_timeout)
1602
1603
1604class SendmsgTests(SendrecvmsgServerTimeoutBase):
1605 # Tests for sendmsg() which can use any socket type and do not
1606 # involve recvmsg() or recvmsg_into().
1607
1608 def testSendmsg(self):
1609 # Send a simple message with sendmsg().
1610 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1611
1612 def _testSendmsg(self):
1613 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1614
1615 def testSendmsgDataGenerator(self):
1616 # Send from buffer obtained from a generator (not a sequence).
1617 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1618
1619 def _testSendmsgDataGenerator(self):
1620 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1621 len(MSG))
1622
1623 def testSendmsgAncillaryGenerator(self):
1624 # Gather (empty) ancillary data from a generator.
1625 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1626
1627 def _testSendmsgAncillaryGenerator(self):
1628 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1629 len(MSG))
1630
1631 def testSendmsgArray(self):
1632 # Send data from an array instead of the usual bytes object.
1633 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1634
1635 def _testSendmsgArray(self):
1636 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1637 len(MSG))
1638
1639 def testSendmsgGather(self):
1640 # Send message data from more than one buffer (gather write).
1641 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1642
1643 def _testSendmsgGather(self):
1644 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1645
1646 def testSendmsgBadArgs(self):
1647 # Check that sendmsg() rejects invalid arguments.
1648 self.assertEqual(self.serv_sock.recv(1000), b"done")
1649
1650 def _testSendmsgBadArgs(self):
1651 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1652 self.assertRaises(TypeError, self.sendmsgToServer,
1653 b"not in an iterable")
1654 self.assertRaises(TypeError, self.sendmsgToServer,
1655 object())
1656 self.assertRaises(TypeError, self.sendmsgToServer,
1657 [object()])
1658 self.assertRaises(TypeError, self.sendmsgToServer,
1659 [MSG, object()])
1660 self.assertRaises(TypeError, self.sendmsgToServer,
1661 [MSG], object())
1662 self.assertRaises(TypeError, self.sendmsgToServer,
1663 [MSG], [], object())
1664 self.assertRaises(TypeError, self.sendmsgToServer,
1665 [MSG], [], 0, object())
1666 self.sendToServer(b"done")
1667
1668 def testSendmsgBadCmsg(self):
1669 # Check that invalid ancillary data items are rejected.
1670 self.assertEqual(self.serv_sock.recv(1000), b"done")
1671
1672 def _testSendmsgBadCmsg(self):
1673 self.assertRaises(TypeError, self.sendmsgToServer,
1674 [MSG], [object()])
1675 self.assertRaises(TypeError, self.sendmsgToServer,
1676 [MSG], [(object(), 0, b"data")])
1677 self.assertRaises(TypeError, self.sendmsgToServer,
1678 [MSG], [(0, object(), b"data")])
1679 self.assertRaises(TypeError, self.sendmsgToServer,
1680 [MSG], [(0, 0, object())])
1681 self.assertRaises(TypeError, self.sendmsgToServer,
1682 [MSG], [(0, 0)])
1683 self.assertRaises(TypeError, self.sendmsgToServer,
1684 [MSG], [(0, 0, b"data", 42)])
1685 self.sendToServer(b"done")
1686
1687 @requireAttrs(socket, "CMSG_SPACE")
1688 def testSendmsgBadMultiCmsg(self):
1689 # Check that invalid ancillary data items are rejected when
1690 # more than one item is present.
1691 self.assertEqual(self.serv_sock.recv(1000), b"done")
1692
1693 @testSendmsgBadMultiCmsg.client_skip
1694 def _testSendmsgBadMultiCmsg(self):
1695 self.assertRaises(TypeError, self.sendmsgToServer,
1696 [MSG], [0, 0, b""])
1697 self.assertRaises(TypeError, self.sendmsgToServer,
1698 [MSG], [(0, 0, b""), object()])
1699 self.sendToServer(b"done")
1700
1701 def testSendmsgExcessCmsgReject(self):
1702 # Check that sendmsg() rejects excess ancillary data items
1703 # when the number that can be sent is limited.
1704 self.assertEqual(self.serv_sock.recv(1000), b"done")
1705
1706 def _testSendmsgExcessCmsgReject(self):
1707 if not hasattr(socket, "CMSG_SPACE"):
1708 # Can only send one item
1709 with self.assertRaises(socket.error) as cm:
1710 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1711 self.assertIsNone(cm.exception.errno)
1712 self.sendToServer(b"done")
1713
1714 def testSendmsgAfterClose(self):
1715 # Check that sendmsg() fails on a closed socket.
1716 pass
1717
1718 def _testSendmsgAfterClose(self):
1719 self.cli_sock.close()
1720 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1721
1722
1723class SendmsgStreamTests(SendmsgTests):
1724 # Tests for sendmsg() which require a stream socket and do not
1725 # involve recvmsg() or recvmsg_into().
1726
1727 def testSendmsgExplicitNoneAddr(self):
1728 # Check that peer address can be specified as None.
1729 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1730
1731 def _testSendmsgExplicitNoneAddr(self):
1732 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1733
1734 def testSendmsgTimeout(self):
1735 # Check that timeout works with sendmsg().
1736 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1737 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1738
1739 def _testSendmsgTimeout(self):
1740 try:
1741 self.cli_sock.settimeout(0.03)
1742 with self.assertRaises(socket.timeout):
1743 while True:
1744 self.sendmsgToServer([b"a"*512])
1745 finally:
1746 self.misc_event.set()
1747
1748 # XXX: would be nice to have more tests for sendmsg flags argument.
1749
1750 # Linux supports MSG_DONTWAIT when sending, but in general, it
1751 # only works when receiving. Could add other platforms if they
1752 # support it too.
1753 @skipWithClientIf(sys.platform not in {"linux2"},
1754 "MSG_DONTWAIT not known to work on this platform when "
1755 "sending")
1756 def testSendmsgDontWait(self):
1757 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1758 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1759 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1760
1761 @testSendmsgDontWait.client_skip
1762 def _testSendmsgDontWait(self):
1763 try:
1764 with self.assertRaises(socket.error) as cm:
1765 while True:
1766 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1767 self.assertIn(cm.exception.errno,
1768 (errno.EAGAIN, errno.EWOULDBLOCK))
1769 finally:
1770 self.misc_event.set()
1771
1772
1773class SendmsgConnectionlessTests(SendmsgTests):
1774 # Tests for sendmsg() which require a connectionless-mode
1775 # (e.g. datagram) socket, and do not involve recvmsg() or
1776 # recvmsg_into().
1777
1778 def testSendmsgNoDestAddr(self):
1779 # Check that sendmsg() fails when no destination address is
1780 # given for unconnected socket.
1781 pass
1782
1783 def _testSendmsgNoDestAddr(self):
1784 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1785 [MSG])
1786 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1787 [MSG], [], 0, None)
1788
1789
1790class RecvmsgGenericTests(SendrecvmsgBase):
1791 # Tests for recvmsg() which can also be emulated using
1792 # recvmsg_into(), and can use any socket type.
1793
1794 def testRecvmsg(self):
1795 # Receive a simple message with recvmsg[_into]().
1796 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1797 self.assertEqual(msg, MSG)
1798 self.checkRecvmsgAddress(addr, self.cli_addr)
1799 self.assertEqual(ancdata, [])
1800 self.checkFlags(flags, eor=True)
1801
1802 def _testRecvmsg(self):
1803 self.sendToServer(MSG)
1804
1805 def testRecvmsgExplicitDefaults(self):
1806 # Test recvmsg[_into]() with default arguments provided explicitly.
1807 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1808 len(MSG), 0, 0)
1809 self.assertEqual(msg, MSG)
1810 self.checkRecvmsgAddress(addr, self.cli_addr)
1811 self.assertEqual(ancdata, [])
1812 self.checkFlags(flags, eor=True)
1813
1814 def _testRecvmsgExplicitDefaults(self):
1815 self.sendToServer(MSG)
1816
1817 def testRecvmsgShorter(self):
1818 # Receive a message smaller than buffer.
1819 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1820 len(MSG) + 42)
1821 self.assertEqual(msg, MSG)
1822 self.checkRecvmsgAddress(addr, self.cli_addr)
1823 self.assertEqual(ancdata, [])
1824 self.checkFlags(flags, eor=True)
1825
1826 def _testRecvmsgShorter(self):
1827 self.sendToServer(MSG)
1828
Charles-François Natali8619cd72011-10-03 19:43:15 +02001829 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
1830 # datagram is received (issue #13001).
1831 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001832 def testRecvmsgTrunc(self):
1833 # Receive part of message, check for truncation indicators.
1834 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1835 len(MSG) - 3)
1836 self.assertEqual(msg, MSG[:-3])
1837 self.checkRecvmsgAddress(addr, self.cli_addr)
1838 self.assertEqual(ancdata, [])
1839 self.checkFlags(flags, eor=False)
1840
Charles-François Natali8619cd72011-10-03 19:43:15 +02001841 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001842 def _testRecvmsgTrunc(self):
1843 self.sendToServer(MSG)
1844
1845 def testRecvmsgShortAncillaryBuf(self):
1846 # Test ancillary data buffer too small to hold any ancillary data.
1847 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1848 len(MSG), 1)
1849 self.assertEqual(msg, MSG)
1850 self.checkRecvmsgAddress(addr, self.cli_addr)
1851 self.assertEqual(ancdata, [])
1852 self.checkFlags(flags, eor=True)
1853
1854 def _testRecvmsgShortAncillaryBuf(self):
1855 self.sendToServer(MSG)
1856
1857 def testRecvmsgLongAncillaryBuf(self):
1858 # Test large ancillary data buffer.
1859 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1860 len(MSG), 10240)
1861 self.assertEqual(msg, MSG)
1862 self.checkRecvmsgAddress(addr, self.cli_addr)
1863 self.assertEqual(ancdata, [])
1864 self.checkFlags(flags, eor=True)
1865
1866 def _testRecvmsgLongAncillaryBuf(self):
1867 self.sendToServer(MSG)
1868
1869 def testRecvmsgAfterClose(self):
1870 # Check that recvmsg[_into]() fails on a closed socket.
1871 self.serv_sock.close()
1872 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
1873
1874 def _testRecvmsgAfterClose(self):
1875 pass
1876
1877 def testRecvmsgTimeout(self):
1878 # Check that timeout works.
1879 try:
1880 self.serv_sock.settimeout(0.03)
1881 self.assertRaises(socket.timeout,
1882 self.doRecvmsg, self.serv_sock, len(MSG))
1883 finally:
1884 self.misc_event.set()
1885
1886 def _testRecvmsgTimeout(self):
1887 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1888
1889 @requireAttrs(socket, "MSG_PEEK")
1890 def testRecvmsgPeek(self):
1891 # Check that MSG_PEEK in flags enables examination of pending
1892 # data without consuming it.
1893
1894 # Receive part of data with MSG_PEEK.
1895 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1896 len(MSG) - 3, 0,
1897 socket.MSG_PEEK)
1898 self.assertEqual(msg, MSG[:-3])
1899 self.checkRecvmsgAddress(addr, self.cli_addr)
1900 self.assertEqual(ancdata, [])
1901 # Ignoring MSG_TRUNC here (so this test is the same for stream
1902 # and datagram sockets). Some wording in POSIX seems to
1903 # suggest that it needn't be set when peeking, but that may
1904 # just be a slip.
1905 self.checkFlags(flags, eor=False,
1906 ignore=getattr(socket, "MSG_TRUNC", 0))
1907
1908 # Receive all data with MSG_PEEK.
1909 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1910 len(MSG), 0,
1911 socket.MSG_PEEK)
1912 self.assertEqual(msg, MSG)
1913 self.checkRecvmsgAddress(addr, self.cli_addr)
1914 self.assertEqual(ancdata, [])
1915 self.checkFlags(flags, eor=True)
1916
1917 # Check that the same data can still be received normally.
1918 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1919 self.assertEqual(msg, MSG)
1920 self.checkRecvmsgAddress(addr, self.cli_addr)
1921 self.assertEqual(ancdata, [])
1922 self.checkFlags(flags, eor=True)
1923
1924 @testRecvmsgPeek.client_skip
1925 def _testRecvmsgPeek(self):
1926 self.sendToServer(MSG)
1927
1928 @requireAttrs(socket.socket, "sendmsg")
1929 def testRecvmsgFromSendmsg(self):
1930 # Test receiving with recvmsg[_into]() when message is sent
1931 # using sendmsg().
1932 self.serv_sock.settimeout(self.fail_timeout)
1933 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1934 self.assertEqual(msg, MSG)
1935 self.checkRecvmsgAddress(addr, self.cli_addr)
1936 self.assertEqual(ancdata, [])
1937 self.checkFlags(flags, eor=True)
1938
1939 @testRecvmsgFromSendmsg.client_skip
1940 def _testRecvmsgFromSendmsg(self):
1941 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1942
1943
1944class RecvmsgGenericStreamTests(RecvmsgGenericTests):
1945 # Tests which require a stream socket and can use either recvmsg()
1946 # or recvmsg_into().
1947
1948 def testRecvmsgEOF(self):
1949 # Receive end-of-stream indicator (b"", peer socket closed).
1950 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1951 self.assertEqual(msg, b"")
1952 self.checkRecvmsgAddress(addr, self.cli_addr)
1953 self.assertEqual(ancdata, [])
1954 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
1955
1956 def _testRecvmsgEOF(self):
1957 self.cli_sock.close()
1958
1959 def testRecvmsgOverflow(self):
1960 # Receive a message in more than one chunk.
1961 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1962 len(MSG) - 3)
1963 self.checkRecvmsgAddress(addr, self.cli_addr)
1964 self.assertEqual(ancdata, [])
1965 self.checkFlags(flags, eor=False)
1966
1967 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1968 self.checkRecvmsgAddress(addr, self.cli_addr)
1969 self.assertEqual(ancdata, [])
1970 self.checkFlags(flags, eor=True)
1971
1972 msg = seg1 + seg2
1973 self.assertEqual(msg, MSG)
1974
1975 def _testRecvmsgOverflow(self):
1976 self.sendToServer(MSG)
1977
1978
1979class RecvmsgTests(RecvmsgGenericTests):
1980 # Tests for recvmsg() which can use any socket type.
1981
1982 def testRecvmsgBadArgs(self):
1983 # Check that recvmsg() rejects invalid arguments.
1984 self.assertRaises(TypeError, self.serv_sock.recvmsg)
1985 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1986 -1, 0, 0)
1987 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1988 len(MSG), -1, 0)
1989 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1990 [bytearray(10)], 0, 0)
1991 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1992 object(), 0, 0)
1993 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1994 len(MSG), object(), 0)
1995 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1996 len(MSG), 0, object())
1997
1998 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
1999 self.assertEqual(msg, MSG)
2000 self.checkRecvmsgAddress(addr, self.cli_addr)
2001 self.assertEqual(ancdata, [])
2002 self.checkFlags(flags, eor=True)
2003
2004 def _testRecvmsgBadArgs(self):
2005 self.sendToServer(MSG)
2006
2007
2008class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2009 # Tests for recvmsg_into() which can use any socket type.
2010
2011 def testRecvmsgIntoBadArgs(self):
2012 # Check that recvmsg_into() rejects invalid arguments.
2013 buf = bytearray(len(MSG))
2014 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2015 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2016 len(MSG), 0, 0)
2017 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2018 buf, 0, 0)
2019 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2020 [object()], 0, 0)
2021 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2022 [b"I'm not writable"], 0, 0)
2023 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2024 [buf, object()], 0, 0)
2025 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2026 [buf], -1, 0)
2027 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2028 [buf], object(), 0)
2029 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2030 [buf], 0, object())
2031
2032 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2033 self.assertEqual(nbytes, len(MSG))
2034 self.assertEqual(buf, bytearray(MSG))
2035 self.checkRecvmsgAddress(addr, self.cli_addr)
2036 self.assertEqual(ancdata, [])
2037 self.checkFlags(flags, eor=True)
2038
2039 def _testRecvmsgIntoBadArgs(self):
2040 self.sendToServer(MSG)
2041
2042 def testRecvmsgIntoGenerator(self):
2043 # Receive into buffer obtained from a generator (not a sequence).
2044 buf = bytearray(len(MSG))
2045 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2046 (o for o in [buf]))
2047 self.assertEqual(nbytes, len(MSG))
2048 self.assertEqual(buf, bytearray(MSG))
2049 self.checkRecvmsgAddress(addr, self.cli_addr)
2050 self.assertEqual(ancdata, [])
2051 self.checkFlags(flags, eor=True)
2052
2053 def _testRecvmsgIntoGenerator(self):
2054 self.sendToServer(MSG)
2055
2056 def testRecvmsgIntoArray(self):
2057 # Receive into an array rather than the usual bytearray.
2058 buf = array.array("B", [0] * len(MSG))
2059 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2060 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002061 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002062 self.checkRecvmsgAddress(addr, self.cli_addr)
2063 self.assertEqual(ancdata, [])
2064 self.checkFlags(flags, eor=True)
2065
2066 def _testRecvmsgIntoArray(self):
2067 self.sendToServer(MSG)
2068
2069 def testRecvmsgIntoScatter(self):
2070 # Receive into multiple buffers (scatter write).
2071 b1 = bytearray(b"----")
2072 b2 = bytearray(b"0123456789")
2073 b3 = bytearray(b"--------------")
2074 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2075 [b1, memoryview(b2)[2:9], b3])
2076 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2077 self.assertEqual(b1, bytearray(b"Mary"))
2078 self.assertEqual(b2, bytearray(b"01 had a 9"))
2079 self.assertEqual(b3, bytearray(b"little lamb---"))
2080 self.checkRecvmsgAddress(addr, self.cli_addr)
2081 self.assertEqual(ancdata, [])
2082 self.checkFlags(flags, eor=True)
2083
2084 def _testRecvmsgIntoScatter(self):
2085 self.sendToServer(b"Mary had a little lamb")
2086
2087
2088class CmsgMacroTests(unittest.TestCase):
2089 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2090 # assumptions used by sendmsg() and recvmsg[_into](), which share
2091 # code with these functions.
2092
2093 # Match the definition in socketmodule.c
2094 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2095
2096 @requireAttrs(socket, "CMSG_LEN")
2097 def testCMSG_LEN(self):
2098 # Test CMSG_LEN() with various valid and invalid values,
2099 # checking the assumptions used by recvmsg() and sendmsg().
2100 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2101 values = list(range(257)) + list(range(toobig - 257, toobig))
2102
2103 # struct cmsghdr has at least three members, two of which are ints
2104 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2105 for n in values:
2106 ret = socket.CMSG_LEN(n)
2107 # This is how recvmsg() calculates the data size
2108 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2109 self.assertLessEqual(ret, self.socklen_t_limit)
2110
2111 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2112 # sendmsg() shares code with these functions, and requires
2113 # that it reject values over the limit.
2114 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2115 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2116
2117 @requireAttrs(socket, "CMSG_SPACE")
2118 def testCMSG_SPACE(self):
2119 # Test CMSG_SPACE() with various valid and invalid values,
2120 # checking the assumptions used by sendmsg().
2121 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2122 values = list(range(257)) + list(range(toobig - 257, toobig))
2123
2124 last = socket.CMSG_SPACE(0)
2125 # struct cmsghdr has at least three members, two of which are ints
2126 self.assertGreater(last, array.array("i").itemsize * 2)
2127 for n in values:
2128 ret = socket.CMSG_SPACE(n)
2129 self.assertGreaterEqual(ret, last)
2130 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2131 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2132 self.assertLessEqual(ret, self.socklen_t_limit)
2133 last = ret
2134
2135 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2136 # sendmsg() shares code with these functions, and requires
2137 # that it reject values over the limit.
2138 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2139 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2140
2141
2142class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2143 # Tests for file descriptor passing on Unix-domain sockets.
2144
2145 # Invalid file descriptor value that's unlikely to evaluate to a
2146 # real FD even if one of its bytes is replaced with a different
2147 # value (which shouldn't actually happen).
2148 badfd = -0x5555
2149
2150 def newFDs(self, n):
2151 # Return a list of n file descriptors for newly-created files
2152 # containing their list indices as ASCII numbers.
2153 fds = []
2154 for i in range(n):
2155 fd, path = tempfile.mkstemp()
2156 self.addCleanup(os.unlink, path)
2157 self.addCleanup(os.close, fd)
2158 os.write(fd, str(i).encode())
2159 fds.append(fd)
2160 return fds
2161
2162 def checkFDs(self, fds):
2163 # Check that the file descriptors in the given list contain
2164 # their correct list indices as ASCII numbers.
2165 for n, fd in enumerate(fds):
2166 os.lseek(fd, 0, os.SEEK_SET)
2167 self.assertEqual(os.read(fd, 1024), str(n).encode())
2168
2169 def registerRecvmsgResult(self, result):
2170 self.addCleanup(self.closeRecvmsgFDs, result)
2171
2172 def closeRecvmsgFDs(self, recvmsg_result):
2173 # Close all file descriptors specified in the ancillary data
2174 # of the given return value from recvmsg() or recvmsg_into().
2175 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2176 if (cmsg_level == socket.SOL_SOCKET and
2177 cmsg_type == socket.SCM_RIGHTS):
2178 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002179 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002180 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2181 for fd in fds:
2182 os.close(fd)
2183
2184 def createAndSendFDs(self, n):
2185 # Send n new file descriptors created by newFDs() to the
2186 # server, with the constant MSG as the non-ancillary data.
2187 self.assertEqual(
2188 self.sendmsgToServer([MSG],
2189 [(socket.SOL_SOCKET,
2190 socket.SCM_RIGHTS,
2191 array.array("i", self.newFDs(n)))]),
2192 len(MSG))
2193
2194 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2195 # Check that constant MSG was received with numfds file
2196 # descriptors in a maximum of maxcmsgs control messages (which
2197 # must contain only complete integers). By default, check
2198 # that MSG_CTRUNC is unset, but ignore any flags in
2199 # ignoreflags.
2200 msg, ancdata, flags, addr = result
2201 self.assertEqual(msg, MSG)
2202 self.checkRecvmsgAddress(addr, self.cli_addr)
2203 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2204 ignore=ignoreflags)
2205
2206 self.assertIsInstance(ancdata, list)
2207 self.assertLessEqual(len(ancdata), maxcmsgs)
2208 fds = array.array("i")
2209 for item in ancdata:
2210 self.assertIsInstance(item, tuple)
2211 cmsg_level, cmsg_type, cmsg_data = item
2212 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2213 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2214 self.assertIsInstance(cmsg_data, bytes)
2215 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002216 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002217
2218 self.assertEqual(len(fds), numfds)
2219 self.checkFDs(fds)
2220
2221 def testFDPassSimple(self):
2222 # Pass a single FD (array read from bytes object).
2223 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2224 len(MSG), 10240))
2225
2226 def _testFDPassSimple(self):
2227 self.assertEqual(
2228 self.sendmsgToServer(
2229 [MSG],
2230 [(socket.SOL_SOCKET,
2231 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002232 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002233 len(MSG))
2234
2235 def testMultipleFDPass(self):
2236 # Pass multiple FDs in a single array.
2237 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2238 len(MSG), 10240))
2239
2240 def _testMultipleFDPass(self):
2241 self.createAndSendFDs(4)
2242
2243 @requireAttrs(socket, "CMSG_SPACE")
2244 def testFDPassCMSG_SPACE(self):
2245 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2246 self.checkRecvmsgFDs(
2247 4, self.doRecvmsg(self.serv_sock, len(MSG),
2248 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2249
2250 @testFDPassCMSG_SPACE.client_skip
2251 def _testFDPassCMSG_SPACE(self):
2252 self.createAndSendFDs(4)
2253
2254 def testFDPassCMSG_LEN(self):
2255 # Test using CMSG_LEN() to calculate ancillary buffer size.
2256 self.checkRecvmsgFDs(1,
2257 self.doRecvmsg(self.serv_sock, len(MSG),
2258 socket.CMSG_LEN(4 * SIZEOF_INT)),
2259 # RFC 3542 says implementations may set
2260 # MSG_CTRUNC if there isn't enough space
2261 # for trailing padding.
2262 ignoreflags=socket.MSG_CTRUNC)
2263
2264 def _testFDPassCMSG_LEN(self):
2265 self.createAndSendFDs(1)
2266
Nick Coghlan2496f332011-09-19 20:26:31 +10002267 # Issue #12958: The following test has problems on Mac OS X
2268 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002269 @requireAttrs(socket, "CMSG_SPACE")
2270 def testFDPassSeparate(self):
2271 # Pass two FDs in two separate arrays. Arrays may be combined
2272 # into a single control message by the OS.
2273 self.checkRecvmsgFDs(2,
2274 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2275 maxcmsgs=2)
2276
2277 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002278 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002279 def _testFDPassSeparate(self):
2280 fd0, fd1 = self.newFDs(2)
2281 self.assertEqual(
2282 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2283 socket.SCM_RIGHTS,
2284 array.array("i", [fd0])),
2285 (socket.SOL_SOCKET,
2286 socket.SCM_RIGHTS,
2287 array.array("i", [fd1]))]),
2288 len(MSG))
2289
Nick Coghlan2496f332011-09-19 20:26:31 +10002290 # Issue #12958: The following test has problems on Mac OS X
2291 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002292 @requireAttrs(socket, "CMSG_SPACE")
2293 def testFDPassSeparateMinSpace(self):
2294 # Pass two FDs in two separate arrays, receiving them into the
2295 # minimum space for two arrays.
2296 self.checkRecvmsgFDs(2,
2297 self.doRecvmsg(self.serv_sock, len(MSG),
2298 socket.CMSG_SPACE(SIZEOF_INT) +
2299 socket.CMSG_LEN(SIZEOF_INT)),
2300 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2301
2302 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002303 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002304 def _testFDPassSeparateMinSpace(self):
2305 fd0, fd1 = self.newFDs(2)
2306 self.assertEqual(
2307 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2308 socket.SCM_RIGHTS,
2309 array.array("i", [fd0])),
2310 (socket.SOL_SOCKET,
2311 socket.SCM_RIGHTS,
2312 array.array("i", [fd1]))]),
2313 len(MSG))
2314
2315 def sendAncillaryIfPossible(self, msg, ancdata):
2316 # Try to send msg and ancdata to server, but if the system
2317 # call fails, just send msg with no ancillary data.
2318 try:
2319 nbytes = self.sendmsgToServer([msg], ancdata)
2320 except socket.error as e:
2321 # Check that it was the system call that failed
2322 self.assertIsInstance(e.errno, int)
2323 nbytes = self.sendmsgToServer([msg])
2324 self.assertEqual(nbytes, len(msg))
2325
2326 def testFDPassEmpty(self):
2327 # Try to pass an empty FD array. Can receive either no array
2328 # or an empty array.
2329 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2330 len(MSG), 10240),
2331 ignoreflags=socket.MSG_CTRUNC)
2332
2333 def _testFDPassEmpty(self):
2334 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2335 socket.SCM_RIGHTS,
2336 b"")])
2337
2338 def testFDPassPartialInt(self):
2339 # Try to pass a truncated FD array.
2340 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2341 len(MSG), 10240)
2342 self.assertEqual(msg, MSG)
2343 self.checkRecvmsgAddress(addr, self.cli_addr)
2344 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2345 self.assertLessEqual(len(ancdata), 1)
2346 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2347 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2348 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2349 self.assertLess(len(cmsg_data), SIZEOF_INT)
2350
2351 def _testFDPassPartialInt(self):
2352 self.sendAncillaryIfPossible(
2353 MSG,
2354 [(socket.SOL_SOCKET,
2355 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002356 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002357
2358 @requireAttrs(socket, "CMSG_SPACE")
2359 def testFDPassPartialIntInMiddle(self):
2360 # Try to pass two FD arrays, the first of which is truncated.
2361 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2362 len(MSG), 10240)
2363 self.assertEqual(msg, MSG)
2364 self.checkRecvmsgAddress(addr, self.cli_addr)
2365 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2366 self.assertLessEqual(len(ancdata), 2)
2367 fds = array.array("i")
2368 # Arrays may have been combined in a single control message
2369 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2370 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2371 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002372 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002373 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2374 self.assertLessEqual(len(fds), 2)
2375 self.checkFDs(fds)
2376
2377 @testFDPassPartialIntInMiddle.client_skip
2378 def _testFDPassPartialIntInMiddle(self):
2379 fd0, fd1 = self.newFDs(2)
2380 self.sendAncillaryIfPossible(
2381 MSG,
2382 [(socket.SOL_SOCKET,
2383 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002384 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002385 (socket.SOL_SOCKET,
2386 socket.SCM_RIGHTS,
2387 array.array("i", [fd1]))])
2388
2389 def checkTruncatedHeader(self, result, ignoreflags=0):
2390 # Check that no ancillary data items are returned when data is
2391 # truncated inside the cmsghdr structure.
2392 msg, ancdata, flags, addr = result
2393 self.assertEqual(msg, MSG)
2394 self.checkRecvmsgAddress(addr, self.cli_addr)
2395 self.assertEqual(ancdata, [])
2396 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2397 ignore=ignoreflags)
2398
2399 def testCmsgTruncNoBufSize(self):
2400 # Check that no ancillary data is received when no buffer size
2401 # is specified.
2402 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2403 # BSD seems to set MSG_CTRUNC only
2404 # if an item has been partially
2405 # received.
2406 ignoreflags=socket.MSG_CTRUNC)
2407
2408 def _testCmsgTruncNoBufSize(self):
2409 self.createAndSendFDs(1)
2410
2411 def testCmsgTrunc0(self):
2412 # Check that no ancillary data is received when buffer size is 0.
2413 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2414 ignoreflags=socket.MSG_CTRUNC)
2415
2416 def _testCmsgTrunc0(self):
2417 self.createAndSendFDs(1)
2418
2419 # Check that no ancillary data is returned for various non-zero
2420 # (but still too small) buffer sizes.
2421
2422 def testCmsgTrunc1(self):
2423 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2424
2425 def _testCmsgTrunc1(self):
2426 self.createAndSendFDs(1)
2427
2428 def testCmsgTrunc2Int(self):
2429 # The cmsghdr structure has at least three members, two of
2430 # which are ints, so we still shouldn't see any ancillary
2431 # data.
2432 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2433 SIZEOF_INT * 2))
2434
2435 def _testCmsgTrunc2Int(self):
2436 self.createAndSendFDs(1)
2437
2438 def testCmsgTruncLen0Minus1(self):
2439 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2440 socket.CMSG_LEN(0) - 1))
2441
2442 def _testCmsgTruncLen0Minus1(self):
2443 self.createAndSendFDs(1)
2444
2445 # The following tests try to truncate the control message in the
2446 # middle of the FD array.
2447
2448 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2449 # Check that file descriptor data is truncated to between
2450 # mindata and maxdata bytes when received with buffer size
2451 # ancbuf, and that any complete file descriptor numbers are
2452 # valid.
2453 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2454 len(MSG), ancbuf)
2455 self.assertEqual(msg, MSG)
2456 self.checkRecvmsgAddress(addr, self.cli_addr)
2457 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2458
2459 if mindata == 0 and ancdata == []:
2460 return
2461 self.assertEqual(len(ancdata), 1)
2462 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2463 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2464 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2465 self.assertGreaterEqual(len(cmsg_data), mindata)
2466 self.assertLessEqual(len(cmsg_data), maxdata)
2467 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002468 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002469 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2470 self.checkFDs(fds)
2471
2472 def testCmsgTruncLen0(self):
2473 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2474
2475 def _testCmsgTruncLen0(self):
2476 self.createAndSendFDs(1)
2477
2478 def testCmsgTruncLen0Plus1(self):
2479 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2480
2481 def _testCmsgTruncLen0Plus1(self):
2482 self.createAndSendFDs(2)
2483
2484 def testCmsgTruncLen1(self):
2485 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2486 maxdata=SIZEOF_INT)
2487
2488 def _testCmsgTruncLen1(self):
2489 self.createAndSendFDs(2)
2490
2491 def testCmsgTruncLen2Minus1(self):
2492 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2493 maxdata=(2 * SIZEOF_INT) - 1)
2494
2495 def _testCmsgTruncLen2Minus1(self):
2496 self.createAndSendFDs(2)
2497
2498
2499class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2500 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2501 # features of the RFC 3542 Advanced Sockets API for IPv6.
2502 # Currently we can only handle certain data items (e.g. traffic
2503 # class, hop limit, MTU discovery and fragmentation settings)
2504 # without resorting to unportable means such as the struct module,
2505 # but the tests here are aimed at testing the ancillary data
2506 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2507 # itself.
2508
2509 # Test value to use when setting hop limit of packet
2510 hop_limit = 2
2511
2512 # Test value to use when setting traffic class of packet.
2513 # -1 means "use kernel default".
2514 traffic_class = -1
2515
2516 def ancillaryMapping(self, ancdata):
2517 # Given ancillary data list ancdata, return a mapping from
2518 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2519 # Check that no (level, type) pair appears more than once.
2520 d = {}
2521 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2522 self.assertNotIn((cmsg_level, cmsg_type), d)
2523 d[(cmsg_level, cmsg_type)] = cmsg_data
2524 return d
2525
2526 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2527 # Receive hop limit into ancbufsize bytes of ancillary data
2528 # space. Check that data is MSG, ancillary data is not
2529 # truncated (but ignore any flags in ignoreflags), and hop
2530 # limit is between 0 and maxhop inclusive.
2531 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2532 socket.IPV6_RECVHOPLIMIT, 1)
2533 self.misc_event.set()
2534 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2535 len(MSG), ancbufsize)
2536
2537 self.assertEqual(msg, MSG)
2538 self.checkRecvmsgAddress(addr, self.cli_addr)
2539 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2540 ignore=ignoreflags)
2541
2542 self.assertEqual(len(ancdata), 1)
2543 self.assertIsInstance(ancdata[0], tuple)
2544 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2545 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2546 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2547 self.assertIsInstance(cmsg_data, bytes)
2548 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2549 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002550 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002551 self.assertGreaterEqual(a[0], 0)
2552 self.assertLessEqual(a[0], maxhop)
2553
2554 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2555 def testRecvHopLimit(self):
2556 # Test receiving the packet hop limit as ancillary data.
2557 self.checkHopLimit(ancbufsize=10240)
2558
2559 @testRecvHopLimit.client_skip
2560 def _testRecvHopLimit(self):
2561 # Need to wait until server has asked to receive ancillary
2562 # data, as implementations are not required to buffer it
2563 # otherwise.
2564 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2565 self.sendToServer(MSG)
2566
2567 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2568 def testRecvHopLimitCMSG_SPACE(self):
2569 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2570 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2571
2572 @testRecvHopLimitCMSG_SPACE.client_skip
2573 def _testRecvHopLimitCMSG_SPACE(self):
2574 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2575 self.sendToServer(MSG)
2576
2577 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2578 # 3542 says portable applications must provide space for trailing
2579 # padding. Implementations may set MSG_CTRUNC if there isn't
2580 # enough space for the padding.
2581
2582 @requireAttrs(socket.socket, "sendmsg")
2583 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2584 def testSetHopLimit(self):
2585 # Test setting hop limit on outgoing packet and receiving it
2586 # at the other end.
2587 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2588
2589 @testSetHopLimit.client_skip
2590 def _testSetHopLimit(self):
2591 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2592 self.assertEqual(
2593 self.sendmsgToServer([MSG],
2594 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2595 array.array("i", [self.hop_limit]))]),
2596 len(MSG))
2597
2598 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2599 ignoreflags=0):
2600 # Receive traffic class and hop limit into ancbufsize bytes of
2601 # ancillary data space. Check that data is MSG, ancillary
2602 # data is not truncated (but ignore any flags in ignoreflags),
2603 # and traffic class and hop limit are in range (hop limit no
2604 # more than maxhop).
2605 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2606 socket.IPV6_RECVHOPLIMIT, 1)
2607 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2608 socket.IPV6_RECVTCLASS, 1)
2609 self.misc_event.set()
2610 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2611 len(MSG), ancbufsize)
2612
2613 self.assertEqual(msg, MSG)
2614 self.checkRecvmsgAddress(addr, self.cli_addr)
2615 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2616 ignore=ignoreflags)
2617 self.assertEqual(len(ancdata), 2)
2618 ancmap = self.ancillaryMapping(ancdata)
2619
2620 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2621 self.assertEqual(len(tcdata), SIZEOF_INT)
2622 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002623 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002624 self.assertGreaterEqual(a[0], 0)
2625 self.assertLessEqual(a[0], 255)
2626
2627 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2628 self.assertEqual(len(hldata), SIZEOF_INT)
2629 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002630 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002631 self.assertGreaterEqual(a[0], 0)
2632 self.assertLessEqual(a[0], maxhop)
2633
2634 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2635 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2636 def testRecvTrafficClassAndHopLimit(self):
2637 # Test receiving traffic class and hop limit as ancillary data.
2638 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2639
2640 @testRecvTrafficClassAndHopLimit.client_skip
2641 def _testRecvTrafficClassAndHopLimit(self):
2642 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2643 self.sendToServer(MSG)
2644
2645 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2646 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2647 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2648 # Test receiving traffic class and hop limit, using
2649 # CMSG_SPACE() to calculate buffer size.
2650 self.checkTrafficClassAndHopLimit(
2651 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2652
2653 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2654 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2655 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2656 self.sendToServer(MSG)
2657
2658 @requireAttrs(socket.socket, "sendmsg")
2659 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2660 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2661 def testSetTrafficClassAndHopLimit(self):
2662 # Test setting traffic class and hop limit on outgoing packet,
2663 # and receiving them at the other end.
2664 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2665 maxhop=self.hop_limit)
2666
2667 @testSetTrafficClassAndHopLimit.client_skip
2668 def _testSetTrafficClassAndHopLimit(self):
2669 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2670 self.assertEqual(
2671 self.sendmsgToServer([MSG],
2672 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2673 array.array("i", [self.traffic_class])),
2674 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2675 array.array("i", [self.hop_limit]))]),
2676 len(MSG))
2677
2678 @requireAttrs(socket.socket, "sendmsg")
2679 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2680 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2681 def testOddCmsgSize(self):
2682 # Try to send ancillary data with first item one byte too
2683 # long. Fall back to sending with correct size if this fails,
2684 # and check that second item was handled correctly.
2685 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2686 maxhop=self.hop_limit)
2687
2688 @testOddCmsgSize.client_skip
2689 def _testOddCmsgSize(self):
2690 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2691 try:
2692 nbytes = self.sendmsgToServer(
2693 [MSG],
2694 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002695 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002696 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2697 array.array("i", [self.hop_limit]))])
2698 except socket.error as e:
2699 self.assertIsInstance(e.errno, int)
2700 nbytes = self.sendmsgToServer(
2701 [MSG],
2702 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2703 array.array("i", [self.traffic_class])),
2704 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2705 array.array("i", [self.hop_limit]))])
2706 self.assertEqual(nbytes, len(MSG))
2707
2708 # Tests for proper handling of truncated ancillary data
2709
2710 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2711 # Receive hop limit into ancbufsize bytes of ancillary data
2712 # space, which should be too small to contain the ancillary
2713 # data header (if ancbufsize is None, pass no second argument
2714 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2715 # (unless included in ignoreflags), and no ancillary data is
2716 # returned.
2717 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2718 socket.IPV6_RECVHOPLIMIT, 1)
2719 self.misc_event.set()
2720 args = () if ancbufsize is None else (ancbufsize,)
2721 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2722 len(MSG), *args)
2723
2724 self.assertEqual(msg, MSG)
2725 self.checkRecvmsgAddress(addr, self.cli_addr)
2726 self.assertEqual(ancdata, [])
2727 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2728 ignore=ignoreflags)
2729
2730 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2731 def testCmsgTruncNoBufSize(self):
2732 # Check that no ancillary data is received when no ancillary
2733 # buffer size is provided.
2734 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2735 # BSD seems to set
2736 # MSG_CTRUNC only if an item
2737 # has been partially
2738 # received.
2739 ignoreflags=socket.MSG_CTRUNC)
2740
2741 @testCmsgTruncNoBufSize.client_skip
2742 def _testCmsgTruncNoBufSize(self):
2743 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2744 self.sendToServer(MSG)
2745
2746 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2747 def testSingleCmsgTrunc0(self):
2748 # Check that no ancillary data is received when ancillary
2749 # buffer size is zero.
2750 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2751 ignoreflags=socket.MSG_CTRUNC)
2752
2753 @testSingleCmsgTrunc0.client_skip
2754 def _testSingleCmsgTrunc0(self):
2755 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2756 self.sendToServer(MSG)
2757
2758 # Check that no ancillary data is returned for various non-zero
2759 # (but still too small) buffer sizes.
2760
2761 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2762 def testSingleCmsgTrunc1(self):
2763 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2764
2765 @testSingleCmsgTrunc1.client_skip
2766 def _testSingleCmsgTrunc1(self):
2767 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2768 self.sendToServer(MSG)
2769
2770 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2771 def testSingleCmsgTrunc2Int(self):
2772 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
2773
2774 @testSingleCmsgTrunc2Int.client_skip
2775 def _testSingleCmsgTrunc2Int(self):
2776 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2777 self.sendToServer(MSG)
2778
2779 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2780 def testSingleCmsgTruncLen0Minus1(self):
2781 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
2782
2783 @testSingleCmsgTruncLen0Minus1.client_skip
2784 def _testSingleCmsgTruncLen0Minus1(self):
2785 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2786 self.sendToServer(MSG)
2787
2788 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2789 def testSingleCmsgTruncInData(self):
2790 # Test truncation of a control message inside its associated
2791 # data. The message may be returned with its data truncated,
2792 # or not returned at all.
2793 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2794 socket.IPV6_RECVHOPLIMIT, 1)
2795 self.misc_event.set()
2796 msg, ancdata, flags, addr = self.doRecvmsg(
2797 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
2798
2799 self.assertEqual(msg, MSG)
2800 self.checkRecvmsgAddress(addr, self.cli_addr)
2801 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2802
2803 self.assertLessEqual(len(ancdata), 1)
2804 if ancdata:
2805 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2806 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2807 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2808 self.assertLess(len(cmsg_data), SIZEOF_INT)
2809
2810 @testSingleCmsgTruncInData.client_skip
2811 def _testSingleCmsgTruncInData(self):
2812 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2813 self.sendToServer(MSG)
2814
2815 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
2816 # Receive traffic class and hop limit into ancbufsize bytes of
2817 # ancillary data space, which should be large enough to
2818 # contain the first item, but too small to contain the header
2819 # of the second. Check that data is MSG, MSG_CTRUNC is set
2820 # (unless included in ignoreflags), and only one ancillary
2821 # data item is returned.
2822 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2823 socket.IPV6_RECVHOPLIMIT, 1)
2824 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2825 socket.IPV6_RECVTCLASS, 1)
2826 self.misc_event.set()
2827 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2828 len(MSG), ancbufsize)
2829
2830 self.assertEqual(msg, MSG)
2831 self.checkRecvmsgAddress(addr, self.cli_addr)
2832 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2833 ignore=ignoreflags)
2834
2835 self.assertEqual(len(ancdata), 1)
2836 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2837 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2838 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
2839 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2840 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002841 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002842 self.assertGreaterEqual(a[0], 0)
2843 self.assertLessEqual(a[0], 255)
2844
2845 # Try the above test with various buffer sizes.
2846
2847 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2848 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2849 def testSecondCmsgTrunc0(self):
2850 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
2851 ignoreflags=socket.MSG_CTRUNC)
2852
2853 @testSecondCmsgTrunc0.client_skip
2854 def _testSecondCmsgTrunc0(self):
2855 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2856 self.sendToServer(MSG)
2857
2858 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2859 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2860 def testSecondCmsgTrunc1(self):
2861 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
2862
2863 @testSecondCmsgTrunc1.client_skip
2864 def _testSecondCmsgTrunc1(self):
2865 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2866 self.sendToServer(MSG)
2867
2868 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2869 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2870 def testSecondCmsgTrunc2Int(self):
2871 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2872 2 * SIZEOF_INT)
2873
2874 @testSecondCmsgTrunc2Int.client_skip
2875 def _testSecondCmsgTrunc2Int(self):
2876 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2877 self.sendToServer(MSG)
2878
2879 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2880 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2881 def testSecondCmsgTruncLen0Minus1(self):
2882 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2883 socket.CMSG_LEN(0) - 1)
2884
2885 @testSecondCmsgTruncLen0Minus1.client_skip
2886 def _testSecondCmsgTruncLen0Minus1(self):
2887 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2888 self.sendToServer(MSG)
2889
2890 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2891 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2892 def testSecomdCmsgTruncInData(self):
2893 # Test truncation of the second of two control messages inside
2894 # its associated data.
2895 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2896 socket.IPV6_RECVHOPLIMIT, 1)
2897 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2898 socket.IPV6_RECVTCLASS, 1)
2899 self.misc_event.set()
2900 msg, ancdata, flags, addr = self.doRecvmsg(
2901 self.serv_sock, len(MSG),
2902 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
2903
2904 self.assertEqual(msg, MSG)
2905 self.checkRecvmsgAddress(addr, self.cli_addr)
2906 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2907
2908 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
2909
2910 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2911 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2912 cmsg_types.remove(cmsg_type)
2913 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2914 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002915 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002916 self.assertGreaterEqual(a[0], 0)
2917 self.assertLessEqual(a[0], 255)
2918
2919 if ancdata:
2920 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2921 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2922 cmsg_types.remove(cmsg_type)
2923 self.assertLess(len(cmsg_data), SIZEOF_INT)
2924
2925 self.assertEqual(ancdata, [])
2926
2927 @testSecomdCmsgTruncInData.client_skip
2928 def _testSecomdCmsgTruncInData(self):
2929 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2930 self.sendToServer(MSG)
2931
2932
2933# Derive concrete test classes for different socket types.
2934
2935class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
2936 SendrecvmsgConnectionlessBase,
2937 ThreadedSocketTestMixin, UDPTestBase):
2938 pass
2939
2940@requireAttrs(socket.socket, "sendmsg")
2941@unittest.skipUnless(thread, 'Threading required for this test.')
2942class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
2943 pass
2944
2945@requireAttrs(socket.socket, "recvmsg")
2946@unittest.skipUnless(thread, 'Threading required for this test.')
2947class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
2948 pass
2949
2950@requireAttrs(socket.socket, "recvmsg_into")
2951@unittest.skipUnless(thread, 'Threading required for this test.')
2952class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
2953 pass
2954
2955
2956class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
2957 SendrecvmsgConnectionlessBase,
2958 ThreadedSocketTestMixin, UDP6TestBase):
2959 pass
2960
2961@requireAttrs(socket.socket, "sendmsg")
2962@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2963@requireSocket("AF_INET6", "SOCK_DGRAM")
2964@unittest.skipUnless(thread, 'Threading required for this test.')
2965class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
2966 pass
2967
2968@requireAttrs(socket.socket, "recvmsg")
2969@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2970@requireSocket("AF_INET6", "SOCK_DGRAM")
2971@unittest.skipUnless(thread, 'Threading required for this test.')
2972class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
2973 pass
2974
2975@requireAttrs(socket.socket, "recvmsg_into")
2976@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2977@requireSocket("AF_INET6", "SOCK_DGRAM")
2978@unittest.skipUnless(thread, 'Threading required for this test.')
2979class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
2980 pass
2981
2982@requireAttrs(socket.socket, "recvmsg")
2983@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2984@requireAttrs(socket, "IPPROTO_IPV6")
2985@requireSocket("AF_INET6", "SOCK_DGRAM")
2986@unittest.skipUnless(thread, 'Threading required for this test.')
2987class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
2988 SendrecvmsgUDP6TestBase):
2989 pass
2990
2991@requireAttrs(socket.socket, "recvmsg_into")
2992@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2993@requireAttrs(socket, "IPPROTO_IPV6")
2994@requireSocket("AF_INET6", "SOCK_DGRAM")
2995@unittest.skipUnless(thread, 'Threading required for this test.')
2996class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
2997 RFC3542AncillaryTest,
2998 SendrecvmsgUDP6TestBase):
2999 pass
3000
3001
3002class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3003 ConnectedStreamTestMixin, TCPTestBase):
3004 pass
3005
3006@requireAttrs(socket.socket, "sendmsg")
3007@unittest.skipUnless(thread, 'Threading required for this test.')
3008class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3009 pass
3010
3011@requireAttrs(socket.socket, "recvmsg")
3012@unittest.skipUnless(thread, 'Threading required for this test.')
3013class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3014 SendrecvmsgTCPTestBase):
3015 pass
3016
3017@requireAttrs(socket.socket, "recvmsg_into")
3018@unittest.skipUnless(thread, 'Threading required for this test.')
3019class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3020 SendrecvmsgTCPTestBase):
3021 pass
3022
3023
3024class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3025 SendrecvmsgConnectedBase,
3026 ConnectedStreamTestMixin, SCTPStreamBase):
3027 pass
3028
3029@requireAttrs(socket.socket, "sendmsg")
3030@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3031@unittest.skipUnless(thread, 'Threading required for this test.')
3032class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3033 pass
3034
3035@requireAttrs(socket.socket, "recvmsg")
3036@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3037@unittest.skipUnless(thread, 'Threading required for this test.')
3038class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3039 SendrecvmsgSCTPStreamTestBase):
3040 pass
3041
3042@requireAttrs(socket.socket, "recvmsg_into")
3043@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3044@unittest.skipUnless(thread, 'Threading required for this test.')
3045class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3046 SendrecvmsgSCTPStreamTestBase):
3047 pass
3048
3049
3050class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3051 ConnectedStreamTestMixin, UnixStreamBase):
3052 pass
3053
3054@requireAttrs(socket.socket, "sendmsg")
3055@requireAttrs(socket, "AF_UNIX")
3056@unittest.skipUnless(thread, 'Threading required for this test.')
3057class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3058 pass
3059
3060@requireAttrs(socket.socket, "recvmsg")
3061@requireAttrs(socket, "AF_UNIX")
3062@unittest.skipUnless(thread, 'Threading required for this test.')
3063class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3064 SendrecvmsgUnixStreamTestBase):
3065 pass
3066
3067@requireAttrs(socket.socket, "recvmsg_into")
3068@requireAttrs(socket, "AF_UNIX")
3069@unittest.skipUnless(thread, 'Threading required for this test.')
3070class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3071 SendrecvmsgUnixStreamTestBase):
3072 pass
3073
3074@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3075@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3076@unittest.skipUnless(thread, 'Threading required for this test.')
3077class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3078 pass
3079
3080@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3081@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3082@unittest.skipUnless(thread, 'Threading required for this test.')
3083class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3084 SendrecvmsgUnixStreamTestBase):
3085 pass
3086
3087
3088# Test interrupting the interruptible send/receive methods with a
3089# signal when a timeout is set. These tests avoid having multiple
3090# threads alive during the test so that the OS cannot deliver the
3091# signal to the wrong one.
3092
3093class InterruptedTimeoutBase(unittest.TestCase):
3094 # Base class for interrupted send/receive tests. Installs an
3095 # empty handler for SIGALRM and removes it on teardown, along with
3096 # any scheduled alarms.
3097
3098 def setUp(self):
3099 super().setUp()
3100 orig_alrm_handler = signal.signal(signal.SIGALRM,
3101 lambda signum, frame: None)
3102 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3103 self.addCleanup(self.setAlarm, 0)
3104
3105 # Timeout for socket operations
3106 timeout = 4.0
3107
3108 # Provide setAlarm() method to schedule delivery of SIGALRM after
3109 # given number of seconds, or cancel it if zero, and an
3110 # appropriate time value to use. Use setitimer() if available.
3111 if hasattr(signal, "setitimer"):
3112 alarm_time = 0.05
3113
3114 def setAlarm(self, seconds):
3115 signal.setitimer(signal.ITIMER_REAL, seconds)
3116 else:
3117 # Old systems may deliver the alarm up to one second early
3118 alarm_time = 2
3119
3120 def setAlarm(self, seconds):
3121 signal.alarm(seconds)
3122
3123
3124# Require siginterrupt() in order to ensure that system calls are
3125# interrupted by default.
3126@requireAttrs(signal, "siginterrupt")
3127@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3128 "Don't have signal.alarm or signal.setitimer")
3129class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3130 # Test interrupting the recv*() methods with signals when a
3131 # timeout is set.
3132
3133 def setUp(self):
3134 super().setUp()
3135 self.serv.settimeout(self.timeout)
3136
3137 def checkInterruptedRecv(self, func, *args, **kwargs):
3138 # Check that func(*args, **kwargs) raises socket.error with an
3139 # errno of EINTR when interrupted by a signal.
3140 self.setAlarm(self.alarm_time)
3141 with self.assertRaises(socket.error) as cm:
3142 func(*args, **kwargs)
3143 self.assertNotIsInstance(cm.exception, socket.timeout)
3144 self.assertEqual(cm.exception.errno, errno.EINTR)
3145
3146 def testInterruptedRecvTimeout(self):
3147 self.checkInterruptedRecv(self.serv.recv, 1024)
3148
3149 def testInterruptedRecvIntoTimeout(self):
3150 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3151
3152 def testInterruptedRecvfromTimeout(self):
3153 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3154
3155 def testInterruptedRecvfromIntoTimeout(self):
3156 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3157
3158 @requireAttrs(socket.socket, "recvmsg")
3159 def testInterruptedRecvmsgTimeout(self):
3160 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3161
3162 @requireAttrs(socket.socket, "recvmsg_into")
3163 def testInterruptedRecvmsgIntoTimeout(self):
3164 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3165
3166
3167# Require siginterrupt() in order to ensure that system calls are
3168# interrupted by default.
3169@requireAttrs(signal, "siginterrupt")
3170@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3171 "Don't have signal.alarm or signal.setitimer")
3172@unittest.skipUnless(thread, 'Threading required for this test.')
3173class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3174 ThreadSafeCleanupTestCase,
3175 SocketListeningTestMixin, TCPTestBase):
3176 # Test interrupting the interruptible send*() methods with signals
3177 # when a timeout is set.
3178
3179 def setUp(self):
3180 super().setUp()
3181 self.serv_conn = self.newSocket()
3182 self.addCleanup(self.serv_conn.close)
3183 # Use a thread to complete the connection, but wait for it to
3184 # terminate before running the test, so that there is only one
3185 # thread to accept the signal.
3186 cli_thread = threading.Thread(target=self.doConnect)
3187 cli_thread.start()
3188 self.cli_conn, addr = self.serv.accept()
3189 self.addCleanup(self.cli_conn.close)
3190 cli_thread.join()
3191 self.serv_conn.settimeout(self.timeout)
3192
3193 def doConnect(self):
3194 self.serv_conn.connect(self.serv_addr)
3195
3196 def checkInterruptedSend(self, func, *args, **kwargs):
3197 # Check that func(*args, **kwargs), run in a loop, raises
3198 # socket.error with an errno of EINTR when interrupted by a
3199 # signal.
3200 with self.assertRaises(socket.error) as cm:
3201 while True:
3202 self.setAlarm(self.alarm_time)
3203 func(*args, **kwargs)
3204 self.assertNotIsInstance(cm.exception, socket.timeout)
3205 self.assertEqual(cm.exception.errno, errno.EINTR)
3206
Nick Coghlan2496f332011-09-19 20:26:31 +10003207 # Issue #12958: The following tests have problems on Mac OS X
3208 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003209 def testInterruptedSendTimeout(self):
3210 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3211
Nick Coghlan2496f332011-09-19 20:26:31 +10003212 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003213 def testInterruptedSendtoTimeout(self):
3214 # Passing an actual address here as Python's wrapper for
3215 # sendto() doesn't allow passing a zero-length one; POSIX
3216 # requires that the address is ignored since the socket is
3217 # connection-mode, however.
3218 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3219 self.serv_addr)
3220
Nick Coghlan2496f332011-09-19 20:26:31 +10003221 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003222 @requireAttrs(socket.socket, "sendmsg")
3223 def testInterruptedSendmsgTimeout(self):
3224 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3225
3226
Victor Stinner45df8202010-04-28 22:31:17 +00003227@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003228class TCPCloserTest(ThreadedTCPSocketTest):
3229
3230 def testClose(self):
3231 conn, addr = self.serv.accept()
3232 conn.close()
3233
3234 sd = self.cli
3235 read, write, err = select.select([sd], [], [], 1.0)
3236 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003237 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003238
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003239 # Calling close() many times should be safe.
3240 conn.close()
3241 conn.close()
3242
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003243 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003244 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003245 time.sleep(1.0)
3246
Victor Stinner45df8202010-04-28 22:31:17 +00003247@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003248class BasicSocketPairTest(SocketPairTest):
3249
3250 def __init__(self, methodName='runTest'):
3251 SocketPairTest.__init__(self, methodName=methodName)
3252
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003253 def _check_defaults(self, sock):
3254 self.assertIsInstance(sock, socket.socket)
3255 if hasattr(socket, 'AF_UNIX'):
3256 self.assertEqual(sock.family, socket.AF_UNIX)
3257 else:
3258 self.assertEqual(sock.family, socket.AF_INET)
3259 self.assertEqual(sock.type, socket.SOCK_STREAM)
3260 self.assertEqual(sock.proto, 0)
3261
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003262 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003263 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003264
3265 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003266 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003267
Dave Cole331708b2004-08-09 04:51:41 +00003268 def testRecv(self):
3269 msg = self.serv.recv(1024)
3270 self.assertEqual(msg, MSG)
3271
3272 def _testRecv(self):
3273 self.cli.send(MSG)
3274
3275 def testSend(self):
3276 self.serv.send(MSG)
3277
3278 def _testSend(self):
3279 msg = self.cli.recv(1024)
3280 self.assertEqual(msg, MSG)
3281
Victor Stinner45df8202010-04-28 22:31:17 +00003282@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003283class NonBlockingTCPTests(ThreadedTCPSocketTest):
3284
3285 def __init__(self, methodName='runTest'):
3286 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3287
3288 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003289 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003290 self.serv.setblocking(0)
3291 start = time.time()
3292 try:
3293 self.serv.accept()
3294 except socket.error:
3295 pass
3296 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003297 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003298
3299 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003300 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003301
Antoine Pitroub1c54962010-10-14 15:05:38 +00003302 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003303 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003304 def testInitNonBlocking(self):
3305 # reinit server socket
3306 self.serv.close()
3307 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003308 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003309 self.port = support.bind_port(self.serv)
3310 self.serv.listen(1)
3311 # actual testing
3312 start = time.time()
3313 try:
3314 self.serv.accept()
3315 except socket.error:
3316 pass
3317 end = time.time()
3318 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3319
3320 def _testInitNonBlocking(self):
3321 pass
3322
Antoine Pitrou600232b2011-01-05 21:03:42 +00003323 def testInheritFlags(self):
3324 # Issue #7995: when calling accept() on a listening socket with a
3325 # timeout, the resulting socket should not be non-blocking.
3326 self.serv.settimeout(10)
3327 try:
3328 conn, addr = self.serv.accept()
3329 message = conn.recv(len(MSG))
3330 finally:
3331 conn.close()
3332 self.serv.settimeout(None)
3333
3334 def _testInheritFlags(self):
3335 time.sleep(0.1)
3336 self.cli.connect((HOST, self.port))
3337 time.sleep(0.5)
3338 self.cli.send(MSG)
3339
Guido van Rossum24e4af82002-06-12 19:18:08 +00003340 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003341 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003342 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003343 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003344 conn, addr = self.serv.accept()
3345 except socket.error:
3346 pass
3347 else:
3348 self.fail("Error trying to do non-blocking accept.")
3349 read, write, err = select.select([self.serv], [], [])
3350 if self.serv in read:
3351 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003352 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003353 else:
3354 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003355
Guido van Rossum24e4af82002-06-12 19:18:08 +00003356 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003357 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003358 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003359
3360 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003361 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003362 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003363 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003364
3365 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003366 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003367 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003368
3369 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003370 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003371 conn, addr = self.serv.accept()
3372 conn.setblocking(0)
3373 try:
3374 msg = conn.recv(len(MSG))
3375 except socket.error:
3376 pass
3377 else:
3378 self.fail("Error trying to do non-blocking recv.")
3379 read, write, err = select.select([conn], [], [])
3380 if conn in read:
3381 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003382 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003383 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003384 else:
3385 self.fail("Error during select call to non-blocking socket.")
3386
3387 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003388 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003389 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003390 self.cli.send(MSG)
3391
Victor Stinner45df8202010-04-28 22:31:17 +00003392@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003393class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003394 """Unit tests for the object returned by socket.makefile()
3395
Antoine Pitrou834bd812010-10-13 16:17:14 +00003396 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003397 the client connection. You can read from this file to
3398 get output from the server.
3399
Antoine Pitrou834bd812010-10-13 16:17:14 +00003400 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003401 server connection. You can write to this file to send output
3402 to the client.
3403 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003404
Guido van Rossume9f66142002-08-07 15:46:19 +00003405 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003406 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003407 errors = 'strict'
3408 newline = None
3409
3410 read_mode = 'rb'
3411 read_msg = MSG
3412 write_mode = 'wb'
3413 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003414
Guido van Rossum24e4af82002-06-12 19:18:08 +00003415 def __init__(self, methodName='runTest'):
3416 SocketConnectedTest.__init__(self, methodName=methodName)
3417
3418 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003419 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3420 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003421 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003422 self.read_file = self.cli_conn.makefile(
3423 self.read_mode, self.bufsize,
3424 encoding = self.encoding,
3425 errors = self.errors,
3426 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003427
3428 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003429 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003430 self.read_file.close()
3431 self.assertTrue(self.read_file.closed)
3432 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003433 SocketConnectedTest.tearDown(self)
3434
3435 def clientSetUp(self):
3436 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003437 self.write_file = self.serv_conn.makefile(
3438 self.write_mode, self.bufsize,
3439 encoding = self.encoding,
3440 errors = self.errors,
3441 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003442
3443 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003444 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003445 self.write_file.close()
3446 self.assertTrue(self.write_file.closed)
3447 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003448 SocketConnectedTest.clientTearDown(self)
3449
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003450 def testReadAfterTimeout(self):
3451 # Issue #7322: A file object must disallow further reads
3452 # after a timeout has occurred.
3453 self.cli_conn.settimeout(1)
3454 self.read_file.read(3)
3455 # First read raises a timeout
3456 self.assertRaises(socket.timeout, self.read_file.read, 1)
3457 # Second read is disallowed
3458 with self.assertRaises(IOError) as ctx:
3459 self.read_file.read(1)
3460 self.assertIn("cannot read from timed out object", str(ctx.exception))
3461
3462 def _testReadAfterTimeout(self):
3463 self.write_file.write(self.write_msg[0:3])
3464 self.write_file.flush()
3465 self.serv_finished.wait()
3466
Guido van Rossum24e4af82002-06-12 19:18:08 +00003467 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003468 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003469 first_seg = self.read_file.read(len(self.read_msg)-3)
3470 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003471 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003472 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003473
3474 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003475 self.write_file.write(self.write_msg)
3476 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003477
Guido van Rossum8c943832002-08-08 01:00:28 +00003478 def testFullRead(self):
3479 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003480 msg = self.read_file.read()
3481 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003482
3483 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003484 self.write_file.write(self.write_msg)
3485 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003486
Guido van Rossum24e4af82002-06-12 19:18:08 +00003487 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003488 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003489 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003490 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003491 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003492 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003493 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003494 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003495 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003496
3497 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003498 self.write_file.write(self.write_msg)
3499 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003500
3501 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003502 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003503 line = self.read_file.readline()
3504 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003505
3506 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003507 self.write_file.write(self.write_msg)
3508 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003509
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003510 def testCloseAfterMakefile(self):
3511 # The file returned by makefile should keep the socket open.
3512 self.cli_conn.close()
3513 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003514 msg = self.read_file.read()
3515 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003516
3517 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003518 self.write_file.write(self.write_msg)
3519 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003520
3521 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003522 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003523 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003524 if isinstance(self.read_msg, str):
3525 msg = msg.decode()
3526 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003527
3528 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003529 self.write_file.write(self.write_msg)
3530 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003531
Tim Peters116d83c2004-03-28 02:20:45 +00003532 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003533 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003534
3535 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003536 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003537
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003538 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003539 self.assertEqual(self.read_file.mode, self.read_mode)
3540 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003541
3542 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003543 self.assertEqual(self.write_file.mode, self.write_mode)
3544 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003545
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003546 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003547 self.read_file.close()
3548 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003549 self.cli_conn.close()
3550 self.assertRaises(socket.error, self.cli_conn.getsockname)
3551
3552 def _testRealClose(self):
3553 pass
3554
3555
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003556class FileObjectInterruptedTestCase(unittest.TestCase):
3557 """Test that the file object correctly handles EINTR internally."""
3558
3559 class MockSocket(object):
3560 def __init__(self, recv_funcs=()):
3561 # A generator that returns callables that we'll call for each
3562 # call to recv().
3563 self._recv_step = iter(recv_funcs)
3564
3565 def recv_into(self, buffer):
3566 data = next(self._recv_step)()
3567 assert len(buffer) >= len(data)
3568 buffer[:len(data)] = data
3569 return len(data)
3570
3571 def _decref_socketios(self):
3572 pass
3573
3574 def _textiowrap_for_test(self, buffering=-1):
3575 raw = socket.SocketIO(self, "r")
3576 if buffering < 0:
3577 buffering = io.DEFAULT_BUFFER_SIZE
3578 if buffering == 0:
3579 return raw
3580 buffer = io.BufferedReader(raw, buffering)
3581 text = io.TextIOWrapper(buffer, None, None)
3582 text.mode = "rb"
3583 return text
3584
3585 @staticmethod
3586 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003587 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003588
3589 def _textiowrap_mock_socket(self, mock, buffering=-1):
3590 raw = socket.SocketIO(mock, "r")
3591 if buffering < 0:
3592 buffering = io.DEFAULT_BUFFER_SIZE
3593 if buffering == 0:
3594 return raw
3595 buffer = io.BufferedReader(raw, buffering)
3596 text = io.TextIOWrapper(buffer, None, None)
3597 text.mode = "rb"
3598 return text
3599
3600 def _test_readline(self, size=-1, buffering=-1):
3601 mock_sock = self.MockSocket(recv_funcs=[
3602 lambda : b"This is the first line\nAnd the sec",
3603 self._raise_eintr,
3604 lambda : b"ond line is here\n",
3605 lambda : b"",
3606 lambda : b"", # XXX(gps): io library does an extra EOF read
3607 ])
3608 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003609 self.assertEqual(fo.readline(size), "This is the first line\n")
3610 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003611
3612 def _test_read(self, size=-1, buffering=-1):
3613 mock_sock = self.MockSocket(recv_funcs=[
3614 lambda : b"This is the first line\nAnd the sec",
3615 self._raise_eintr,
3616 lambda : b"ond line is here\n",
3617 lambda : b"",
3618 lambda : b"", # XXX(gps): io library does an extra EOF read
3619 ])
3620 expecting = (b"This is the first line\n"
3621 b"And the second line is here\n")
3622 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3623 if buffering == 0:
3624 data = b''
3625 else:
3626 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003627 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003628 while len(data) != len(expecting):
3629 part = fo.read(size)
3630 if not part:
3631 break
3632 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003633 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003634
3635 def test_default(self):
3636 self._test_readline()
3637 self._test_readline(size=100)
3638 self._test_read()
3639 self._test_read(size=100)
3640
3641 def test_with_1k_buffer(self):
3642 self._test_readline(buffering=1024)
3643 self._test_readline(size=100, buffering=1024)
3644 self._test_read(buffering=1024)
3645 self._test_read(size=100, buffering=1024)
3646
3647 def _test_readline_no_buffer(self, size=-1):
3648 mock_sock = self.MockSocket(recv_funcs=[
3649 lambda : b"a",
3650 lambda : b"\n",
3651 lambda : b"B",
3652 self._raise_eintr,
3653 lambda : b"b",
3654 lambda : b"",
3655 ])
3656 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003657 self.assertEqual(fo.readline(size), b"a\n")
3658 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003659
3660 def test_no_buffer(self):
3661 self._test_readline_no_buffer()
3662 self._test_readline_no_buffer(size=4)
3663 self._test_read(buffering=0)
3664 self._test_read(size=100, buffering=0)
3665
3666
Guido van Rossume9f66142002-08-07 15:46:19 +00003667class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3668
3669 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003670
Guido van Rossume9f66142002-08-07 15:46:19 +00003671 In this case (and in this case only), it should be possible to
3672 create a file object, read a line from it, create another file
3673 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003674 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003675 when reading multiple requests from the same socket."""
3676
3677 bufsize = 0 # Use unbuffered mode
3678
3679 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003680 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003681 line = self.read_file.readline() # first line
3682 self.assertEqual(line, b"A. " + self.write_msg) # first line
3683 self.read_file = self.cli_conn.makefile('rb', 0)
3684 line = self.read_file.readline() # second line
3685 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003686
3687 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003688 self.write_file.write(b"A. " + self.write_msg)
3689 self.write_file.write(b"B. " + self.write_msg)
3690 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003691
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003692 def testMakefileClose(self):
3693 # The file returned by makefile should keep the socket open...
3694 self.cli_conn.close()
3695 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003696 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003697 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003698 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003699 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3700
3701 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003702 self.write_file.write(self.write_msg)
3703 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003704
3705 def testMakefileCloseSocketDestroy(self):
3706 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003707 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003708 refcount_after = sys.getrefcount(self.cli_conn)
3709 self.assertEqual(refcount_before - 1, refcount_after)
3710
3711 def _testMakefileCloseSocketDestroy(self):
3712 pass
3713
Antoine Pitrou98b46702010-09-18 22:59:00 +00003714 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003715 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003716 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3717
3718 def testSmallReadNonBlocking(self):
3719 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003720 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3721 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003722 self.evt1.set()
3723 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003724 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003725 if first_seg is None:
3726 # Data not arrived (can happen under Windows), wait a bit
3727 time.sleep(0.5)
3728 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003729 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003730 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003731 self.assertEqual(n, 3)
3732 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003733 self.assertEqual(msg, self.read_msg)
3734 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3735 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003736
3737 def _testSmallReadNonBlocking(self):
3738 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003739 self.write_file.write(self.write_msg)
3740 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003741 self.evt2.set()
3742 # Avoid cloding the socket before the server test has finished,
3743 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3744 self.serv_finished.wait(5.0)
3745
3746 def testWriteNonBlocking(self):
3747 self.cli_finished.wait(5.0)
3748 # The client thread can't skip directly - the SkipTest exception
3749 # would appear as a failure.
3750 if self.serv_skipped:
3751 self.skipTest(self.serv_skipped)
3752
3753 def _testWriteNonBlocking(self):
3754 self.serv_skipped = None
3755 self.serv_conn.setblocking(False)
3756 # Try to saturate the socket buffer pipe with repeated large writes.
3757 BIG = b"x" * (1024 ** 2)
3758 LIMIT = 10
3759 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003760 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003761 self.assertGreater(n, 0)
3762 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003763 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003764 if n is None:
3765 # Succeeded
3766 break
3767 self.assertGreater(n, 0)
3768 else:
3769 # Let us know that this test didn't manage to establish
3770 # the expected conditions. This is not a failure in itself but,
3771 # if it happens repeatedly, the test should be fixed.
3772 self.serv_skipped = "failed to saturate the socket buffer"
3773
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003774
Guido van Rossum8c943832002-08-08 01:00:28 +00003775class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3776
3777 bufsize = 1 # Default-buffered for reading; line-buffered for writing
3778
3779
3780class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3781
3782 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00003783
Thomas Woutersb2137042007-02-01 18:02:27 +00003784
Antoine Pitrou834bd812010-10-13 16:17:14 +00003785class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
3786 """Tests for socket.makefile() in text mode (rather than binary)"""
3787
3788 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003789 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003790 write_mode = 'wb'
3791 write_msg = MSG
3792 newline = ''
3793
3794
3795class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
3796 """Tests for socket.makefile() in text mode (rather than binary)"""
3797
3798 read_mode = 'rb'
3799 read_msg = MSG
3800 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003801 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003802 newline = ''
3803
3804
3805class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
3806 """Tests for socket.makefile() in text mode (rather than binary)"""
3807
3808 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003809 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003810 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003811 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003812 newline = ''
3813
3814
Guido van Rossumd8faa362007-04-27 19:54:29 +00003815class NetworkConnectionTest(object):
3816 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003817
Guido van Rossumd8faa362007-04-27 19:54:29 +00003818 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003819 # We're inherited below by BasicTCPTest2, which also inherits
3820 # BasicTCPTest, which defines self.port referenced below.
3821 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003822 self.serv_conn = self.cli
3823
3824class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
3825 """Tests that NetworkConnection does not break existing TCP functionality.
3826 """
3827
3828class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003829
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003830 class MockSocket(socket.socket):
3831 def connect(self, *args):
3832 raise socket.timeout('timed out')
3833
3834 @contextlib.contextmanager
3835 def mocked_socket_module(self):
3836 """Return a socket which times out on connect"""
3837 old_socket = socket.socket
3838 socket.socket = self.MockSocket
3839 try:
3840 yield
3841 finally:
3842 socket.socket = old_socket
3843
3844 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003845 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003846 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003847 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003848 with self.assertRaises(socket.error) as cm:
3849 cli.connect((HOST, port))
3850 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3851
3852 def test_create_connection(self):
3853 # Issue #9792: errors raised by create_connection() should have
3854 # a proper errno attribute.
3855 port = support.find_unused_port()
3856 with self.assertRaises(socket.error) as cm:
3857 socket.create_connection((HOST, port))
3858 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3859
3860 def test_create_connection_timeout(self):
3861 # Issue #9792: create_connection() should not recast timeout errors
3862 # as generic socket errors.
3863 with self.mocked_socket_module():
3864 with self.assertRaises(socket.timeout):
3865 socket.create_connection((HOST, 1234))
3866
Guido van Rossumd8faa362007-04-27 19:54:29 +00003867
Victor Stinner45df8202010-04-28 22:31:17 +00003868@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003869class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
3870
3871 def __init__(self, methodName='runTest'):
3872 SocketTCPTest.__init__(self, methodName=methodName)
3873 ThreadableTest.__init__(self)
3874
3875 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003876 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003877
3878 def clientTearDown(self):
3879 self.cli.close()
3880 self.cli = None
3881 ThreadableTest.clientTearDown(self)
3882
3883 def _justAccept(self):
3884 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003885 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003886
3887 testFamily = _justAccept
3888 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003889 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003890 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003891 self.assertEqual(self.cli.family, 2)
3892
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003893 testSourceAddress = _justAccept
3894 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003895 self.cli = socket.create_connection((HOST, self.port), timeout=30,
3896 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003897 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00003898 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003899 # The port number being used is sufficient to show that the bind()
3900 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00003901
Guido van Rossumd8faa362007-04-27 19:54:29 +00003902 testTimeoutDefault = _justAccept
3903 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00003904 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003905 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003906 socket.setdefaulttimeout(42)
3907 try:
3908 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003909 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003910 finally:
3911 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003912 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003913
3914 testTimeoutNone = _justAccept
3915 def _testTimeoutNone(self):
3916 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003917 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003918 socket.setdefaulttimeout(30)
3919 try:
3920 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003921 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003922 finally:
3923 socket.setdefaulttimeout(None)
3924 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003925
3926 testTimeoutValueNamed = _justAccept
3927 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003928 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003929 self.assertEqual(self.cli.gettimeout(), 30)
3930
3931 testTimeoutValueNonamed = _justAccept
3932 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003933 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003934 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003935 self.assertEqual(self.cli.gettimeout(), 30)
3936
Victor Stinner45df8202010-04-28 22:31:17 +00003937@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003938class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
3939
3940 def __init__(self, methodName='runTest'):
3941 SocketTCPTest.__init__(self, methodName=methodName)
3942 ThreadableTest.__init__(self)
3943
3944 def clientSetUp(self):
3945 pass
3946
3947 def clientTearDown(self):
3948 self.cli.close()
3949 self.cli = None
3950 ThreadableTest.clientTearDown(self)
3951
3952 def testInsideTimeout(self):
3953 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003954 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003955 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003956 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003957 testOutsideTimeout = testInsideTimeout
3958
3959 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003960 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003961 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003962 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003963
3964 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003965 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003966 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003967
3968
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003969class TCPTimeoutTest(SocketTCPTest):
3970
3971 def testTCPTimeout(self):
3972 def raise_timeout(*args, **kwargs):
3973 self.serv.settimeout(1.0)
3974 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003975 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003976 "Error generating a timeout exception (TCP)")
3977
3978 def testTimeoutZero(self):
3979 ok = False
3980 try:
3981 self.serv.settimeout(0.0)
3982 foo = self.serv.accept()
3983 except socket.timeout:
3984 self.fail("caught timeout instead of error (TCP)")
3985 except socket.error:
3986 ok = True
3987 except:
3988 self.fail("caught unexpected exception (TCP)")
3989 if not ok:
3990 self.fail("accept() returned success when we did not expect it")
3991
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003992 def testInterruptedTimeout(self):
3993 # XXX I don't know how to do this test on MSWindows or any other
3994 # plaform that doesn't support signal.alarm() or os.kill(), though
3995 # the bug should have existed on all platforms.
3996 if not hasattr(signal, "alarm"):
3997 return # can only test on *nix
3998 self.serv.settimeout(5.0) # must be longer than alarm
3999 class Alarm(Exception):
4000 pass
4001 def alarm_handler(signal, frame):
4002 raise Alarm
4003 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4004 try:
4005 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4006 try:
4007 foo = self.serv.accept()
4008 except socket.timeout:
4009 self.fail("caught timeout instead of Alarm")
4010 except Alarm:
4011 pass
4012 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004013 self.fail("caught other exception instead of Alarm:"
4014 " %s(%s):\n%s" %
4015 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004016 else:
4017 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004018 finally:
4019 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004020 except Alarm:
4021 self.fail("got Alarm in wrong place")
4022 finally:
4023 # no alarm can be pending. Safe to restore old handler.
4024 signal.signal(signal.SIGALRM, old_alarm)
4025
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004026class UDPTimeoutTest(SocketTCPTest):
4027
4028 def testUDPTimeout(self):
4029 def raise_timeout(*args, **kwargs):
4030 self.serv.settimeout(1.0)
4031 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004032 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004033 "Error generating a timeout exception (UDP)")
4034
4035 def testTimeoutZero(self):
4036 ok = False
4037 try:
4038 self.serv.settimeout(0.0)
4039 foo = self.serv.recv(1024)
4040 except socket.timeout:
4041 self.fail("caught timeout instead of error (UDP)")
4042 except socket.error:
4043 ok = True
4044 except:
4045 self.fail("caught unexpected exception (UDP)")
4046 if not ok:
4047 self.fail("recv() returned success when we did not expect it")
4048
4049class TestExceptions(unittest.TestCase):
4050
4051 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004052 self.assertTrue(issubclass(socket.error, Exception))
4053 self.assertTrue(issubclass(socket.herror, socket.error))
4054 self.assertTrue(issubclass(socket.gaierror, socket.error))
4055 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004056
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004057class TestLinuxAbstractNamespace(unittest.TestCase):
4058
4059 UNIX_PATH_MAX = 108
4060
4061 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004062 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004063 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4064 s1.bind(address)
4065 s1.listen(1)
4066 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4067 s2.connect(s1.getsockname())
4068 with s1.accept()[0] as s3:
4069 self.assertEqual(s1.getsockname(), address)
4070 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004071
4072 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004073 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004074 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4075 s.bind(address)
4076 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004077
4078 def testNameOverflow(self):
4079 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004080 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4081 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004082
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004083
Victor Stinner45df8202010-04-28 22:31:17 +00004084@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004085class BufferIOTest(SocketConnectedTest):
4086 """
4087 Test the buffer versions of socket.recv() and socket.send().
4088 """
4089 def __init__(self, methodName='runTest'):
4090 SocketConnectedTest.__init__(self, methodName=methodName)
4091
Antoine Pitrou25480782010-03-17 22:50:28 +00004092 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004093 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004094 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004095 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004096 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004097 self.assertEqual(msg, MSG)
4098
Antoine Pitrou25480782010-03-17 22:50:28 +00004099 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004100 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004101 self.serv_conn.send(buf)
4102
Antoine Pitrou25480782010-03-17 22:50:28 +00004103 def testRecvIntoBytearray(self):
4104 buf = bytearray(1024)
4105 nbytes = self.cli_conn.recv_into(buf)
4106 self.assertEqual(nbytes, len(MSG))
4107 msg = buf[:len(MSG)]
4108 self.assertEqual(msg, MSG)
4109
4110 _testRecvIntoBytearray = _testRecvIntoArray
4111
4112 def testRecvIntoMemoryview(self):
4113 buf = bytearray(1024)
4114 nbytes = self.cli_conn.recv_into(memoryview(buf))
4115 self.assertEqual(nbytes, len(MSG))
4116 msg = buf[:len(MSG)]
4117 self.assertEqual(msg, MSG)
4118
4119 _testRecvIntoMemoryview = _testRecvIntoArray
4120
4121 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004122 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004123 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004124 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004125 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004126 self.assertEqual(msg, MSG)
4127
Antoine Pitrou25480782010-03-17 22:50:28 +00004128 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004129 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004130 self.serv_conn.send(buf)
4131
Antoine Pitrou25480782010-03-17 22:50:28 +00004132 def testRecvFromIntoBytearray(self):
4133 buf = bytearray(1024)
4134 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4135 self.assertEqual(nbytes, len(MSG))
4136 msg = buf[:len(MSG)]
4137 self.assertEqual(msg, MSG)
4138
4139 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4140
4141 def testRecvFromIntoMemoryview(self):
4142 buf = bytearray(1024)
4143 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4144 self.assertEqual(nbytes, len(MSG))
4145 msg = buf[:len(MSG)]
4146 self.assertEqual(msg, MSG)
4147
4148 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4149
Christian Heimes043d6f62008-01-07 17:19:16 +00004150
4151TIPC_STYPE = 2000
4152TIPC_LOWER = 200
4153TIPC_UPPER = 210
4154
4155def isTipcAvailable():
4156 """Check if the TIPC module is loaded
4157
4158 The TIPC module is not loaded automatically on Ubuntu and probably
4159 other Linux distros.
4160 """
4161 if not hasattr(socket, "AF_TIPC"):
4162 return False
4163 if not os.path.isfile("/proc/modules"):
4164 return False
4165 with open("/proc/modules") as f:
4166 for line in f:
4167 if line.startswith("tipc "):
4168 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004169 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004170 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4171 return False
4172
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004173class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004174 def testRDM(self):
4175 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4176 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004177 self.addCleanup(srv.close)
4178 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004179
4180 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4181 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4182 TIPC_LOWER, TIPC_UPPER)
4183 srv.bind(srvaddr)
4184
4185 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4186 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4187 cli.sendto(MSG, sendaddr)
4188
4189 msg, recvaddr = srv.recvfrom(1024)
4190
4191 self.assertEqual(cli.getsockname(), recvaddr)
4192 self.assertEqual(msg, MSG)
4193
4194
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004195class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004196 def __init__(self, methodName = 'runTest'):
4197 unittest.TestCase.__init__(self, methodName = methodName)
4198 ThreadableTest.__init__(self)
4199
4200 def setUp(self):
4201 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004202 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004203 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4204 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4205 TIPC_LOWER, TIPC_UPPER)
4206 self.srv.bind(srvaddr)
4207 self.srv.listen(5)
4208 self.serverExplicitReady()
4209 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004210 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004211
4212 def clientSetUp(self):
4213 # The is a hittable race between serverExplicitReady() and the
4214 # accept() call; sleep a little while to avoid it, otherwise
4215 # we could get an exception
4216 time.sleep(0.1)
4217 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004218 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004219 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4220 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4221 self.cli.connect(addr)
4222 self.cliaddr = self.cli.getsockname()
4223
4224 def testStream(self):
4225 msg = self.conn.recv(1024)
4226 self.assertEqual(msg, MSG)
4227 self.assertEqual(self.cliaddr, self.connaddr)
4228
4229 def _testStream(self):
4230 self.cli.send(MSG)
4231 self.cli.close()
4232
4233
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004234@unittest.skipUnless(thread, 'Threading required for this test.')
4235class ContextManagersTest(ThreadedTCPSocketTest):
4236
4237 def _testSocketClass(self):
4238 # base test
4239 with socket.socket() as sock:
4240 self.assertFalse(sock._closed)
4241 self.assertTrue(sock._closed)
4242 # close inside with block
4243 with socket.socket() as sock:
4244 sock.close()
4245 self.assertTrue(sock._closed)
4246 # exception inside with block
4247 with socket.socket() as sock:
4248 self.assertRaises(socket.error, sock.sendall, b'foo')
4249 self.assertTrue(sock._closed)
4250
4251 def testCreateConnectionBase(self):
4252 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004253 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004254 data = conn.recv(1024)
4255 conn.sendall(data)
4256
4257 def _testCreateConnectionBase(self):
4258 address = self.serv.getsockname()
4259 with socket.create_connection(address) as sock:
4260 self.assertFalse(sock._closed)
4261 sock.sendall(b'foo')
4262 self.assertEqual(sock.recv(1024), b'foo')
4263 self.assertTrue(sock._closed)
4264
4265 def testCreateConnectionClose(self):
4266 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004267 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004268 data = conn.recv(1024)
4269 conn.sendall(data)
4270
4271 def _testCreateConnectionClose(self):
4272 address = self.serv.getsockname()
4273 with socket.create_connection(address) as sock:
4274 sock.close()
4275 self.assertTrue(sock._closed)
4276 self.assertRaises(socket.error, sock.sendall, b'foo')
4277
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004278
Antoine Pitroub1c54962010-10-14 15:05:38 +00004279@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4280 "SOCK_CLOEXEC not defined")
4281@unittest.skipUnless(fcntl, "module fcntl not available")
4282class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004283 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004284 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004285 with socket.socket(socket.AF_INET,
4286 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4287 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4288 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004289
4290
4291@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4292 "SOCK_NONBLOCK not defined")
4293class NonblockConstantTest(unittest.TestCase):
4294 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4295 if nonblock:
4296 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4297 self.assertEqual(s.gettimeout(), timeout)
4298 else:
4299 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4300 self.assertEqual(s.gettimeout(), None)
4301
Charles-François Natali239bb962011-06-03 12:55:15 +02004302 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004303 def test_SOCK_NONBLOCK(self):
4304 # a lot of it seems silly and redundant, but I wanted to test that
4305 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004306 with socket.socket(socket.AF_INET,
4307 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4308 self.checkNonblock(s)
4309 s.setblocking(1)
4310 self.checkNonblock(s, False)
4311 s.setblocking(0)
4312 self.checkNonblock(s)
4313 s.settimeout(None)
4314 self.checkNonblock(s, False)
4315 s.settimeout(2.0)
4316 self.checkNonblock(s, timeout=2.0)
4317 s.setblocking(1)
4318 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004319 # defaulttimeout
4320 t = socket.getdefaulttimeout()
4321 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004322 with socket.socket() as s:
4323 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004324 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004325 with socket.socket() as s:
4326 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004327 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004328 with socket.socket() as s:
4329 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004330 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004331 with socket.socket() as s:
4332 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004333 socket.setdefaulttimeout(t)
4334
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004335
Guido van Rossumb995eb72002-07-31 16:08:40 +00004336def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004337 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004338 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004339
4340 tests.extend([
4341 NonBlockingTCPTests,
4342 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004343 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004344 UnbufferedFileObjectClassTestCase,
4345 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004346 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004347 UnicodeReadFileObjectClassTestCase,
4348 UnicodeWriteFileObjectClassTestCase,
4349 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004350 NetworkConnectionNoServer,
4351 NetworkConnectionAttributesTest,
4352 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004353 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004354 CloexecConstantTest,
4355 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004356 ])
Dave Cole331708b2004-08-09 04:51:41 +00004357 if hasattr(socket, "socketpair"):
4358 tests.append(BasicSocketPairTest)
Victor Stinnere6747472011-08-21 00:39:18 +02004359 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004360 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004361 if isTipcAvailable():
4362 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004363 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004364 tests.extend([BasicCANTest, CANTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004365 tests.extend([
4366 CmsgMacroTests,
4367 SendmsgUDPTest,
4368 RecvmsgUDPTest,
4369 RecvmsgIntoUDPTest,
4370 SendmsgUDP6Test,
4371 RecvmsgUDP6Test,
4372 RecvmsgRFC3542AncillaryUDP6Test,
4373 RecvmsgIntoRFC3542AncillaryUDP6Test,
4374 RecvmsgIntoUDP6Test,
4375 SendmsgTCPTest,
4376 RecvmsgTCPTest,
4377 RecvmsgIntoTCPTest,
4378 SendmsgSCTPStreamTest,
4379 RecvmsgSCTPStreamTest,
4380 RecvmsgIntoSCTPStreamTest,
4381 SendmsgUnixStreamTest,
4382 RecvmsgUnixStreamTest,
4383 RecvmsgIntoUnixStreamTest,
4384 RecvmsgSCMRightsStreamTest,
4385 RecvmsgIntoSCMRightsStreamTest,
4386 # These are slow when setitimer() is not available
4387 InterruptedRecvTimeoutTest,
4388 InterruptedSendTimeoutTest,
4389 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004390
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004391 thread_info = support.threading_setup()
4392 support.run_unittest(*tests)
4393 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004394
4395if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004396 test_main()