blob: 2f5ed2562f9ca6a64083c49723ecf1d15eb66b95 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Christian Heimes5e696852008-04-09 08:37:03 +00004import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10008import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +00009import time
10import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000011import queue
Jack Jansen522e7692002-09-06 21:57:50 +000012import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000013import os
14import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000015import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010020import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020021import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000022try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000023 import multiprocessing
24except ImportError:
25 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020026try:
27 import fcntl
28except ImportError:
29 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000030
Benjamin Petersonee8712c2008-05-20 21:35:26 +000031HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000032MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000033
Victor Stinner45df8202010-04-28 22:31:17 +000034try:
35 import _thread as thread
36 import threading
37except ImportError:
38 thread = None
39 threading = None
40
Charles-François Natali47413c12011-10-06 19:47:44 +020041def _have_socket_can():
42 """Check whether CAN sockets are supported on this host."""
43 try:
44 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020045 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020046 return False
47 else:
48 s.close()
49 return True
50
Charles-François Natali10b8cf42011-11-10 19:21:37 +010051def _have_socket_rds():
52 """Check whether RDS sockets are supported on this host."""
53 try:
54 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
55 except (AttributeError, OSError):
56 return False
57 else:
58 s.close()
59 return True
60
Charles-François Natali47413c12011-10-06 19:47:44 +020061HAVE_SOCKET_CAN = _have_socket_can()
62
Charles-François Natali10b8cf42011-11-10 19:21:37 +010063HAVE_SOCKET_RDS = _have_socket_rds()
64
Nick Coghlan96fe56a2011-08-22 11:55:57 +100065# Size in bytes of the int type
66SIZEOF_INT = array.array("i").itemsize
67
Guido van Rossum24e4af82002-06-12 19:18:08 +000068class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000069
Guido van Rossum24e4af82002-06-12 19:18:08 +000070 def setUp(self):
71 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000072 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000073 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000074
Guido van Rossum24e4af82002-06-12 19:18:08 +000075 def tearDown(self):
76 self.serv.close()
77 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000078
Guido van Rossum24e4af82002-06-12 19:18:08 +000079class SocketUDPTest(unittest.TestCase):
80
81 def setUp(self):
82 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000083 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000084
85 def tearDown(self):
86 self.serv.close()
87 self.serv = None
88
Nick Coghlan96fe56a2011-08-22 11:55:57 +100089class ThreadSafeCleanupTestCase(unittest.TestCase):
90 """Subclass of unittest.TestCase with thread-safe cleanup methods.
91
92 This subclass protects the addCleanup() and doCleanups() methods
93 with a recursive lock.
94 """
95
96 if threading:
97 def __init__(self, *args, **kwargs):
98 super().__init__(*args, **kwargs)
99 self._cleanup_lock = threading.RLock()
100
101 def addCleanup(self, *args, **kwargs):
102 with self._cleanup_lock:
103 return super().addCleanup(*args, **kwargs)
104
105 def doCleanups(self, *args, **kwargs):
106 with self._cleanup_lock:
107 return super().doCleanups(*args, **kwargs)
108
Charles-François Natali47413c12011-10-06 19:47:44 +0200109class SocketCANTest(unittest.TestCase):
110
111 """To be able to run this test, a `vcan0` CAN interface can be created with
112 the following commands:
113 # modprobe vcan
114 # ip link add dev vcan0 type vcan
115 # ifconfig vcan0 up
116 """
117 interface = 'vcan0'
118 bufsize = 128
119
Charles-François Natali773e42d2013-02-05 19:42:01 +0100120 """The CAN frame structure is defined in <linux/can.h>:
121
122 struct can_frame {
123 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
124 __u8 can_dlc; /* data length code: 0 .. 8 */
125 __u8 data[8] __attribute__((aligned(8)));
126 };
127 """
128 can_frame_fmt = "=IB3x8s"
129 can_frame_size = struct.calcsize(can_frame_fmt)
130
131 """The Broadcast Management Command frame structure is defined
132 in <linux/can/bcm.h>:
133
134 struct bcm_msg_head {
135 __u32 opcode;
136 __u32 flags;
137 __u32 count;
138 struct timeval ival1, ival2;
139 canid_t can_id;
140 __u32 nframes;
141 struct can_frame frames[0];
142 }
143
144 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
145 `struct can_frame` definition). Must use native not standard types for packing.
146 """
147 bcm_cmd_msg_fmt = "@3I4l2I"
148 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
149
Charles-François Natali47413c12011-10-06 19:47:44 +0200150 def setUp(self):
151 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200152 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200153 try:
154 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200155 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200156 self.skipTest('network interface `%s` does not exist' %
157 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200158
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100159
160class SocketRDSTest(unittest.TestCase):
161
162 """To be able to run this test, the `rds` kernel module must be loaded:
163 # modprobe rds
164 """
165 bufsize = 8192
166
167 def setUp(self):
168 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
169 self.addCleanup(self.serv.close)
170 try:
171 self.port = support.bind_port(self.serv)
172 except OSError:
173 self.skipTest('unable to bind RDS socket')
174
175
Guido van Rossum24e4af82002-06-12 19:18:08 +0000176class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000177 """Threadable Test class
178
179 The ThreadableTest class makes it easy to create a threaded
180 client/server pair from an existing unit test. To create a
181 new threaded class from an existing unit test, use multiple
182 inheritance:
183
184 class NewClass (OldClass, ThreadableTest):
185 pass
186
187 This class defines two new fixture functions with obvious
188 purposes for overriding:
189
190 clientSetUp ()
191 clientTearDown ()
192
193 Any new test functions within the class must then define
194 tests in pairs, where the test name is preceeded with a
195 '_' to indicate the client portion of the test. Ex:
196
197 def testFoo(self):
198 # Server portion
199
200 def _testFoo(self):
201 # Client portion
202
203 Any exceptions raised by the clients during their tests
204 are caught and transferred to the main thread to alert
205 the testing framework.
206
207 Note, the server setup function cannot call any blocking
208 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000209 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000210 the blocking call (such as in setting up a client/server
211 connection and performing the accept() in setUp().
212 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000213
214 def __init__(self):
215 # Swap the true setup function
216 self.__setUp = self.setUp
217 self.__tearDown = self.tearDown
218 self.setUp = self._setUp
219 self.tearDown = self._tearDown
220
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000221 def serverExplicitReady(self):
222 """This method allows the server to explicitly indicate that
223 it wants the client thread to proceed. This is useful if the
224 server is about to execute a blocking routine that is
225 dependent upon the client thread during its setup routine."""
226 self.server_ready.set()
227
Guido van Rossum24e4af82002-06-12 19:18:08 +0000228 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 self.server_ready = threading.Event()
230 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000232 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200233 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000234
235 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000236 methodname = self.id()
237 i = methodname.rfind('.')
238 methodname = methodname[i+1:]
239 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000240 self.client_thread = thread.start_new_thread(
241 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200243 try:
244 self.__setUp()
245 except:
246 self.server_crashed = True
247 raise
248 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000249 self.server_ready.set()
250 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000251
252 def _tearDown(self):
253 self.__tearDown()
254 self.done.wait()
255
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000256 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000257 exc = self.queue.get()
258 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000259
260 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000261 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200263 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200264 if self.server_crashed:
265 self.clientTearDown()
266 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000267 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000268 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000269 try:
270 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000271 except BaseException as e:
272 self.queue.put(e)
273 finally:
274 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275
276 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000277 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278
279 def clientTearDown(self):
280 self.done.set()
281 thread.exit()
282
283class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
284
285 def __init__(self, methodName='runTest'):
286 SocketTCPTest.__init__(self, methodName=methodName)
287 ThreadableTest.__init__(self)
288
289 def clientSetUp(self):
290 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
291
292 def clientTearDown(self):
293 self.cli.close()
294 self.cli = None
295 ThreadableTest.clientTearDown(self)
296
297class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
298
299 def __init__(self, methodName='runTest'):
300 SocketUDPTest.__init__(self, methodName=methodName)
301 ThreadableTest.__init__(self)
302
303 def clientSetUp(self):
304 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
305
Brian Curtin3beb38f2010-11-04 03:41:43 +0000306 def clientTearDown(self):
307 self.cli.close()
308 self.cli = None
309 ThreadableTest.clientTearDown(self)
310
Charles-François Natali47413c12011-10-06 19:47:44 +0200311class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
312
313 def __init__(self, methodName='runTest'):
314 SocketCANTest.__init__(self, methodName=methodName)
315 ThreadableTest.__init__(self)
316
317 def clientSetUp(self):
318 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
319 try:
320 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200321 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200322 # skipTest should not be called here, and will be called in the
323 # server instead
324 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200325
326 def clientTearDown(self):
327 self.cli.close()
328 self.cli = None
329 ThreadableTest.clientTearDown(self)
330
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100331class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
332
333 def __init__(self, methodName='runTest'):
334 SocketRDSTest.__init__(self, methodName=methodName)
335 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100336
337 def clientSetUp(self):
338 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
339 try:
340 # RDS sockets must be bound explicitly to send or receive data
341 self.cli.bind((HOST, 0))
342 self.cli_addr = self.cli.getsockname()
343 except OSError:
344 # skipTest should not be called here, and will be called in the
345 # server instead
346 pass
347
348 def clientTearDown(self):
349 self.cli.close()
350 self.cli = None
351 ThreadableTest.clientTearDown(self)
352
Guido van Rossum24e4af82002-06-12 19:18:08 +0000353class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000354 """Socket tests for client-server connection.
355
356 self.cli_conn is a client socket connected to the server. The
357 setUp() method guarantees that it is connected to the server.
358 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000359
360 def __init__(self, methodName='runTest'):
361 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
362
363 def setUp(self):
364 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000365 # Indicate explicitly we're ready for the client thread to
366 # proceed and then perform the blocking call to accept
367 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000368 conn, addr = self.serv.accept()
369 self.cli_conn = conn
370
371 def tearDown(self):
372 self.cli_conn.close()
373 self.cli_conn = None
374 ThreadedTCPSocketTest.tearDown(self)
375
376 def clientSetUp(self):
377 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000378 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000379 self.serv_conn = self.cli
380
381 def clientTearDown(self):
382 self.serv_conn.close()
383 self.serv_conn = None
384 ThreadedTCPSocketTest.clientTearDown(self)
385
Dave Cole331708b2004-08-09 04:51:41 +0000386class SocketPairTest(unittest.TestCase, ThreadableTest):
387
388 def __init__(self, methodName='runTest'):
389 unittest.TestCase.__init__(self, methodName=methodName)
390 ThreadableTest.__init__(self)
391
392 def setUp(self):
393 self.serv, self.cli = socket.socketpair()
394
395 def tearDown(self):
396 self.serv.close()
397 self.serv = None
398
399 def clientSetUp(self):
400 pass
401
402 def clientTearDown(self):
403 self.cli.close()
404 self.cli = None
405 ThreadableTest.clientTearDown(self)
406
Tim Peters494aaee2004-08-09 18:54:11 +0000407
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000408# The following classes are used by the sendmsg()/recvmsg() tests.
409# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
410# gives a drop-in replacement for SocketConnectedTest, but different
411# address families can be used, and the attributes serv_addr and
412# cli_addr will be set to the addresses of the endpoints.
413
414class SocketTestBase(unittest.TestCase):
415 """A base class for socket tests.
416
417 Subclasses must provide methods newSocket() to return a new socket
418 and bindSock(sock) to bind it to an unused address.
419
420 Creates a socket self.serv and sets self.serv_addr to its address.
421 """
422
423 def setUp(self):
424 self.serv = self.newSocket()
425 self.bindServer()
426
427 def bindServer(self):
428 """Bind server socket and set self.serv_addr to its address."""
429 self.bindSock(self.serv)
430 self.serv_addr = self.serv.getsockname()
431
432 def tearDown(self):
433 self.serv.close()
434 self.serv = None
435
436
437class SocketListeningTestMixin(SocketTestBase):
438 """Mixin to listen on the server socket."""
439
440 def setUp(self):
441 super().setUp()
442 self.serv.listen(1)
443
444
445class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
446 ThreadableTest):
447 """Mixin to add client socket and allow client/server tests.
448
449 Client socket is self.cli and its address is self.cli_addr. See
450 ThreadableTest for usage information.
451 """
452
453 def __init__(self, *args, **kwargs):
454 super().__init__(*args, **kwargs)
455 ThreadableTest.__init__(self)
456
457 def clientSetUp(self):
458 self.cli = self.newClientSocket()
459 self.bindClient()
460
461 def newClientSocket(self):
462 """Return a new socket for use as client."""
463 return self.newSocket()
464
465 def bindClient(self):
466 """Bind client socket and set self.cli_addr to its address."""
467 self.bindSock(self.cli)
468 self.cli_addr = self.cli.getsockname()
469
470 def clientTearDown(self):
471 self.cli.close()
472 self.cli = None
473 ThreadableTest.clientTearDown(self)
474
475
476class ConnectedStreamTestMixin(SocketListeningTestMixin,
477 ThreadedSocketTestMixin):
478 """Mixin to allow client/server stream tests with connected client.
479
480 Server's socket representing connection to client is self.cli_conn
481 and client's connection to server is self.serv_conn. (Based on
482 SocketConnectedTest.)
483 """
484
485 def setUp(self):
486 super().setUp()
487 # Indicate explicitly we're ready for the client thread to
488 # proceed and then perform the blocking call to accept
489 self.serverExplicitReady()
490 conn, addr = self.serv.accept()
491 self.cli_conn = conn
492
493 def tearDown(self):
494 self.cli_conn.close()
495 self.cli_conn = None
496 super().tearDown()
497
498 def clientSetUp(self):
499 super().clientSetUp()
500 self.cli.connect(self.serv_addr)
501 self.serv_conn = self.cli
502
503 def clientTearDown(self):
504 self.serv_conn.close()
505 self.serv_conn = None
506 super().clientTearDown()
507
508
509class UnixSocketTestBase(SocketTestBase):
510 """Base class for Unix-domain socket tests."""
511
512 # This class is used for file descriptor passing tests, so we
513 # create the sockets in a private directory so that other users
514 # can't send anything that might be problematic for a privileged
515 # user running the tests.
516
517 def setUp(self):
518 self.dir_path = tempfile.mkdtemp()
519 self.addCleanup(os.rmdir, self.dir_path)
520 super().setUp()
521
522 def bindSock(self, sock):
523 path = tempfile.mktemp(dir=self.dir_path)
524 sock.bind(path)
525 self.addCleanup(support.unlink, path)
526
527class UnixStreamBase(UnixSocketTestBase):
528 """Base class for Unix-domain SOCK_STREAM tests."""
529
530 def newSocket(self):
531 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
532
533
534class InetTestBase(SocketTestBase):
535 """Base class for IPv4 socket tests."""
536
537 host = HOST
538
539 def setUp(self):
540 super().setUp()
541 self.port = self.serv_addr[1]
542
543 def bindSock(self, sock):
544 support.bind_port(sock, host=self.host)
545
546class TCPTestBase(InetTestBase):
547 """Base class for TCP-over-IPv4 tests."""
548
549 def newSocket(self):
550 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
551
552class UDPTestBase(InetTestBase):
553 """Base class for UDP-over-IPv4 tests."""
554
555 def newSocket(self):
556 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
557
558class SCTPStreamBase(InetTestBase):
559 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
560
561 def newSocket(self):
562 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
563 socket.IPPROTO_SCTP)
564
565
566class Inet6TestBase(InetTestBase):
567 """Base class for IPv6 socket tests."""
568
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200569 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000570
571class UDP6TestBase(Inet6TestBase):
572 """Base class for UDP-over-IPv6 tests."""
573
574 def newSocket(self):
575 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
576
577
578# Test-skipping decorators for use with ThreadableTest.
579
580def skipWithClientIf(condition, reason):
581 """Skip decorated test if condition is true, add client_skip decorator.
582
583 If the decorated object is not a class, sets its attribute
584 "client_skip" to a decorator which will return an empty function
585 if the test is to be skipped, or the original function if it is
586 not. This can be used to avoid running the client part of a
587 skipped test when using ThreadableTest.
588 """
589 def client_pass(*args, **kwargs):
590 pass
591 def skipdec(obj):
592 retval = unittest.skip(reason)(obj)
593 if not isinstance(obj, type):
594 retval.client_skip = lambda f: client_pass
595 return retval
596 def noskipdec(obj):
597 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
598 obj.client_skip = lambda f: f
599 return obj
600 return skipdec if condition else noskipdec
601
602
603def requireAttrs(obj, *attributes):
604 """Skip decorated test if obj is missing any of the given attributes.
605
606 Sets client_skip attribute as skipWithClientIf() does.
607 """
608 missing = [name for name in attributes if not hasattr(obj, name)]
609 return skipWithClientIf(
610 missing, "don't have " + ", ".join(name for name in missing))
611
612
613def requireSocket(*args):
614 """Skip decorated test if a socket cannot be created with given arguments.
615
616 When an argument is given as a string, will use the value of that
617 attribute of the socket module, or skip the test if it doesn't
618 exist. Sets client_skip attribute as skipWithClientIf() does.
619 """
620 err = None
621 missing = [obj for obj in args if
622 isinstance(obj, str) and not hasattr(socket, obj)]
623 if missing:
624 err = "don't have " + ", ".join(name for name in missing)
625 else:
626 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
627 for obj in args]
628 try:
629 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200630 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000631 # XXX: check errno?
632 err = str(e)
633 else:
634 s.close()
635 return skipWithClientIf(
636 err is not None,
637 "can't create socket({0}): {1}".format(
638 ", ".join(str(o) for o in args), err))
639
640
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641#######################################################################
642## Begin Tests
643
644class GeneralModuleTests(unittest.TestCase):
645
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000646 def test_repr(self):
647 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200648 with s:
649 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000650 self.assertIn('family=%s' % socket.AF_INET, repr(s))
651 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200652 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200653 self.assertNotIn('raddr', repr(s))
654 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200655 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200656 self.assertIn(str(s.getsockname()), repr(s))
657 self.assertIn('[closed]', repr(s))
658 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000659
Raymond Hettinger027bb632004-05-31 03:09:25 +0000660 def test_weakref(self):
661 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
662 p = proxy(s)
663 self.assertEqual(p.fileno(), s.fileno())
664 s.close()
665 s = None
666 try:
667 p.fileno()
668 except ReferenceError:
669 pass
670 else:
671 self.fail('Socket proxy still exists')
672
Guido van Rossum24e4af82002-06-12 19:18:08 +0000673 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000674 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300675 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200676 with self.assertRaises(OSError, msg=msg % 'OSError'):
677 raise OSError
678 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200680 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000681 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000682
Ezio Melotti63e42302011-05-07 19:47:48 +0300683 def testSendtoErrors(self):
684 # Testing that sendto doens't masks failures. See #10169.
685 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
686 self.addCleanup(s.close)
687 s.bind(('', 0))
688 sockname = s.getsockname()
689 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300690 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300691 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300692 self.assertEqual(str(cm.exception),
693 "'str' does not support the buffer interface")
694 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300695 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300696 self.assertEqual(str(cm.exception),
697 "'complex' does not support the buffer interface")
698 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300699 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300700 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300701 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300702 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300703 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300704 self.assertEqual(str(cm.exception),
705 "'str' does not support the buffer interface")
706 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300707 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300708 self.assertEqual(str(cm.exception),
709 "'complex' does not support the buffer interface")
710 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300711 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300712 self.assertIn('not NoneType', str(cm.exception))
713 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300714 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300715 self.assertIn('an integer is required', str(cm.exception))
716 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300717 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300718 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300719 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300720 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300721 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300722 self.assertIn('(1 given)', str(cm.exception))
723 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300724 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300725 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300726
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000728 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 socket.AF_INET
730 socket.SOCK_STREAM
731 socket.SOCK_DGRAM
732 socket.SOCK_RAW
733 socket.SOCK_RDM
734 socket.SOCK_SEQPACKET
735 socket.SOL_SOCKET
736 socket.SO_REUSEADDR
737
Guido van Rossum654c11e2002-06-13 20:24:17 +0000738 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000739 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000740 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000741 try:
742 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200743 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000744 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600745 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000746 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000747 try:
748 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200749 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000750 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600751 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000752 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000753 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000754 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000755 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000756
Charles-François Natali0cc86852013-09-13 19:53:08 +0200757 def test_host_resolution(self):
758 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
759 '1:1:1:1:1:1:1:1:1']:
760 self.assertRaises(OSError, socket.gethostbyname, addr)
761 self.assertRaises(OSError, socket.gethostbyaddr, addr)
762
763 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
764 self.assertEqual(socket.gethostbyname(addr), addr)
765
766 # we don't test support.HOSTv6 because there's a chance it doesn't have
767 # a matching name entry (e.g. 'ip6-localhost')
768 for host in [support.HOST]:
769 self.assertIn(host, socket.gethostbyaddr(host)[2])
770
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000771 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
772 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
773 def test_sethostname(self):
774 oldhn = socket.gethostname()
775 try:
776 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200777 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000778 if e.errno == errno.EPERM:
779 self.skipTest("test should be run as root")
780 else:
781 raise
782 try:
783 # running test as root!
784 self.assertEqual(socket.gethostname(), 'new')
785 # Should work with bytes objects too
786 socket.sethostname(b'bar')
787 self.assertEqual(socket.gethostname(), 'bar')
788 finally:
789 socket.sethostname(oldhn)
790
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700791 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
792 'socket.if_nameindex() not available.')
793 def testInterfaceNameIndex(self):
794 interfaces = socket.if_nameindex()
795 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200796 self.assertIsInstance(index, int)
797 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700798 # interface indices are non-zero integers
799 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200800 _index = socket.if_nametoindex(name)
801 self.assertIsInstance(_index, int)
802 self.assertEqual(index, _index)
803 _name = socket.if_indextoname(index)
804 self.assertIsInstance(_name, str)
805 self.assertEqual(name, _name)
806
807 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
808 'socket.if_nameindex() not available.')
809 def testInvalidInterfaceNameIndex(self):
810 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200811 self.assertRaises(OSError, socket.if_indextoname, 0)
812 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200813 # test with invalid values
814 self.assertRaises(TypeError, socket.if_nametoindex, 0)
815 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700816
Serhiy Storchaka43767632013-11-03 21:31:38 +0200817 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
818 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000819 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000820 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200821 try:
822 # On some versions, this loses a reference
823 orig = sys.getrefcount(__name__)
824 socket.getnameinfo(__name__,0)
825 except TypeError:
826 if sys.getrefcount(__name__) != orig:
827 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000828
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000830 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000831 try:
832 # On some versions, this crashes the interpreter.
833 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200834 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000835 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000836
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000837 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000838 # This just checks that htons etc. are their own inverse,
839 # when looking at the lower 16 or 32 bits.
840 sizes = {socket.htonl: 32, socket.ntohl: 32,
841 socket.htons: 16, socket.ntohs: 16}
842 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000843 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000844 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
845 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000846
Guido van Rossuma2627af2002-09-14 00:58:46 +0000847 swapped = func(mask)
848 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000849 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000850
Guido van Rossum018919a2007-01-15 00:07:32 +0000851 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000852 good_values = [ 1, 2, 3, 1, 2, 3 ]
853 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000854 for k in good_values:
855 socket.ntohl(k)
856 socket.ntohs(k)
857 socket.htonl(k)
858 socket.htons(k)
859 for k in bad_values:
860 self.assertRaises(OverflowError, socket.ntohl, k)
861 self.assertRaises(OverflowError, socket.ntohs, k)
862 self.assertRaises(OverflowError, socket.htonl, k)
863 self.assertRaises(OverflowError, socket.htons, k)
864
Barry Warsaw11b91a02004-06-28 00:50:43 +0000865 def testGetServBy(self):
866 eq = self.assertEqual
867 # Find one service that exists, then check all the related interfaces.
868 # I've ordered this by protocols that have both a tcp and udp
869 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200870 if (sys.platform.startswith(('freebsd', 'netbsd'))
871 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000872 # avoid the 'echo' service on this platform, as there is an
873 # assumption breaking non-standard port/protocol entry
874 services = ('daytime', 'qotd', 'domain')
875 else:
876 services = ('echo', 'daytime', 'domain')
877 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000878 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000879 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000880 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200881 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000882 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000883 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200884 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000885 # Try same call with optional protocol omitted
886 port2 = socket.getservbyname(service)
887 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400888 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000889 try:
890 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200891 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000892 udpport = None
893 else:
894 eq(udpport, port)
895 # Now make sure the lookup by port returns the same service name
896 eq(socket.getservbyport(port2), service)
897 eq(socket.getservbyport(port, 'tcp'), service)
898 if udpport is not None:
899 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000900 # Make sure getservbyport does not accept out of range ports.
901 self.assertRaises(OverflowError, socket.getservbyport, -1)
902 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000903
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000904 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000905 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000906 # The default timeout should initially be None
907 self.assertEqual(socket.getdefaulttimeout(), None)
908 s = socket.socket()
909 self.assertEqual(s.gettimeout(), None)
910 s.close()
911
912 # Set the default timeout to 10, and see if it propagates
913 socket.setdefaulttimeout(10)
914 self.assertEqual(socket.getdefaulttimeout(), 10)
915 s = socket.socket()
916 self.assertEqual(s.gettimeout(), 10)
917 s.close()
918
919 # Reset the default timeout to None, and see if it propagates
920 socket.setdefaulttimeout(None)
921 self.assertEqual(socket.getdefaulttimeout(), None)
922 s = socket.socket()
923 self.assertEqual(s.gettimeout(), None)
924 s.close()
925
926 # Check that setting it to an invalid value raises ValueError
927 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
928
929 # Check that setting it to an invalid type raises TypeError
930 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
931
Serhiy Storchaka43767632013-11-03 21:31:38 +0200932 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
933 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000934 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000935 # Test that issue1008086 and issue767150 are fixed.
936 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000937 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
938 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000939
Serhiy Storchaka43767632013-11-03 21:31:38 +0200940 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
941 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000942 def testIPv4toString(self):
943 from socket import inet_aton as f, inet_pton, AF_INET
944 g = lambda a: inet_pton(AF_INET, a)
945
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100946 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200947 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100948 )
949
Ezio Melottib3aedd42010-11-20 19:04:17 +0000950 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
951 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
952 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
953 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
954 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100955 assertInvalid(f, '0.0.0.')
956 assertInvalid(f, '300.0.0.0')
957 assertInvalid(f, 'a.0.0.0')
958 assertInvalid(f, '1.2.3.4.5')
959 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000960
Ezio Melottib3aedd42010-11-20 19:04:17 +0000961 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
962 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
963 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
964 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100965 assertInvalid(g, '0.0.0.')
966 assertInvalid(g, '300.0.0.0')
967 assertInvalid(g, 'a.0.0.0')
968 assertInvalid(g, '1.2.3.4.5')
969 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000970
Serhiy Storchaka43767632013-11-03 21:31:38 +0200971 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
972 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000973 def testIPv6toString(self):
974 try:
975 from socket import inet_pton, AF_INET6, has_ipv6
976 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600977 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000978 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600979 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -0500980
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +0900981 if sys.platform == "win32":
982 try:
983 inet_pton(AF_INET6, '::')
984 except OSError as e:
985 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -0600986 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -0500987
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000988 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100989 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200990 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100991 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000992
Ezio Melottib3aedd42010-11-20 19:04:17 +0000993 self.assertEqual(b'\x00' * 16, f('::'))
994 self.assertEqual(b'\x00' * 16, f('0::0'))
995 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
996 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000997 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 +0000998 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
999 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001000 self.assertEqual(
1001 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1002 f('ad42:abc::127:0:254:2')
1003 )
1004 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1005 assertInvalid('0x20::')
1006 assertInvalid(':::')
1007 assertInvalid('::0::')
1008 assertInvalid('1::abc::')
1009 assertInvalid('1::abc::def')
1010 assertInvalid('1:2:3:4:5:6:')
1011 assertInvalid('1:2:3:4:5:6')
1012 assertInvalid('1:2:3:4:5:6:7:8:')
1013 assertInvalid('1:2:3:4:5:6:7:8:0')
1014
1015 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1016 f('::254.42.23.64')
1017 )
1018 self.assertEqual(
1019 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1020 f('42::a29b:254.42.23.64')
1021 )
1022 self.assertEqual(
1023 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1024 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1025 )
1026 assertInvalid('255.254.253.252')
1027 assertInvalid('1::260.2.3.0')
1028 assertInvalid('1::0.be.e.0')
1029 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1030 assertInvalid('::1.2.3.4:0')
1031 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001032
Serhiy Storchaka43767632013-11-03 21:31:38 +02001033 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1034 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001035 def testStringToIPv4(self):
1036 from socket import inet_ntoa as f, inet_ntop, AF_INET
1037 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001038 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001039 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001040 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001041
Ezio Melottib3aedd42010-11-20 19:04:17 +00001042 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1043 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1044 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1045 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001046 assertInvalid(f, b'\x00' * 3)
1047 assertInvalid(f, b'\x00' * 5)
1048 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001049
Ezio Melottib3aedd42010-11-20 19:04:17 +00001050 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1051 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1052 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001053 assertInvalid(g, b'\x00' * 3)
1054 assertInvalid(g, b'\x00' * 5)
1055 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001056
Serhiy Storchaka43767632013-11-03 21:31:38 +02001057 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1058 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001059 def testStringToIPv6(self):
1060 try:
1061 from socket import inet_ntop, AF_INET6, has_ipv6
1062 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001063 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001064 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001065 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001066
1067 if sys.platform == "win32":
1068 try:
1069 inet_ntop(AF_INET6, b'\x00' * 16)
1070 except OSError as e:
1071 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001072 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001073
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001074 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001075 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001076 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001077 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001078
Ezio Melottib3aedd42010-11-20 19:04:17 +00001079 self.assertEqual('::', f(b'\x00' * 16))
1080 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1081 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001082 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001083 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 +00001084 )
1085
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001086 assertInvalid(b'\x12' * 15)
1087 assertInvalid(b'\x12' * 17)
1088 assertInvalid(b'\x12' * 4)
1089
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001090 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001091
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001092 def testSockName(self):
1093 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001094 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001095 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001096 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001097 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001098 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001099 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1100 # it reasonable to get the host's addr in addition to 0.0.0.0.
1101 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001102 try:
1103 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001104 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001105 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001106 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001107 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001108 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001109
1110 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001111 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001112 # We know a socket should start without reuse==0
1113 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001114 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001115 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001116 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001117
1118 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001119 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001120 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001121 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001122 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1123 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001124 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001125
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001126 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001127 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001128 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1129 sock.settimeout(1)
1130 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001131 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001132
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001133 def testNewAttributes(self):
1134 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001135
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001136 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1137 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001138 if hasattr(socket, 'SOCK_CLOEXEC'):
1139 self.assertIn(sock.type,
1140 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1141 socket.SOCK_STREAM))
1142 else:
1143 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001144 self.assertEqual(sock.proto, 0)
1145 sock.close()
1146
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001147 def test_getsockaddrarg(self):
1148 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001149 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001150 big_port = port + 65536
1151 neg_port = port - 65536
1152 sock = socket.socket()
1153 try:
1154 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1155 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1156 sock.bind((host, port))
1157 finally:
1158 sock.close()
1159
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001160 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001161 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001162 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1163 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1164 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1165 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001166 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1167 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001168 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001169 self.assertRaises(ValueError, s.ioctl, -1, None)
1170 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001171
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001172 def testGetaddrinfo(self):
1173 try:
1174 socket.getaddrinfo('localhost', 80)
1175 except socket.gaierror as err:
1176 if err.errno == socket.EAI_SERVICE:
1177 # see http://bugs.python.org/issue1282647
1178 self.skipTest("buggy libc version")
1179 raise
1180 # len of every sequence is supposed to be == 5
1181 for info in socket.getaddrinfo(HOST, None):
1182 self.assertEqual(len(info), 5)
1183 # host can be a domain name, a string representation of an
1184 # IPv4/v6 address or None
1185 socket.getaddrinfo('localhost', 80)
1186 socket.getaddrinfo('127.0.0.1', 80)
1187 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001188 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001189 socket.getaddrinfo('::1', 80)
1190 # port can be a string service name such as "http", a numeric
1191 # port number or None
1192 socket.getaddrinfo(HOST, "http")
1193 socket.getaddrinfo(HOST, 80)
1194 socket.getaddrinfo(HOST, None)
1195 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001196 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1197 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001198 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001199 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1200 self.assertEqual(type, socket.SOCK_STREAM)
1201 self.assertEqual(str(type), 'SocketType.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001202 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1203 for _, socktype, _, _, _ in infos:
1204 self.assertEqual(socktype, socket.SOCK_STREAM)
1205 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001206 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001207 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1208 # a server willing to support both IPv4 and IPv6 will
1209 # usually do this
1210 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1211 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001212 # test keyword arguments
1213 a = socket.getaddrinfo(HOST, None)
1214 b = socket.getaddrinfo(host=HOST, port=None)
1215 self.assertEqual(a, b)
1216 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1217 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1218 self.assertEqual(a, b)
1219 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1220 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1221 self.assertEqual(a, b)
1222 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1223 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1224 self.assertEqual(a, b)
1225 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1226 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1227 self.assertEqual(a, b)
1228 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1229 socket.AI_PASSIVE)
1230 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1231 type=socket.SOCK_STREAM, proto=0,
1232 flags=socket.AI_PASSIVE)
1233 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001234 # Issue #6697.
1235 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001236
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001237 # Issue 17269
Ronald Oussorena822d3662013-06-10 10:36:28 +02001238 if hasattr(socket, 'AI_NUMERICSERV'):
1239 socket.getaddrinfo("localhost", None, 0, 0, 0, socket.AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001240
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001241 def test_getnameinfo(self):
1242 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001243 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001244
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001245 @unittest.skipUnless(support.is_resource_enabled('network'),
1246 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001247 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001248 # Check for internet access before running test (issue #12804).
1249 try:
1250 socket.gethostbyname('python.org')
1251 except socket.gaierror as e:
1252 if e.errno == socket.EAI_NODATA:
1253 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001254 # these should all be successful
1255 socket.gethostbyname('испытание.python.org')
1256 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001257 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1258 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1259 # have a reverse entry yet
1260 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001261
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001262 def check_sendall_interrupted(self, with_timeout):
1263 # socketpair() is not stricly required, but it makes things easier.
1264 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1265 self.skipTest("signal.alarm and socket.socketpair required for this test")
1266 # Our signal handlers clobber the C errno by calling a math function
1267 # with an invalid domain value.
1268 def ok_handler(*args):
1269 self.assertRaises(ValueError, math.acosh, 0)
1270 def raising_handler(*args):
1271 self.assertRaises(ValueError, math.acosh, 0)
1272 1 // 0
1273 c, s = socket.socketpair()
1274 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1275 try:
1276 if with_timeout:
1277 # Just above the one second minimum for signal.alarm
1278 c.settimeout(1.5)
1279 with self.assertRaises(ZeroDivisionError):
1280 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001281 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001282 if with_timeout:
1283 signal.signal(signal.SIGALRM, ok_handler)
1284 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001285 self.assertRaises(socket.timeout, c.sendall,
1286 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001287 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001288 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001289 signal.signal(signal.SIGALRM, old_alarm)
1290 c.close()
1291 s.close()
1292
1293 def test_sendall_interrupted(self):
1294 self.check_sendall_interrupted(False)
1295
1296 def test_sendall_interrupted_with_timeout(self):
1297 self.check_sendall_interrupted(True)
1298
Antoine Pitroue033e062010-10-29 10:38:18 +00001299 def test_dealloc_warn(self):
1300 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1301 r = repr(sock)
1302 with self.assertWarns(ResourceWarning) as cm:
1303 sock = None
1304 support.gc_collect()
1305 self.assertIn(r, str(cm.warning.args[0]))
1306 # An open socket file object gets dereferenced after the socket
1307 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1308 f = sock.makefile('rb')
1309 r = repr(sock)
1310 sock = None
1311 support.gc_collect()
1312 with self.assertWarns(ResourceWarning):
1313 f = None
1314 support.gc_collect()
1315
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001316 def test_name_closed_socketio(self):
1317 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1318 fp = sock.makefile("rb")
1319 fp.close()
1320 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1321
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001322 def test_unusable_closed_socketio(self):
1323 with socket.socket() as sock:
1324 fp = sock.makefile("rb", buffering=0)
1325 self.assertTrue(fp.readable())
1326 self.assertFalse(fp.writable())
1327 self.assertFalse(fp.seekable())
1328 fp.close()
1329 self.assertRaises(ValueError, fp.readable)
1330 self.assertRaises(ValueError, fp.writable)
1331 self.assertRaises(ValueError, fp.seekable)
1332
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001333 def test_pickle(self):
1334 sock = socket.socket()
1335 with sock:
1336 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1337 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1338
Serhiy Storchaka78980432013-01-15 01:12:17 +02001339 def test_listen_backlog(self):
1340 for backlog in 0, -1:
1341 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1342 srv.bind((HOST, 0))
1343 srv.listen(backlog)
1344 srv.close()
1345
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001346 @support.cpython_only
1347 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001348 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001349 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001350 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1351 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001352 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001353 srv.close()
1354
Charles-François Natali42663332012-01-02 15:57:30 +01001355 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001356 def test_flowinfo(self):
1357 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001358 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001359 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001360 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001361
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001362 def test_str_for_enums(self):
1363 # Make sure that the AF_* and SOCK_* constants have enum-like string
1364 # reprs.
1365 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1366 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
1367 self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM')
1368
1369 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1370 def test_uknown_socket_family_repr(self):
1371 # Test that when created with a family that's not one of the known
1372 # AF_*/SOCK_* constants, socket.family just returns the number.
1373 #
1374 # To do this we fool socket.socket into believing it already has an
1375 # open fd because on this path it doesn't actually verify the family and
1376 # type and populates the socket object.
1377 #
1378 # On Windows this trick won't work, so the test is skipped.
1379 fd, _ = tempfile.mkstemp()
1380 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1381 self.assertEqual(s.family, 42424)
1382 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001383
Charles-François Natali47413c12011-10-06 19:47:44 +02001384@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1385class BasicCANTest(unittest.TestCase):
1386
1387 def testCrucialConstants(self):
1388 socket.AF_CAN
1389 socket.PF_CAN
1390 socket.CAN_RAW
1391
Charles-François Natali773e42d2013-02-05 19:42:01 +01001392 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1393 'socket.CAN_BCM required for this test.')
1394 def testBCMConstants(self):
1395 socket.CAN_BCM
1396
1397 # opcodes
1398 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1399 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1400 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1401 socket.CAN_BCM_TX_SEND # send one CAN frame
1402 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1403 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1404 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1405 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1406 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1407 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1408 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1409 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1410
Charles-François Natali47413c12011-10-06 19:47:44 +02001411 def testCreateSocket(self):
1412 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1413 pass
1414
Charles-François Natali773e42d2013-02-05 19:42:01 +01001415 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1416 'socket.CAN_BCM required for this test.')
1417 def testCreateBCMSocket(self):
1418 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1419 pass
1420
Charles-François Natali47413c12011-10-06 19:47:44 +02001421 def testBindAny(self):
1422 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1423 s.bind(('', ))
1424
1425 def testTooLongInterfaceName(self):
1426 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1427 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001428 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001429 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001430
1431 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1432 'socket.CAN_RAW_LOOPBACK required for this test.')
1433 def testLoopback(self):
1434 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1435 for loopback in (0, 1):
1436 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1437 loopback)
1438 self.assertEqual(loopback,
1439 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1440
1441 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1442 'socket.CAN_RAW_FILTER required for this test.')
1443 def testFilter(self):
1444 can_id, can_mask = 0x200, 0x700
1445 can_filter = struct.pack("=II", can_id, can_mask)
1446 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1447 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1448 self.assertEqual(can_filter,
1449 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1450
1451
1452@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001453class CANTest(ThreadedCANSocketTest):
1454
Charles-François Natali47413c12011-10-06 19:47:44 +02001455 def __init__(self, methodName='runTest'):
1456 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1457
1458 @classmethod
1459 def build_can_frame(cls, can_id, data):
1460 """Build a CAN frame."""
1461 can_dlc = len(data)
1462 data = data.ljust(8, b'\x00')
1463 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1464
1465 @classmethod
1466 def dissect_can_frame(cls, frame):
1467 """Dissect a CAN frame."""
1468 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1469 return (can_id, can_dlc, data[:can_dlc])
1470
1471 def testSendFrame(self):
1472 cf, addr = self.s.recvfrom(self.bufsize)
1473 self.assertEqual(self.cf, cf)
1474 self.assertEqual(addr[0], self.interface)
1475 self.assertEqual(addr[1], socket.AF_CAN)
1476
1477 def _testSendFrame(self):
1478 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1479 self.cli.send(self.cf)
1480
1481 def testSendMaxFrame(self):
1482 cf, addr = self.s.recvfrom(self.bufsize)
1483 self.assertEqual(self.cf, cf)
1484
1485 def _testSendMaxFrame(self):
1486 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1487 self.cli.send(self.cf)
1488
1489 def testSendMultiFrames(self):
1490 cf, addr = self.s.recvfrom(self.bufsize)
1491 self.assertEqual(self.cf1, cf)
1492
1493 cf, addr = self.s.recvfrom(self.bufsize)
1494 self.assertEqual(self.cf2, cf)
1495
1496 def _testSendMultiFrames(self):
1497 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1498 self.cli.send(self.cf1)
1499
1500 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1501 self.cli.send(self.cf2)
1502
Charles-François Natali773e42d2013-02-05 19:42:01 +01001503 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1504 'socket.CAN_BCM required for this test.')
1505 def _testBCM(self):
1506 cf, addr = self.cli.recvfrom(self.bufsize)
1507 self.assertEqual(self.cf, cf)
1508 can_id, can_dlc, data = self.dissect_can_frame(cf)
1509 self.assertEqual(self.can_id, can_id)
1510 self.assertEqual(self.data, data)
1511
1512 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1513 'socket.CAN_BCM required for this test.')
1514 def testBCM(self):
1515 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1516 self.addCleanup(bcm.close)
1517 bcm.connect((self.interface,))
1518 self.can_id = 0x123
1519 self.data = bytes([0xc0, 0xff, 0xee])
1520 self.cf = self.build_can_frame(self.can_id, self.data)
1521 opcode = socket.CAN_BCM_TX_SEND
1522 flags = 0
1523 count = 0
1524 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1525 bcm_can_id = 0x0222
1526 nframes = 1
1527 assert len(self.cf) == 16
1528 header = struct.pack(self.bcm_cmd_msg_fmt,
1529 opcode,
1530 flags,
1531 count,
1532 ival1_seconds,
1533 ival1_usec,
1534 ival2_seconds,
1535 ival2_usec,
1536 bcm_can_id,
1537 nframes,
1538 )
1539 header_plus_frame = header + self.cf
1540 bytes_sent = bcm.send(header_plus_frame)
1541 self.assertEqual(bytes_sent, len(header_plus_frame))
1542
Charles-François Natali47413c12011-10-06 19:47:44 +02001543
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001544@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1545class BasicRDSTest(unittest.TestCase):
1546
1547 def testCrucialConstants(self):
1548 socket.AF_RDS
1549 socket.PF_RDS
1550
1551 def testCreateSocket(self):
1552 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1553 pass
1554
1555 def testSocketBufferSize(self):
1556 bufsize = 16384
1557 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1558 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1559 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1560
1561
1562@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1563@unittest.skipUnless(thread, 'Threading required for this test.')
1564class RDSTest(ThreadedRDSSocketTest):
1565
1566 def __init__(self, methodName='runTest'):
1567 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1568
Charles-François Natali240c55f2011-11-10 20:33:36 +01001569 def setUp(self):
1570 super().setUp()
1571 self.evt = threading.Event()
1572
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001573 def testSendAndRecv(self):
1574 data, addr = self.serv.recvfrom(self.bufsize)
1575 self.assertEqual(self.data, data)
1576 self.assertEqual(self.cli_addr, addr)
1577
1578 def _testSendAndRecv(self):
1579 self.data = b'spam'
1580 self.cli.sendto(self.data, 0, (HOST, self.port))
1581
1582 def testPeek(self):
1583 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1584 self.assertEqual(self.data, data)
1585 data, addr = self.serv.recvfrom(self.bufsize)
1586 self.assertEqual(self.data, data)
1587
1588 def _testPeek(self):
1589 self.data = b'spam'
1590 self.cli.sendto(self.data, 0, (HOST, self.port))
1591
1592 @requireAttrs(socket.socket, 'recvmsg')
1593 def testSendAndRecvMsg(self):
1594 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1595 self.assertEqual(self.data, data)
1596
1597 @requireAttrs(socket.socket, 'sendmsg')
1598 def _testSendAndRecvMsg(self):
1599 self.data = b'hello ' * 10
1600 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1601
1602 def testSendAndRecvMulti(self):
1603 data, addr = self.serv.recvfrom(self.bufsize)
1604 self.assertEqual(self.data1, data)
1605
1606 data, addr = self.serv.recvfrom(self.bufsize)
1607 self.assertEqual(self.data2, data)
1608
1609 def _testSendAndRecvMulti(self):
1610 self.data1 = b'bacon'
1611 self.cli.sendto(self.data1, 0, (HOST, self.port))
1612
1613 self.data2 = b'egg'
1614 self.cli.sendto(self.data2, 0, (HOST, self.port))
1615
1616 def testSelect(self):
1617 r, w, x = select.select([self.serv], [], [], 3.0)
1618 self.assertIn(self.serv, r)
1619 data, addr = self.serv.recvfrom(self.bufsize)
1620 self.assertEqual(self.data, data)
1621
1622 def _testSelect(self):
1623 self.data = b'select'
1624 self.cli.sendto(self.data, 0, (HOST, self.port))
1625
1626 def testCongestion(self):
1627 # wait until the sender is done
1628 self.evt.wait()
1629
1630 def _testCongestion(self):
1631 # test the behavior in case of congestion
1632 self.data = b'fill'
1633 self.cli.setblocking(False)
1634 try:
1635 # try to lower the receiver's socket buffer size
1636 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1637 except OSError:
1638 pass
1639 with self.assertRaises(OSError) as cm:
1640 try:
1641 # fill the receiver's socket buffer
1642 while True:
1643 self.cli.sendto(self.data, 0, (HOST, self.port))
1644 finally:
1645 # signal the receiver we're done
1646 self.evt.set()
1647 # sendto() should have failed with ENOBUFS
1648 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1649 # and we should have received a congestion notification through poll
1650 r, w, x = select.select([self.serv], [], [], 3.0)
1651 self.assertIn(self.serv, r)
1652
1653
Victor Stinner45df8202010-04-28 22:31:17 +00001654@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001655class BasicTCPTest(SocketConnectedTest):
1656
1657 def __init__(self, methodName='runTest'):
1658 SocketConnectedTest.__init__(self, methodName=methodName)
1659
1660 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001661 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001662 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001663 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001664
1665 def _testRecv(self):
1666 self.serv_conn.send(MSG)
1667
1668 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001669 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001670 seg1 = self.cli_conn.recv(len(MSG) - 3)
1671 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001672 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001673 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001674
1675 def _testOverFlowRecv(self):
1676 self.serv_conn.send(MSG)
1677
1678 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001679 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001680 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001681 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001682
1683 def _testRecvFrom(self):
1684 self.serv_conn.send(MSG)
1685
1686 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001687 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001688 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1689 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001690 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001691 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001692
1693 def _testOverFlowRecvFrom(self):
1694 self.serv_conn.send(MSG)
1695
1696 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001697 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001698 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001699 while 1:
1700 read = self.cli_conn.recv(1024)
1701 if not read:
1702 break
Guido van Rossume531e292002-08-08 20:28:34 +00001703 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001704 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001705
1706 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001707 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001708 self.serv_conn.sendall(big_chunk)
1709
1710 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001711 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001712 fd = self.cli_conn.fileno()
1713 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001714 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001715 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001716 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001717 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001718
1719 def _testFromFd(self):
1720 self.serv_conn.send(MSG)
1721
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001722 def testDup(self):
1723 # Testing dup()
1724 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001725 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001726 msg = sock.recv(1024)
1727 self.assertEqual(msg, MSG)
1728
1729 def _testDup(self):
1730 self.serv_conn.send(MSG)
1731
Guido van Rossum24e4af82002-06-12 19:18:08 +00001732 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001733 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001734 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001735 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001736 # wait for _testShutdown to finish: on OS X, when the server
1737 # closes the connection the client also becomes disconnected,
1738 # and the client's shutdown call will fail. (Issue #4397.)
1739 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001740
1741 def _testShutdown(self):
1742 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001743 self.serv_conn.shutdown(2)
1744
1745 testShutdown_overflow = support.cpython_only(testShutdown)
1746
1747 @support.cpython_only
1748 def _testShutdown_overflow(self):
1749 import _testcapi
1750 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001751 # Issue 15989
1752 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1753 _testcapi.INT_MAX + 1)
1754 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1755 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001756 self.serv_conn.shutdown(2)
1757
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001758 def testDetach(self):
1759 # Testing detach()
1760 fileno = self.cli_conn.fileno()
1761 f = self.cli_conn.detach()
1762 self.assertEqual(f, fileno)
1763 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001764 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001765 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001766 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001767 # ...but we can create another socket using the (still open)
1768 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001769 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001770 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001771 msg = sock.recv(1024)
1772 self.assertEqual(msg, MSG)
1773
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001774 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001775 self.serv_conn.send(MSG)
1776
Victor Stinner45df8202010-04-28 22:31:17 +00001777@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001778class BasicUDPTest(ThreadedUDPSocketTest):
1779
1780 def __init__(self, methodName='runTest'):
1781 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1782
1783 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001784 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001785 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001786 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001787
1788 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001789 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001790
Guido van Rossum1c938012002-06-12 21:17:20 +00001791 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001792 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001793 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001794 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001795
Guido van Rossum1c938012002-06-12 21:17:20 +00001796 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001797 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001798
Guido van Rossumd8faa362007-04-27 19:54:29 +00001799 def testRecvFromNegative(self):
1800 # Negative lengths passed to recvfrom should give ValueError.
1801 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1802
1803 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001804 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001805
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001806# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1807# same test code is used with different families and types of socket
1808# (e.g. stream, datagram), and tests using recvmsg() are repeated
1809# using recvmsg_into().
1810#
1811# The generic test classes such as SendmsgTests and
1812# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1813# supplied with sockets cli_sock and serv_sock representing the
1814# client's and the server's end of the connection respectively, and
1815# attributes cli_addr and serv_addr holding their (numeric where
1816# appropriate) addresses.
1817#
1818# The final concrete test classes combine these with subclasses of
1819# SocketTestBase which set up client and server sockets of a specific
1820# type, and with subclasses of SendrecvmsgBase such as
1821# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1822# sockets to cli_sock and serv_sock and override the methods and
1823# attributes of SendrecvmsgBase to fill in destination addresses if
1824# needed when sending, check for specific flags in msg_flags, etc.
1825#
1826# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1827# recvmsg_into().
1828
1829# XXX: like the other datagram (UDP) tests in this module, the code
1830# here assumes that datagram delivery on the local machine will be
1831# reliable.
1832
1833class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1834 # Base class for sendmsg()/recvmsg() tests.
1835
1836 # Time in seconds to wait before considering a test failed, or
1837 # None for no timeout. Not all tests actually set a timeout.
1838 fail_timeout = 3.0
1839
1840 def setUp(self):
1841 self.misc_event = threading.Event()
1842 super().setUp()
1843
1844 def sendToServer(self, msg):
1845 # Send msg to the server.
1846 return self.cli_sock.send(msg)
1847
1848 # Tuple of alternative default arguments for sendmsg() when called
1849 # via sendmsgToServer() (e.g. to include a destination address).
1850 sendmsg_to_server_defaults = ()
1851
1852 def sendmsgToServer(self, *args):
1853 # Call sendmsg() on self.cli_sock with the given arguments,
1854 # filling in any arguments which are not supplied with the
1855 # corresponding items of self.sendmsg_to_server_defaults, if
1856 # any.
1857 return self.cli_sock.sendmsg(
1858 *(args + self.sendmsg_to_server_defaults[len(args):]))
1859
1860 def doRecvmsg(self, sock, bufsize, *args):
1861 # Call recvmsg() on sock with given arguments and return its
1862 # result. Should be used for tests which can use either
1863 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1864 # this method with one which emulates it using recvmsg_into(),
1865 # thus allowing the same test to be used for both methods.
1866 result = sock.recvmsg(bufsize, *args)
1867 self.registerRecvmsgResult(result)
1868 return result
1869
1870 def registerRecvmsgResult(self, result):
1871 # Called by doRecvmsg() with the return value of recvmsg() or
1872 # recvmsg_into(). Can be overridden to arrange cleanup based
1873 # on the returned ancillary data, for instance.
1874 pass
1875
1876 def checkRecvmsgAddress(self, addr1, addr2):
1877 # Called to compare the received address with the address of
1878 # the peer.
1879 self.assertEqual(addr1, addr2)
1880
1881 # Flags that are normally unset in msg_flags
1882 msg_flags_common_unset = 0
1883 for name in ("MSG_CTRUNC", "MSG_OOB"):
1884 msg_flags_common_unset |= getattr(socket, name, 0)
1885
1886 # Flags that are normally set
1887 msg_flags_common_set = 0
1888
1889 # Flags set when a complete record has been received (e.g. MSG_EOR
1890 # for SCTP)
1891 msg_flags_eor_indicator = 0
1892
1893 # Flags set when a complete record has not been received
1894 # (e.g. MSG_TRUNC for datagram sockets)
1895 msg_flags_non_eor_indicator = 0
1896
1897 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1898 # Method to check the value of msg_flags returned by recvmsg[_into]().
1899 #
1900 # Checks that all bits in msg_flags_common_set attribute are
1901 # set in "flags" and all bits in msg_flags_common_unset are
1902 # unset.
1903 #
1904 # The "eor" argument specifies whether the flags should
1905 # indicate that a full record (or datagram) has been received.
1906 # If "eor" is None, no checks are done; otherwise, checks
1907 # that:
1908 #
1909 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1910 # set and all bits in msg_flags_non_eor_indicator are unset
1911 #
1912 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1913 # are set and all bits in msg_flags_eor_indicator are unset
1914 #
1915 # If "checkset" and/or "checkunset" are supplied, they require
1916 # the given bits to be set or unset respectively, overriding
1917 # what the attributes require for those bits.
1918 #
1919 # If any bits are set in "ignore", they will not be checked,
1920 # regardless of the other inputs.
1921 #
1922 # Will raise Exception if the inputs require a bit to be both
1923 # set and unset, and it is not ignored.
1924
1925 defaultset = self.msg_flags_common_set
1926 defaultunset = self.msg_flags_common_unset
1927
1928 if eor:
1929 defaultset |= self.msg_flags_eor_indicator
1930 defaultunset |= self.msg_flags_non_eor_indicator
1931 elif eor is not None:
1932 defaultset |= self.msg_flags_non_eor_indicator
1933 defaultunset |= self.msg_flags_eor_indicator
1934
1935 # Function arguments override defaults
1936 defaultset &= ~checkunset
1937 defaultunset &= ~checkset
1938
1939 # Merge arguments with remaining defaults, and check for conflicts
1940 checkset |= defaultset
1941 checkunset |= defaultunset
1942 inboth = checkset & checkunset & ~ignore
1943 if inboth:
1944 raise Exception("contradictory set, unset requirements for flags "
1945 "{0:#x}".format(inboth))
1946
1947 # Compare with given msg_flags value
1948 mask = (checkset | checkunset) & ~ignore
1949 self.assertEqual(flags & mask, checkset & mask)
1950
1951
1952class RecvmsgIntoMixin(SendrecvmsgBase):
1953 # Mixin to implement doRecvmsg() using recvmsg_into().
1954
1955 def doRecvmsg(self, sock, bufsize, *args):
1956 buf = bytearray(bufsize)
1957 result = sock.recvmsg_into([buf], *args)
1958 self.registerRecvmsgResult(result)
1959 self.assertGreaterEqual(result[0], 0)
1960 self.assertLessEqual(result[0], bufsize)
1961 return (bytes(buf[:result[0]]),) + result[1:]
1962
1963
1964class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1965 # Defines flags to be checked in msg_flags for datagram sockets.
1966
1967 @property
1968 def msg_flags_non_eor_indicator(self):
1969 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1970
1971
1972class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1973 # Defines flags to be checked in msg_flags for SCTP sockets.
1974
1975 @property
1976 def msg_flags_eor_indicator(self):
1977 return super().msg_flags_eor_indicator | socket.MSG_EOR
1978
1979
1980class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1981 # Base class for tests on connectionless-mode sockets. Users must
1982 # supply sockets on attributes cli and serv to be mapped to
1983 # cli_sock and serv_sock respectively.
1984
1985 @property
1986 def serv_sock(self):
1987 return self.serv
1988
1989 @property
1990 def cli_sock(self):
1991 return self.cli
1992
1993 @property
1994 def sendmsg_to_server_defaults(self):
1995 return ([], [], 0, self.serv_addr)
1996
1997 def sendToServer(self, msg):
1998 return self.cli_sock.sendto(msg, self.serv_addr)
1999
2000
2001class SendrecvmsgConnectedBase(SendrecvmsgBase):
2002 # Base class for tests on connected sockets. Users must supply
2003 # sockets on attributes serv_conn and cli_conn (representing the
2004 # connections *to* the server and the client), to be mapped to
2005 # cli_sock and serv_sock respectively.
2006
2007 @property
2008 def serv_sock(self):
2009 return self.cli_conn
2010
2011 @property
2012 def cli_sock(self):
2013 return self.serv_conn
2014
2015 def checkRecvmsgAddress(self, addr1, addr2):
2016 # Address is currently "unspecified" for a connected socket,
2017 # so we don't examine it
2018 pass
2019
2020
2021class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2022 # Base class to set a timeout on server's socket.
2023
2024 def setUp(self):
2025 super().setUp()
2026 self.serv_sock.settimeout(self.fail_timeout)
2027
2028
2029class SendmsgTests(SendrecvmsgServerTimeoutBase):
2030 # Tests for sendmsg() which can use any socket type and do not
2031 # involve recvmsg() or recvmsg_into().
2032
2033 def testSendmsg(self):
2034 # Send a simple message with sendmsg().
2035 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2036
2037 def _testSendmsg(self):
2038 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2039
2040 def testSendmsgDataGenerator(self):
2041 # Send from buffer obtained from a generator (not a sequence).
2042 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2043
2044 def _testSendmsgDataGenerator(self):
2045 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2046 len(MSG))
2047
2048 def testSendmsgAncillaryGenerator(self):
2049 # Gather (empty) ancillary data from a generator.
2050 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2051
2052 def _testSendmsgAncillaryGenerator(self):
2053 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2054 len(MSG))
2055
2056 def testSendmsgArray(self):
2057 # Send data from an array instead of the usual bytes object.
2058 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2059
2060 def _testSendmsgArray(self):
2061 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2062 len(MSG))
2063
2064 def testSendmsgGather(self):
2065 # Send message data from more than one buffer (gather write).
2066 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2067
2068 def _testSendmsgGather(self):
2069 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2070
2071 def testSendmsgBadArgs(self):
2072 # Check that sendmsg() rejects invalid arguments.
2073 self.assertEqual(self.serv_sock.recv(1000), b"done")
2074
2075 def _testSendmsgBadArgs(self):
2076 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2077 self.assertRaises(TypeError, self.sendmsgToServer,
2078 b"not in an iterable")
2079 self.assertRaises(TypeError, self.sendmsgToServer,
2080 object())
2081 self.assertRaises(TypeError, self.sendmsgToServer,
2082 [object()])
2083 self.assertRaises(TypeError, self.sendmsgToServer,
2084 [MSG, object()])
2085 self.assertRaises(TypeError, self.sendmsgToServer,
2086 [MSG], object())
2087 self.assertRaises(TypeError, self.sendmsgToServer,
2088 [MSG], [], object())
2089 self.assertRaises(TypeError, self.sendmsgToServer,
2090 [MSG], [], 0, object())
2091 self.sendToServer(b"done")
2092
2093 def testSendmsgBadCmsg(self):
2094 # Check that invalid ancillary data items are rejected.
2095 self.assertEqual(self.serv_sock.recv(1000), b"done")
2096
2097 def _testSendmsgBadCmsg(self):
2098 self.assertRaises(TypeError, self.sendmsgToServer,
2099 [MSG], [object()])
2100 self.assertRaises(TypeError, self.sendmsgToServer,
2101 [MSG], [(object(), 0, b"data")])
2102 self.assertRaises(TypeError, self.sendmsgToServer,
2103 [MSG], [(0, object(), b"data")])
2104 self.assertRaises(TypeError, self.sendmsgToServer,
2105 [MSG], [(0, 0, object())])
2106 self.assertRaises(TypeError, self.sendmsgToServer,
2107 [MSG], [(0, 0)])
2108 self.assertRaises(TypeError, self.sendmsgToServer,
2109 [MSG], [(0, 0, b"data", 42)])
2110 self.sendToServer(b"done")
2111
2112 @requireAttrs(socket, "CMSG_SPACE")
2113 def testSendmsgBadMultiCmsg(self):
2114 # Check that invalid ancillary data items are rejected when
2115 # more than one item is present.
2116 self.assertEqual(self.serv_sock.recv(1000), b"done")
2117
2118 @testSendmsgBadMultiCmsg.client_skip
2119 def _testSendmsgBadMultiCmsg(self):
2120 self.assertRaises(TypeError, self.sendmsgToServer,
2121 [MSG], [0, 0, b""])
2122 self.assertRaises(TypeError, self.sendmsgToServer,
2123 [MSG], [(0, 0, b""), object()])
2124 self.sendToServer(b"done")
2125
2126 def testSendmsgExcessCmsgReject(self):
2127 # Check that sendmsg() rejects excess ancillary data items
2128 # when the number that can be sent is limited.
2129 self.assertEqual(self.serv_sock.recv(1000), b"done")
2130
2131 def _testSendmsgExcessCmsgReject(self):
2132 if not hasattr(socket, "CMSG_SPACE"):
2133 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002134 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002135 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2136 self.assertIsNone(cm.exception.errno)
2137 self.sendToServer(b"done")
2138
2139 def testSendmsgAfterClose(self):
2140 # Check that sendmsg() fails on a closed socket.
2141 pass
2142
2143 def _testSendmsgAfterClose(self):
2144 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002145 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002146
2147
2148class SendmsgStreamTests(SendmsgTests):
2149 # Tests for sendmsg() which require a stream socket and do not
2150 # involve recvmsg() or recvmsg_into().
2151
2152 def testSendmsgExplicitNoneAddr(self):
2153 # Check that peer address can be specified as None.
2154 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2155
2156 def _testSendmsgExplicitNoneAddr(self):
2157 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2158
2159 def testSendmsgTimeout(self):
2160 # Check that timeout works with sendmsg().
2161 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2162 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2163
2164 def _testSendmsgTimeout(self):
2165 try:
2166 self.cli_sock.settimeout(0.03)
2167 with self.assertRaises(socket.timeout):
2168 while True:
2169 self.sendmsgToServer([b"a"*512])
2170 finally:
2171 self.misc_event.set()
2172
2173 # XXX: would be nice to have more tests for sendmsg flags argument.
2174
2175 # Linux supports MSG_DONTWAIT when sending, but in general, it
2176 # only works when receiving. Could add other platforms if they
2177 # support it too.
2178 @skipWithClientIf(sys.platform not in {"linux2"},
2179 "MSG_DONTWAIT not known to work on this platform when "
2180 "sending")
2181 def testSendmsgDontWait(self):
2182 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2183 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2184 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2185
2186 @testSendmsgDontWait.client_skip
2187 def _testSendmsgDontWait(self):
2188 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002189 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002190 while True:
2191 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2192 self.assertIn(cm.exception.errno,
2193 (errno.EAGAIN, errno.EWOULDBLOCK))
2194 finally:
2195 self.misc_event.set()
2196
2197
2198class SendmsgConnectionlessTests(SendmsgTests):
2199 # Tests for sendmsg() which require a connectionless-mode
2200 # (e.g. datagram) socket, and do not involve recvmsg() or
2201 # recvmsg_into().
2202
2203 def testSendmsgNoDestAddr(self):
2204 # Check that sendmsg() fails when no destination address is
2205 # given for unconnected socket.
2206 pass
2207
2208 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002209 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002210 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002211 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002212 [MSG], [], 0, None)
2213
2214
2215class RecvmsgGenericTests(SendrecvmsgBase):
2216 # Tests for recvmsg() which can also be emulated using
2217 # recvmsg_into(), and can use any socket type.
2218
2219 def testRecvmsg(self):
2220 # Receive a simple message with recvmsg[_into]().
2221 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2222 self.assertEqual(msg, MSG)
2223 self.checkRecvmsgAddress(addr, self.cli_addr)
2224 self.assertEqual(ancdata, [])
2225 self.checkFlags(flags, eor=True)
2226
2227 def _testRecvmsg(self):
2228 self.sendToServer(MSG)
2229
2230 def testRecvmsgExplicitDefaults(self):
2231 # Test recvmsg[_into]() with default arguments provided explicitly.
2232 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2233 len(MSG), 0, 0)
2234 self.assertEqual(msg, MSG)
2235 self.checkRecvmsgAddress(addr, self.cli_addr)
2236 self.assertEqual(ancdata, [])
2237 self.checkFlags(flags, eor=True)
2238
2239 def _testRecvmsgExplicitDefaults(self):
2240 self.sendToServer(MSG)
2241
2242 def testRecvmsgShorter(self):
2243 # Receive a message smaller than buffer.
2244 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2245 len(MSG) + 42)
2246 self.assertEqual(msg, MSG)
2247 self.checkRecvmsgAddress(addr, self.cli_addr)
2248 self.assertEqual(ancdata, [])
2249 self.checkFlags(flags, eor=True)
2250
2251 def _testRecvmsgShorter(self):
2252 self.sendToServer(MSG)
2253
Charles-François Natali8619cd72011-10-03 19:43:15 +02002254 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2255 # datagram is received (issue #13001).
2256 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002257 def testRecvmsgTrunc(self):
2258 # Receive part of message, check for truncation indicators.
2259 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2260 len(MSG) - 3)
2261 self.assertEqual(msg, MSG[:-3])
2262 self.checkRecvmsgAddress(addr, self.cli_addr)
2263 self.assertEqual(ancdata, [])
2264 self.checkFlags(flags, eor=False)
2265
Charles-François Natali8619cd72011-10-03 19:43:15 +02002266 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002267 def _testRecvmsgTrunc(self):
2268 self.sendToServer(MSG)
2269
2270 def testRecvmsgShortAncillaryBuf(self):
2271 # Test ancillary data buffer too small to hold any ancillary data.
2272 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2273 len(MSG), 1)
2274 self.assertEqual(msg, MSG)
2275 self.checkRecvmsgAddress(addr, self.cli_addr)
2276 self.assertEqual(ancdata, [])
2277 self.checkFlags(flags, eor=True)
2278
2279 def _testRecvmsgShortAncillaryBuf(self):
2280 self.sendToServer(MSG)
2281
2282 def testRecvmsgLongAncillaryBuf(self):
2283 # Test large ancillary data buffer.
2284 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2285 len(MSG), 10240)
2286 self.assertEqual(msg, MSG)
2287 self.checkRecvmsgAddress(addr, self.cli_addr)
2288 self.assertEqual(ancdata, [])
2289 self.checkFlags(flags, eor=True)
2290
2291 def _testRecvmsgLongAncillaryBuf(self):
2292 self.sendToServer(MSG)
2293
2294 def testRecvmsgAfterClose(self):
2295 # Check that recvmsg[_into]() fails on a closed socket.
2296 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002297 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002298
2299 def _testRecvmsgAfterClose(self):
2300 pass
2301
2302 def testRecvmsgTimeout(self):
2303 # Check that timeout works.
2304 try:
2305 self.serv_sock.settimeout(0.03)
2306 self.assertRaises(socket.timeout,
2307 self.doRecvmsg, self.serv_sock, len(MSG))
2308 finally:
2309 self.misc_event.set()
2310
2311 def _testRecvmsgTimeout(self):
2312 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2313
2314 @requireAttrs(socket, "MSG_PEEK")
2315 def testRecvmsgPeek(self):
2316 # Check that MSG_PEEK in flags enables examination of pending
2317 # data without consuming it.
2318
2319 # Receive part of data with MSG_PEEK.
2320 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2321 len(MSG) - 3, 0,
2322 socket.MSG_PEEK)
2323 self.assertEqual(msg, MSG[:-3])
2324 self.checkRecvmsgAddress(addr, self.cli_addr)
2325 self.assertEqual(ancdata, [])
2326 # Ignoring MSG_TRUNC here (so this test is the same for stream
2327 # and datagram sockets). Some wording in POSIX seems to
2328 # suggest that it needn't be set when peeking, but that may
2329 # just be a slip.
2330 self.checkFlags(flags, eor=False,
2331 ignore=getattr(socket, "MSG_TRUNC", 0))
2332
2333 # Receive all data with MSG_PEEK.
2334 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2335 len(MSG), 0,
2336 socket.MSG_PEEK)
2337 self.assertEqual(msg, MSG)
2338 self.checkRecvmsgAddress(addr, self.cli_addr)
2339 self.assertEqual(ancdata, [])
2340 self.checkFlags(flags, eor=True)
2341
2342 # Check that the same data can still be received normally.
2343 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2344 self.assertEqual(msg, MSG)
2345 self.checkRecvmsgAddress(addr, self.cli_addr)
2346 self.assertEqual(ancdata, [])
2347 self.checkFlags(flags, eor=True)
2348
2349 @testRecvmsgPeek.client_skip
2350 def _testRecvmsgPeek(self):
2351 self.sendToServer(MSG)
2352
2353 @requireAttrs(socket.socket, "sendmsg")
2354 def testRecvmsgFromSendmsg(self):
2355 # Test receiving with recvmsg[_into]() when message is sent
2356 # using sendmsg().
2357 self.serv_sock.settimeout(self.fail_timeout)
2358 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2359 self.assertEqual(msg, MSG)
2360 self.checkRecvmsgAddress(addr, self.cli_addr)
2361 self.assertEqual(ancdata, [])
2362 self.checkFlags(flags, eor=True)
2363
2364 @testRecvmsgFromSendmsg.client_skip
2365 def _testRecvmsgFromSendmsg(self):
2366 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2367
2368
2369class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2370 # Tests which require a stream socket and can use either recvmsg()
2371 # or recvmsg_into().
2372
2373 def testRecvmsgEOF(self):
2374 # Receive end-of-stream indicator (b"", peer socket closed).
2375 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2376 self.assertEqual(msg, b"")
2377 self.checkRecvmsgAddress(addr, self.cli_addr)
2378 self.assertEqual(ancdata, [])
2379 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2380
2381 def _testRecvmsgEOF(self):
2382 self.cli_sock.close()
2383
2384 def testRecvmsgOverflow(self):
2385 # Receive a message in more than one chunk.
2386 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2387 len(MSG) - 3)
2388 self.checkRecvmsgAddress(addr, self.cli_addr)
2389 self.assertEqual(ancdata, [])
2390 self.checkFlags(flags, eor=False)
2391
2392 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2393 self.checkRecvmsgAddress(addr, self.cli_addr)
2394 self.assertEqual(ancdata, [])
2395 self.checkFlags(flags, eor=True)
2396
2397 msg = seg1 + seg2
2398 self.assertEqual(msg, MSG)
2399
2400 def _testRecvmsgOverflow(self):
2401 self.sendToServer(MSG)
2402
2403
2404class RecvmsgTests(RecvmsgGenericTests):
2405 # Tests for recvmsg() which can use any socket type.
2406
2407 def testRecvmsgBadArgs(self):
2408 # Check that recvmsg() rejects invalid arguments.
2409 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2410 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2411 -1, 0, 0)
2412 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2413 len(MSG), -1, 0)
2414 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2415 [bytearray(10)], 0, 0)
2416 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2417 object(), 0, 0)
2418 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2419 len(MSG), object(), 0)
2420 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2421 len(MSG), 0, object())
2422
2423 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2424 self.assertEqual(msg, MSG)
2425 self.checkRecvmsgAddress(addr, self.cli_addr)
2426 self.assertEqual(ancdata, [])
2427 self.checkFlags(flags, eor=True)
2428
2429 def _testRecvmsgBadArgs(self):
2430 self.sendToServer(MSG)
2431
2432
2433class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2434 # Tests for recvmsg_into() which can use any socket type.
2435
2436 def testRecvmsgIntoBadArgs(self):
2437 # Check that recvmsg_into() rejects invalid arguments.
2438 buf = bytearray(len(MSG))
2439 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2440 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2441 len(MSG), 0, 0)
2442 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2443 buf, 0, 0)
2444 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2445 [object()], 0, 0)
2446 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2447 [b"I'm not writable"], 0, 0)
2448 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2449 [buf, object()], 0, 0)
2450 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2451 [buf], -1, 0)
2452 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2453 [buf], object(), 0)
2454 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2455 [buf], 0, object())
2456
2457 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2458 self.assertEqual(nbytes, len(MSG))
2459 self.assertEqual(buf, bytearray(MSG))
2460 self.checkRecvmsgAddress(addr, self.cli_addr)
2461 self.assertEqual(ancdata, [])
2462 self.checkFlags(flags, eor=True)
2463
2464 def _testRecvmsgIntoBadArgs(self):
2465 self.sendToServer(MSG)
2466
2467 def testRecvmsgIntoGenerator(self):
2468 # Receive into buffer obtained from a generator (not a sequence).
2469 buf = bytearray(len(MSG))
2470 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2471 (o for o in [buf]))
2472 self.assertEqual(nbytes, len(MSG))
2473 self.assertEqual(buf, bytearray(MSG))
2474 self.checkRecvmsgAddress(addr, self.cli_addr)
2475 self.assertEqual(ancdata, [])
2476 self.checkFlags(flags, eor=True)
2477
2478 def _testRecvmsgIntoGenerator(self):
2479 self.sendToServer(MSG)
2480
2481 def testRecvmsgIntoArray(self):
2482 # Receive into an array rather than the usual bytearray.
2483 buf = array.array("B", [0] * len(MSG))
2484 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2485 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002486 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002487 self.checkRecvmsgAddress(addr, self.cli_addr)
2488 self.assertEqual(ancdata, [])
2489 self.checkFlags(flags, eor=True)
2490
2491 def _testRecvmsgIntoArray(self):
2492 self.sendToServer(MSG)
2493
2494 def testRecvmsgIntoScatter(self):
2495 # Receive into multiple buffers (scatter write).
2496 b1 = bytearray(b"----")
2497 b2 = bytearray(b"0123456789")
2498 b3 = bytearray(b"--------------")
2499 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2500 [b1, memoryview(b2)[2:9], b3])
2501 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2502 self.assertEqual(b1, bytearray(b"Mary"))
2503 self.assertEqual(b2, bytearray(b"01 had a 9"))
2504 self.assertEqual(b3, bytearray(b"little lamb---"))
2505 self.checkRecvmsgAddress(addr, self.cli_addr)
2506 self.assertEqual(ancdata, [])
2507 self.checkFlags(flags, eor=True)
2508
2509 def _testRecvmsgIntoScatter(self):
2510 self.sendToServer(b"Mary had a little lamb")
2511
2512
2513class CmsgMacroTests(unittest.TestCase):
2514 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2515 # assumptions used by sendmsg() and recvmsg[_into](), which share
2516 # code with these functions.
2517
2518 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002519 try:
2520 import _testcapi
2521 except ImportError:
2522 socklen_t_limit = 0x7fffffff
2523 else:
2524 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002525
2526 @requireAttrs(socket, "CMSG_LEN")
2527 def testCMSG_LEN(self):
2528 # Test CMSG_LEN() with various valid and invalid values,
2529 # checking the assumptions used by recvmsg() and sendmsg().
2530 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2531 values = list(range(257)) + list(range(toobig - 257, toobig))
2532
2533 # struct cmsghdr has at least three members, two of which are ints
2534 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2535 for n in values:
2536 ret = socket.CMSG_LEN(n)
2537 # This is how recvmsg() calculates the data size
2538 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2539 self.assertLessEqual(ret, self.socklen_t_limit)
2540
2541 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2542 # sendmsg() shares code with these functions, and requires
2543 # that it reject values over the limit.
2544 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2545 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2546
2547 @requireAttrs(socket, "CMSG_SPACE")
2548 def testCMSG_SPACE(self):
2549 # Test CMSG_SPACE() with various valid and invalid values,
2550 # checking the assumptions used by sendmsg().
2551 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2552 values = list(range(257)) + list(range(toobig - 257, toobig))
2553
2554 last = socket.CMSG_SPACE(0)
2555 # struct cmsghdr has at least three members, two of which are ints
2556 self.assertGreater(last, array.array("i").itemsize * 2)
2557 for n in values:
2558 ret = socket.CMSG_SPACE(n)
2559 self.assertGreaterEqual(ret, last)
2560 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2561 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2562 self.assertLessEqual(ret, self.socklen_t_limit)
2563 last = ret
2564
2565 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2566 # sendmsg() shares code with these functions, and requires
2567 # that it reject values over the limit.
2568 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2569 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2570
2571
2572class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2573 # Tests for file descriptor passing on Unix-domain sockets.
2574
2575 # Invalid file descriptor value that's unlikely to evaluate to a
2576 # real FD even if one of its bytes is replaced with a different
2577 # value (which shouldn't actually happen).
2578 badfd = -0x5555
2579
2580 def newFDs(self, n):
2581 # Return a list of n file descriptors for newly-created files
2582 # containing their list indices as ASCII numbers.
2583 fds = []
2584 for i in range(n):
2585 fd, path = tempfile.mkstemp()
2586 self.addCleanup(os.unlink, path)
2587 self.addCleanup(os.close, fd)
2588 os.write(fd, str(i).encode())
2589 fds.append(fd)
2590 return fds
2591
2592 def checkFDs(self, fds):
2593 # Check that the file descriptors in the given list contain
2594 # their correct list indices as ASCII numbers.
2595 for n, fd in enumerate(fds):
2596 os.lseek(fd, 0, os.SEEK_SET)
2597 self.assertEqual(os.read(fd, 1024), str(n).encode())
2598
2599 def registerRecvmsgResult(self, result):
2600 self.addCleanup(self.closeRecvmsgFDs, result)
2601
2602 def closeRecvmsgFDs(self, recvmsg_result):
2603 # Close all file descriptors specified in the ancillary data
2604 # of the given return value from recvmsg() or recvmsg_into().
2605 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2606 if (cmsg_level == socket.SOL_SOCKET and
2607 cmsg_type == socket.SCM_RIGHTS):
2608 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002609 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002610 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2611 for fd in fds:
2612 os.close(fd)
2613
2614 def createAndSendFDs(self, n):
2615 # Send n new file descriptors created by newFDs() to the
2616 # server, with the constant MSG as the non-ancillary data.
2617 self.assertEqual(
2618 self.sendmsgToServer([MSG],
2619 [(socket.SOL_SOCKET,
2620 socket.SCM_RIGHTS,
2621 array.array("i", self.newFDs(n)))]),
2622 len(MSG))
2623
2624 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2625 # Check that constant MSG was received with numfds file
2626 # descriptors in a maximum of maxcmsgs control messages (which
2627 # must contain only complete integers). By default, check
2628 # that MSG_CTRUNC is unset, but ignore any flags in
2629 # ignoreflags.
2630 msg, ancdata, flags, addr = result
2631 self.assertEqual(msg, MSG)
2632 self.checkRecvmsgAddress(addr, self.cli_addr)
2633 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2634 ignore=ignoreflags)
2635
2636 self.assertIsInstance(ancdata, list)
2637 self.assertLessEqual(len(ancdata), maxcmsgs)
2638 fds = array.array("i")
2639 for item in ancdata:
2640 self.assertIsInstance(item, tuple)
2641 cmsg_level, cmsg_type, cmsg_data = item
2642 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2643 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2644 self.assertIsInstance(cmsg_data, bytes)
2645 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002646 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002647
2648 self.assertEqual(len(fds), numfds)
2649 self.checkFDs(fds)
2650
2651 def testFDPassSimple(self):
2652 # Pass a single FD (array read from bytes object).
2653 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2654 len(MSG), 10240))
2655
2656 def _testFDPassSimple(self):
2657 self.assertEqual(
2658 self.sendmsgToServer(
2659 [MSG],
2660 [(socket.SOL_SOCKET,
2661 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002662 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002663 len(MSG))
2664
2665 def testMultipleFDPass(self):
2666 # Pass multiple FDs in a single array.
2667 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2668 len(MSG), 10240))
2669
2670 def _testMultipleFDPass(self):
2671 self.createAndSendFDs(4)
2672
2673 @requireAttrs(socket, "CMSG_SPACE")
2674 def testFDPassCMSG_SPACE(self):
2675 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2676 self.checkRecvmsgFDs(
2677 4, self.doRecvmsg(self.serv_sock, len(MSG),
2678 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2679
2680 @testFDPassCMSG_SPACE.client_skip
2681 def _testFDPassCMSG_SPACE(self):
2682 self.createAndSendFDs(4)
2683
2684 def testFDPassCMSG_LEN(self):
2685 # Test using CMSG_LEN() to calculate ancillary buffer size.
2686 self.checkRecvmsgFDs(1,
2687 self.doRecvmsg(self.serv_sock, len(MSG),
2688 socket.CMSG_LEN(4 * SIZEOF_INT)),
2689 # RFC 3542 says implementations may set
2690 # MSG_CTRUNC if there isn't enough space
2691 # for trailing padding.
2692 ignoreflags=socket.MSG_CTRUNC)
2693
2694 def _testFDPassCMSG_LEN(self):
2695 self.createAndSendFDs(1)
2696
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002697 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002698 @requireAttrs(socket, "CMSG_SPACE")
2699 def testFDPassSeparate(self):
2700 # Pass two FDs in two separate arrays. Arrays may be combined
2701 # into a single control message by the OS.
2702 self.checkRecvmsgFDs(2,
2703 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2704 maxcmsgs=2)
2705
2706 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002707 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002708 def _testFDPassSeparate(self):
2709 fd0, fd1 = self.newFDs(2)
2710 self.assertEqual(
2711 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2712 socket.SCM_RIGHTS,
2713 array.array("i", [fd0])),
2714 (socket.SOL_SOCKET,
2715 socket.SCM_RIGHTS,
2716 array.array("i", [fd1]))]),
2717 len(MSG))
2718
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002719 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002720 @requireAttrs(socket, "CMSG_SPACE")
2721 def testFDPassSeparateMinSpace(self):
2722 # Pass two FDs in two separate arrays, receiving them into the
2723 # minimum space for two arrays.
2724 self.checkRecvmsgFDs(2,
2725 self.doRecvmsg(self.serv_sock, len(MSG),
2726 socket.CMSG_SPACE(SIZEOF_INT) +
2727 socket.CMSG_LEN(SIZEOF_INT)),
2728 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2729
2730 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002731 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002732 def _testFDPassSeparateMinSpace(self):
2733 fd0, fd1 = self.newFDs(2)
2734 self.assertEqual(
2735 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2736 socket.SCM_RIGHTS,
2737 array.array("i", [fd0])),
2738 (socket.SOL_SOCKET,
2739 socket.SCM_RIGHTS,
2740 array.array("i", [fd1]))]),
2741 len(MSG))
2742
2743 def sendAncillaryIfPossible(self, msg, ancdata):
2744 # Try to send msg and ancdata to server, but if the system
2745 # call fails, just send msg with no ancillary data.
2746 try:
2747 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002748 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002749 # Check that it was the system call that failed
2750 self.assertIsInstance(e.errno, int)
2751 nbytes = self.sendmsgToServer([msg])
2752 self.assertEqual(nbytes, len(msg))
2753
2754 def testFDPassEmpty(self):
2755 # Try to pass an empty FD array. Can receive either no array
2756 # or an empty array.
2757 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2758 len(MSG), 10240),
2759 ignoreflags=socket.MSG_CTRUNC)
2760
2761 def _testFDPassEmpty(self):
2762 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2763 socket.SCM_RIGHTS,
2764 b"")])
2765
2766 def testFDPassPartialInt(self):
2767 # Try to pass a truncated FD array.
2768 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2769 len(MSG), 10240)
2770 self.assertEqual(msg, MSG)
2771 self.checkRecvmsgAddress(addr, self.cli_addr)
2772 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2773 self.assertLessEqual(len(ancdata), 1)
2774 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2775 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2776 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2777 self.assertLess(len(cmsg_data), SIZEOF_INT)
2778
2779 def _testFDPassPartialInt(self):
2780 self.sendAncillaryIfPossible(
2781 MSG,
2782 [(socket.SOL_SOCKET,
2783 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002784 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002785
2786 @requireAttrs(socket, "CMSG_SPACE")
2787 def testFDPassPartialIntInMiddle(self):
2788 # Try to pass two FD arrays, the first of which is truncated.
2789 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2790 len(MSG), 10240)
2791 self.assertEqual(msg, MSG)
2792 self.checkRecvmsgAddress(addr, self.cli_addr)
2793 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2794 self.assertLessEqual(len(ancdata), 2)
2795 fds = array.array("i")
2796 # Arrays may have been combined in a single control message
2797 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2798 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2799 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002800 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002801 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2802 self.assertLessEqual(len(fds), 2)
2803 self.checkFDs(fds)
2804
2805 @testFDPassPartialIntInMiddle.client_skip
2806 def _testFDPassPartialIntInMiddle(self):
2807 fd0, fd1 = self.newFDs(2)
2808 self.sendAncillaryIfPossible(
2809 MSG,
2810 [(socket.SOL_SOCKET,
2811 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002812 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002813 (socket.SOL_SOCKET,
2814 socket.SCM_RIGHTS,
2815 array.array("i", [fd1]))])
2816
2817 def checkTruncatedHeader(self, result, ignoreflags=0):
2818 # Check that no ancillary data items are returned when data is
2819 # truncated inside the cmsghdr structure.
2820 msg, ancdata, flags, addr = result
2821 self.assertEqual(msg, MSG)
2822 self.checkRecvmsgAddress(addr, self.cli_addr)
2823 self.assertEqual(ancdata, [])
2824 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2825 ignore=ignoreflags)
2826
2827 def testCmsgTruncNoBufSize(self):
2828 # Check that no ancillary data is received when no buffer size
2829 # is specified.
2830 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2831 # BSD seems to set MSG_CTRUNC only
2832 # if an item has been partially
2833 # received.
2834 ignoreflags=socket.MSG_CTRUNC)
2835
2836 def _testCmsgTruncNoBufSize(self):
2837 self.createAndSendFDs(1)
2838
2839 def testCmsgTrunc0(self):
2840 # Check that no ancillary data is received when buffer size is 0.
2841 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2842 ignoreflags=socket.MSG_CTRUNC)
2843
2844 def _testCmsgTrunc0(self):
2845 self.createAndSendFDs(1)
2846
2847 # Check that no ancillary data is returned for various non-zero
2848 # (but still too small) buffer sizes.
2849
2850 def testCmsgTrunc1(self):
2851 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2852
2853 def _testCmsgTrunc1(self):
2854 self.createAndSendFDs(1)
2855
2856 def testCmsgTrunc2Int(self):
2857 # The cmsghdr structure has at least three members, two of
2858 # which are ints, so we still shouldn't see any ancillary
2859 # data.
2860 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2861 SIZEOF_INT * 2))
2862
2863 def _testCmsgTrunc2Int(self):
2864 self.createAndSendFDs(1)
2865
2866 def testCmsgTruncLen0Minus1(self):
2867 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2868 socket.CMSG_LEN(0) - 1))
2869
2870 def _testCmsgTruncLen0Minus1(self):
2871 self.createAndSendFDs(1)
2872
2873 # The following tests try to truncate the control message in the
2874 # middle of the FD array.
2875
2876 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2877 # Check that file descriptor data is truncated to between
2878 # mindata and maxdata bytes when received with buffer size
2879 # ancbuf, and that any complete file descriptor numbers are
2880 # valid.
2881 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2882 len(MSG), ancbuf)
2883 self.assertEqual(msg, MSG)
2884 self.checkRecvmsgAddress(addr, self.cli_addr)
2885 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2886
2887 if mindata == 0 and ancdata == []:
2888 return
2889 self.assertEqual(len(ancdata), 1)
2890 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2891 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2892 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2893 self.assertGreaterEqual(len(cmsg_data), mindata)
2894 self.assertLessEqual(len(cmsg_data), maxdata)
2895 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002896 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002897 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2898 self.checkFDs(fds)
2899
2900 def testCmsgTruncLen0(self):
2901 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2902
2903 def _testCmsgTruncLen0(self):
2904 self.createAndSendFDs(1)
2905
2906 def testCmsgTruncLen0Plus1(self):
2907 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2908
2909 def _testCmsgTruncLen0Plus1(self):
2910 self.createAndSendFDs(2)
2911
2912 def testCmsgTruncLen1(self):
2913 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2914 maxdata=SIZEOF_INT)
2915
2916 def _testCmsgTruncLen1(self):
2917 self.createAndSendFDs(2)
2918
2919 def testCmsgTruncLen2Minus1(self):
2920 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2921 maxdata=(2 * SIZEOF_INT) - 1)
2922
2923 def _testCmsgTruncLen2Minus1(self):
2924 self.createAndSendFDs(2)
2925
2926
2927class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2928 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2929 # features of the RFC 3542 Advanced Sockets API for IPv6.
2930 # Currently we can only handle certain data items (e.g. traffic
2931 # class, hop limit, MTU discovery and fragmentation settings)
2932 # without resorting to unportable means such as the struct module,
2933 # but the tests here are aimed at testing the ancillary data
2934 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2935 # itself.
2936
2937 # Test value to use when setting hop limit of packet
2938 hop_limit = 2
2939
2940 # Test value to use when setting traffic class of packet.
2941 # -1 means "use kernel default".
2942 traffic_class = -1
2943
2944 def ancillaryMapping(self, ancdata):
2945 # Given ancillary data list ancdata, return a mapping from
2946 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2947 # Check that no (level, type) pair appears more than once.
2948 d = {}
2949 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2950 self.assertNotIn((cmsg_level, cmsg_type), d)
2951 d[(cmsg_level, cmsg_type)] = cmsg_data
2952 return d
2953
2954 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2955 # Receive hop limit into ancbufsize bytes of ancillary data
2956 # space. Check that data is MSG, ancillary data is not
2957 # truncated (but ignore any flags in ignoreflags), and hop
2958 # limit is between 0 and maxhop inclusive.
2959 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2960 socket.IPV6_RECVHOPLIMIT, 1)
2961 self.misc_event.set()
2962 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2963 len(MSG), ancbufsize)
2964
2965 self.assertEqual(msg, MSG)
2966 self.checkRecvmsgAddress(addr, self.cli_addr)
2967 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2968 ignore=ignoreflags)
2969
2970 self.assertEqual(len(ancdata), 1)
2971 self.assertIsInstance(ancdata[0], tuple)
2972 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2973 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2974 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2975 self.assertIsInstance(cmsg_data, bytes)
2976 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2977 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002978 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002979 self.assertGreaterEqual(a[0], 0)
2980 self.assertLessEqual(a[0], maxhop)
2981
2982 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2983 def testRecvHopLimit(self):
2984 # Test receiving the packet hop limit as ancillary data.
2985 self.checkHopLimit(ancbufsize=10240)
2986
2987 @testRecvHopLimit.client_skip
2988 def _testRecvHopLimit(self):
2989 # Need to wait until server has asked to receive ancillary
2990 # data, as implementations are not required to buffer it
2991 # otherwise.
2992 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2993 self.sendToServer(MSG)
2994
2995 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2996 def testRecvHopLimitCMSG_SPACE(self):
2997 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2998 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2999
3000 @testRecvHopLimitCMSG_SPACE.client_skip
3001 def _testRecvHopLimitCMSG_SPACE(self):
3002 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3003 self.sendToServer(MSG)
3004
3005 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3006 # 3542 says portable applications must provide space for trailing
3007 # padding. Implementations may set MSG_CTRUNC if there isn't
3008 # enough space for the padding.
3009
3010 @requireAttrs(socket.socket, "sendmsg")
3011 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3012 def testSetHopLimit(self):
3013 # Test setting hop limit on outgoing packet and receiving it
3014 # at the other end.
3015 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3016
3017 @testSetHopLimit.client_skip
3018 def _testSetHopLimit(self):
3019 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3020 self.assertEqual(
3021 self.sendmsgToServer([MSG],
3022 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3023 array.array("i", [self.hop_limit]))]),
3024 len(MSG))
3025
3026 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3027 ignoreflags=0):
3028 # Receive traffic class and hop limit into ancbufsize bytes of
3029 # ancillary data space. Check that data is MSG, ancillary
3030 # data is not truncated (but ignore any flags in ignoreflags),
3031 # and traffic class and hop limit are in range (hop limit no
3032 # more than maxhop).
3033 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3034 socket.IPV6_RECVHOPLIMIT, 1)
3035 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3036 socket.IPV6_RECVTCLASS, 1)
3037 self.misc_event.set()
3038 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3039 len(MSG), ancbufsize)
3040
3041 self.assertEqual(msg, MSG)
3042 self.checkRecvmsgAddress(addr, self.cli_addr)
3043 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3044 ignore=ignoreflags)
3045 self.assertEqual(len(ancdata), 2)
3046 ancmap = self.ancillaryMapping(ancdata)
3047
3048 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3049 self.assertEqual(len(tcdata), SIZEOF_INT)
3050 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003051 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003052 self.assertGreaterEqual(a[0], 0)
3053 self.assertLessEqual(a[0], 255)
3054
3055 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3056 self.assertEqual(len(hldata), SIZEOF_INT)
3057 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003058 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003059 self.assertGreaterEqual(a[0], 0)
3060 self.assertLessEqual(a[0], maxhop)
3061
3062 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3063 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3064 def testRecvTrafficClassAndHopLimit(self):
3065 # Test receiving traffic class and hop limit as ancillary data.
3066 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3067
3068 @testRecvTrafficClassAndHopLimit.client_skip
3069 def _testRecvTrafficClassAndHopLimit(self):
3070 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3071 self.sendToServer(MSG)
3072
3073 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3074 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3075 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3076 # Test receiving traffic class and hop limit, using
3077 # CMSG_SPACE() to calculate buffer size.
3078 self.checkTrafficClassAndHopLimit(
3079 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3080
3081 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3082 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3083 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3084 self.sendToServer(MSG)
3085
3086 @requireAttrs(socket.socket, "sendmsg")
3087 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3088 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3089 def testSetTrafficClassAndHopLimit(self):
3090 # Test setting traffic class and hop limit on outgoing packet,
3091 # and receiving them at the other end.
3092 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3093 maxhop=self.hop_limit)
3094
3095 @testSetTrafficClassAndHopLimit.client_skip
3096 def _testSetTrafficClassAndHopLimit(self):
3097 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3098 self.assertEqual(
3099 self.sendmsgToServer([MSG],
3100 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3101 array.array("i", [self.traffic_class])),
3102 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3103 array.array("i", [self.hop_limit]))]),
3104 len(MSG))
3105
3106 @requireAttrs(socket.socket, "sendmsg")
3107 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3108 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3109 def testOddCmsgSize(self):
3110 # Try to send ancillary data with first item one byte too
3111 # long. Fall back to sending with correct size if this fails,
3112 # and check that second item was handled correctly.
3113 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3114 maxhop=self.hop_limit)
3115
3116 @testOddCmsgSize.client_skip
3117 def _testOddCmsgSize(self):
3118 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3119 try:
3120 nbytes = self.sendmsgToServer(
3121 [MSG],
3122 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003123 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003124 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3125 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003126 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003127 self.assertIsInstance(e.errno, int)
3128 nbytes = self.sendmsgToServer(
3129 [MSG],
3130 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3131 array.array("i", [self.traffic_class])),
3132 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3133 array.array("i", [self.hop_limit]))])
3134 self.assertEqual(nbytes, len(MSG))
3135
3136 # Tests for proper handling of truncated ancillary data
3137
3138 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3139 # Receive hop limit into ancbufsize bytes of ancillary data
3140 # space, which should be too small to contain the ancillary
3141 # data header (if ancbufsize is None, pass no second argument
3142 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3143 # (unless included in ignoreflags), and no ancillary data is
3144 # returned.
3145 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3146 socket.IPV6_RECVHOPLIMIT, 1)
3147 self.misc_event.set()
3148 args = () if ancbufsize is None else (ancbufsize,)
3149 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3150 len(MSG), *args)
3151
3152 self.assertEqual(msg, MSG)
3153 self.checkRecvmsgAddress(addr, self.cli_addr)
3154 self.assertEqual(ancdata, [])
3155 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3156 ignore=ignoreflags)
3157
3158 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3159 def testCmsgTruncNoBufSize(self):
3160 # Check that no ancillary data is received when no ancillary
3161 # buffer size is provided.
3162 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3163 # BSD seems to set
3164 # MSG_CTRUNC only if an item
3165 # has been partially
3166 # received.
3167 ignoreflags=socket.MSG_CTRUNC)
3168
3169 @testCmsgTruncNoBufSize.client_skip
3170 def _testCmsgTruncNoBufSize(self):
3171 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3172 self.sendToServer(MSG)
3173
3174 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3175 def testSingleCmsgTrunc0(self):
3176 # Check that no ancillary data is received when ancillary
3177 # buffer size is zero.
3178 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3179 ignoreflags=socket.MSG_CTRUNC)
3180
3181 @testSingleCmsgTrunc0.client_skip
3182 def _testSingleCmsgTrunc0(self):
3183 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3184 self.sendToServer(MSG)
3185
3186 # Check that no ancillary data is returned for various non-zero
3187 # (but still too small) buffer sizes.
3188
3189 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3190 def testSingleCmsgTrunc1(self):
3191 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3192
3193 @testSingleCmsgTrunc1.client_skip
3194 def _testSingleCmsgTrunc1(self):
3195 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3196 self.sendToServer(MSG)
3197
3198 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3199 def testSingleCmsgTrunc2Int(self):
3200 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3201
3202 @testSingleCmsgTrunc2Int.client_skip
3203 def _testSingleCmsgTrunc2Int(self):
3204 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3205 self.sendToServer(MSG)
3206
3207 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3208 def testSingleCmsgTruncLen0Minus1(self):
3209 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3210
3211 @testSingleCmsgTruncLen0Minus1.client_skip
3212 def _testSingleCmsgTruncLen0Minus1(self):
3213 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3214 self.sendToServer(MSG)
3215
3216 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3217 def testSingleCmsgTruncInData(self):
3218 # Test truncation of a control message inside its associated
3219 # data. The message may be returned with its data truncated,
3220 # or not returned at all.
3221 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3222 socket.IPV6_RECVHOPLIMIT, 1)
3223 self.misc_event.set()
3224 msg, ancdata, flags, addr = self.doRecvmsg(
3225 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3226
3227 self.assertEqual(msg, MSG)
3228 self.checkRecvmsgAddress(addr, self.cli_addr)
3229 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3230
3231 self.assertLessEqual(len(ancdata), 1)
3232 if ancdata:
3233 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3234 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3235 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3236 self.assertLess(len(cmsg_data), SIZEOF_INT)
3237
3238 @testSingleCmsgTruncInData.client_skip
3239 def _testSingleCmsgTruncInData(self):
3240 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3241 self.sendToServer(MSG)
3242
3243 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3244 # Receive traffic class and hop limit into ancbufsize bytes of
3245 # ancillary data space, which should be large enough to
3246 # contain the first item, but too small to contain the header
3247 # of the second. Check that data is MSG, MSG_CTRUNC is set
3248 # (unless included in ignoreflags), and only one ancillary
3249 # data item is returned.
3250 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3251 socket.IPV6_RECVHOPLIMIT, 1)
3252 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3253 socket.IPV6_RECVTCLASS, 1)
3254 self.misc_event.set()
3255 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3256 len(MSG), ancbufsize)
3257
3258 self.assertEqual(msg, MSG)
3259 self.checkRecvmsgAddress(addr, self.cli_addr)
3260 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3261 ignore=ignoreflags)
3262
3263 self.assertEqual(len(ancdata), 1)
3264 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3265 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3266 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3267 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3268 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003269 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003270 self.assertGreaterEqual(a[0], 0)
3271 self.assertLessEqual(a[0], 255)
3272
3273 # Try the above test with various buffer sizes.
3274
3275 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3276 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3277 def testSecondCmsgTrunc0(self):
3278 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3279 ignoreflags=socket.MSG_CTRUNC)
3280
3281 @testSecondCmsgTrunc0.client_skip
3282 def _testSecondCmsgTrunc0(self):
3283 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3284 self.sendToServer(MSG)
3285
3286 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3287 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3288 def testSecondCmsgTrunc1(self):
3289 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3290
3291 @testSecondCmsgTrunc1.client_skip
3292 def _testSecondCmsgTrunc1(self):
3293 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3294 self.sendToServer(MSG)
3295
3296 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3297 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3298 def testSecondCmsgTrunc2Int(self):
3299 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3300 2 * SIZEOF_INT)
3301
3302 @testSecondCmsgTrunc2Int.client_skip
3303 def _testSecondCmsgTrunc2Int(self):
3304 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3305 self.sendToServer(MSG)
3306
3307 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3308 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3309 def testSecondCmsgTruncLen0Minus1(self):
3310 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3311 socket.CMSG_LEN(0) - 1)
3312
3313 @testSecondCmsgTruncLen0Minus1.client_skip
3314 def _testSecondCmsgTruncLen0Minus1(self):
3315 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3316 self.sendToServer(MSG)
3317
3318 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3319 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3320 def testSecomdCmsgTruncInData(self):
3321 # Test truncation of the second of two control messages inside
3322 # its associated data.
3323 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3324 socket.IPV6_RECVHOPLIMIT, 1)
3325 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3326 socket.IPV6_RECVTCLASS, 1)
3327 self.misc_event.set()
3328 msg, ancdata, flags, addr = self.doRecvmsg(
3329 self.serv_sock, len(MSG),
3330 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3331
3332 self.assertEqual(msg, MSG)
3333 self.checkRecvmsgAddress(addr, self.cli_addr)
3334 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3335
3336 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3337
3338 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3339 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3340 cmsg_types.remove(cmsg_type)
3341 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3342 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003343 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003344 self.assertGreaterEqual(a[0], 0)
3345 self.assertLessEqual(a[0], 255)
3346
3347 if ancdata:
3348 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3349 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3350 cmsg_types.remove(cmsg_type)
3351 self.assertLess(len(cmsg_data), SIZEOF_INT)
3352
3353 self.assertEqual(ancdata, [])
3354
3355 @testSecomdCmsgTruncInData.client_skip
3356 def _testSecomdCmsgTruncInData(self):
3357 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3358 self.sendToServer(MSG)
3359
3360
3361# Derive concrete test classes for different socket types.
3362
3363class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3364 SendrecvmsgConnectionlessBase,
3365 ThreadedSocketTestMixin, UDPTestBase):
3366 pass
3367
3368@requireAttrs(socket.socket, "sendmsg")
3369@unittest.skipUnless(thread, 'Threading required for this test.')
3370class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3371 pass
3372
3373@requireAttrs(socket.socket, "recvmsg")
3374@unittest.skipUnless(thread, 'Threading required for this test.')
3375class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3376 pass
3377
3378@requireAttrs(socket.socket, "recvmsg_into")
3379@unittest.skipUnless(thread, 'Threading required for this test.')
3380class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3381 pass
3382
3383
3384class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3385 SendrecvmsgConnectionlessBase,
3386 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003387
3388 def checkRecvmsgAddress(self, addr1, addr2):
3389 # Called to compare the received address with the address of
3390 # the peer, ignoring scope ID
3391 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003392
3393@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003394@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003395@requireSocket("AF_INET6", "SOCK_DGRAM")
3396@unittest.skipUnless(thread, 'Threading required for this test.')
3397class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3398 pass
3399
3400@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003401@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003402@requireSocket("AF_INET6", "SOCK_DGRAM")
3403@unittest.skipUnless(thread, 'Threading required for this test.')
3404class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3405 pass
3406
3407@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003408@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003409@requireSocket("AF_INET6", "SOCK_DGRAM")
3410@unittest.skipUnless(thread, 'Threading required for this test.')
3411class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3412 pass
3413
3414@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003415@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003416@requireAttrs(socket, "IPPROTO_IPV6")
3417@requireSocket("AF_INET6", "SOCK_DGRAM")
3418@unittest.skipUnless(thread, 'Threading required for this test.')
3419class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3420 SendrecvmsgUDP6TestBase):
3421 pass
3422
3423@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003424@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003425@requireAttrs(socket, "IPPROTO_IPV6")
3426@requireSocket("AF_INET6", "SOCK_DGRAM")
3427@unittest.skipUnless(thread, 'Threading required for this test.')
3428class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3429 RFC3542AncillaryTest,
3430 SendrecvmsgUDP6TestBase):
3431 pass
3432
3433
3434class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3435 ConnectedStreamTestMixin, TCPTestBase):
3436 pass
3437
3438@requireAttrs(socket.socket, "sendmsg")
3439@unittest.skipUnless(thread, 'Threading required for this test.')
3440class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3441 pass
3442
3443@requireAttrs(socket.socket, "recvmsg")
3444@unittest.skipUnless(thread, 'Threading required for this test.')
3445class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3446 SendrecvmsgTCPTestBase):
3447 pass
3448
3449@requireAttrs(socket.socket, "recvmsg_into")
3450@unittest.skipUnless(thread, 'Threading required for this test.')
3451class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3452 SendrecvmsgTCPTestBase):
3453 pass
3454
3455
3456class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3457 SendrecvmsgConnectedBase,
3458 ConnectedStreamTestMixin, SCTPStreamBase):
3459 pass
3460
3461@requireAttrs(socket.socket, "sendmsg")
3462@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3463@unittest.skipUnless(thread, 'Threading required for this test.')
3464class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3465 pass
3466
3467@requireAttrs(socket.socket, "recvmsg")
3468@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3469@unittest.skipUnless(thread, 'Threading required for this test.')
3470class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3471 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003472
3473 def testRecvmsgEOF(self):
3474 try:
3475 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3476 except OSError as e:
3477 if e.errno != errno.ENOTCONN:
3478 raise
3479 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003480
3481@requireAttrs(socket.socket, "recvmsg_into")
3482@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3483@unittest.skipUnless(thread, 'Threading required for this test.')
3484class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3485 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003486
3487 def testRecvmsgEOF(self):
3488 try:
3489 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3490 except OSError as e:
3491 if e.errno != errno.ENOTCONN:
3492 raise
3493 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003494
3495
3496class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3497 ConnectedStreamTestMixin, UnixStreamBase):
3498 pass
3499
3500@requireAttrs(socket.socket, "sendmsg")
3501@requireAttrs(socket, "AF_UNIX")
3502@unittest.skipUnless(thread, 'Threading required for this test.')
3503class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3504 pass
3505
3506@requireAttrs(socket.socket, "recvmsg")
3507@requireAttrs(socket, "AF_UNIX")
3508@unittest.skipUnless(thread, 'Threading required for this test.')
3509class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3510 SendrecvmsgUnixStreamTestBase):
3511 pass
3512
3513@requireAttrs(socket.socket, "recvmsg_into")
3514@requireAttrs(socket, "AF_UNIX")
3515@unittest.skipUnless(thread, 'Threading required for this test.')
3516class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3517 SendrecvmsgUnixStreamTestBase):
3518 pass
3519
3520@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3521@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3522@unittest.skipUnless(thread, 'Threading required for this test.')
3523class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3524 pass
3525
3526@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3527@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3528@unittest.skipUnless(thread, 'Threading required for this test.')
3529class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3530 SendrecvmsgUnixStreamTestBase):
3531 pass
3532
3533
3534# Test interrupting the interruptible send/receive methods with a
3535# signal when a timeout is set. These tests avoid having multiple
3536# threads alive during the test so that the OS cannot deliver the
3537# signal to the wrong one.
3538
3539class InterruptedTimeoutBase(unittest.TestCase):
3540 # Base class for interrupted send/receive tests. Installs an
3541 # empty handler for SIGALRM and removes it on teardown, along with
3542 # any scheduled alarms.
3543
3544 def setUp(self):
3545 super().setUp()
3546 orig_alrm_handler = signal.signal(signal.SIGALRM,
3547 lambda signum, frame: None)
3548 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3549 self.addCleanup(self.setAlarm, 0)
3550
3551 # Timeout for socket operations
3552 timeout = 4.0
3553
3554 # Provide setAlarm() method to schedule delivery of SIGALRM after
3555 # given number of seconds, or cancel it if zero, and an
3556 # appropriate time value to use. Use setitimer() if available.
3557 if hasattr(signal, "setitimer"):
3558 alarm_time = 0.05
3559
3560 def setAlarm(self, seconds):
3561 signal.setitimer(signal.ITIMER_REAL, seconds)
3562 else:
3563 # Old systems may deliver the alarm up to one second early
3564 alarm_time = 2
3565
3566 def setAlarm(self, seconds):
3567 signal.alarm(seconds)
3568
3569
3570# Require siginterrupt() in order to ensure that system calls are
3571# interrupted by default.
3572@requireAttrs(signal, "siginterrupt")
3573@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3574 "Don't have signal.alarm or signal.setitimer")
3575class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3576 # Test interrupting the recv*() methods with signals when a
3577 # timeout is set.
3578
3579 def setUp(self):
3580 super().setUp()
3581 self.serv.settimeout(self.timeout)
3582
3583 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003584 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003585 # errno of EINTR when interrupted by a signal.
3586 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003587 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003588 func(*args, **kwargs)
3589 self.assertNotIsInstance(cm.exception, socket.timeout)
3590 self.assertEqual(cm.exception.errno, errno.EINTR)
3591
3592 def testInterruptedRecvTimeout(self):
3593 self.checkInterruptedRecv(self.serv.recv, 1024)
3594
3595 def testInterruptedRecvIntoTimeout(self):
3596 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3597
3598 def testInterruptedRecvfromTimeout(self):
3599 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3600
3601 def testInterruptedRecvfromIntoTimeout(self):
3602 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3603
3604 @requireAttrs(socket.socket, "recvmsg")
3605 def testInterruptedRecvmsgTimeout(self):
3606 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3607
3608 @requireAttrs(socket.socket, "recvmsg_into")
3609 def testInterruptedRecvmsgIntoTimeout(self):
3610 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3611
3612
3613# Require siginterrupt() in order to ensure that system calls are
3614# interrupted by default.
3615@requireAttrs(signal, "siginterrupt")
3616@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3617 "Don't have signal.alarm or signal.setitimer")
3618@unittest.skipUnless(thread, 'Threading required for this test.')
3619class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3620 ThreadSafeCleanupTestCase,
3621 SocketListeningTestMixin, TCPTestBase):
3622 # Test interrupting the interruptible send*() methods with signals
3623 # when a timeout is set.
3624
3625 def setUp(self):
3626 super().setUp()
3627 self.serv_conn = self.newSocket()
3628 self.addCleanup(self.serv_conn.close)
3629 # Use a thread to complete the connection, but wait for it to
3630 # terminate before running the test, so that there is only one
3631 # thread to accept the signal.
3632 cli_thread = threading.Thread(target=self.doConnect)
3633 cli_thread.start()
3634 self.cli_conn, addr = self.serv.accept()
3635 self.addCleanup(self.cli_conn.close)
3636 cli_thread.join()
3637 self.serv_conn.settimeout(self.timeout)
3638
3639 def doConnect(self):
3640 self.serv_conn.connect(self.serv_addr)
3641
3642 def checkInterruptedSend(self, func, *args, **kwargs):
3643 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003644 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003645 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003646 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003647 while True:
3648 self.setAlarm(self.alarm_time)
3649 func(*args, **kwargs)
3650 self.assertNotIsInstance(cm.exception, socket.timeout)
3651 self.assertEqual(cm.exception.errno, errno.EINTR)
3652
Ned Deilyc5640382014-02-03 13:58:31 -08003653 # Issue #12958: The following tests have problems on OS X prior to 10.7
3654 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003655 def testInterruptedSendTimeout(self):
3656 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3657
Ned Deilyc5640382014-02-03 13:58:31 -08003658 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003659 def testInterruptedSendtoTimeout(self):
3660 # Passing an actual address here as Python's wrapper for
3661 # sendto() doesn't allow passing a zero-length one; POSIX
3662 # requires that the address is ignored since the socket is
3663 # connection-mode, however.
3664 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3665 self.serv_addr)
3666
Ned Deilyc5640382014-02-03 13:58:31 -08003667 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003668 @requireAttrs(socket.socket, "sendmsg")
3669 def testInterruptedSendmsgTimeout(self):
3670 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3671
3672
Victor Stinner45df8202010-04-28 22:31:17 +00003673@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003674class TCPCloserTest(ThreadedTCPSocketTest):
3675
3676 def testClose(self):
3677 conn, addr = self.serv.accept()
3678 conn.close()
3679
3680 sd = self.cli
3681 read, write, err = select.select([sd], [], [], 1.0)
3682 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003683 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003684
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003685 # Calling close() many times should be safe.
3686 conn.close()
3687 conn.close()
3688
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003689 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003690 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003691 time.sleep(1.0)
3692
Serhiy Storchaka43767632013-11-03 21:31:38 +02003693@unittest.skipUnless(hasattr(socket, 'socketpair'),
3694 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003695@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003696class BasicSocketPairTest(SocketPairTest):
3697
3698 def __init__(self, methodName='runTest'):
3699 SocketPairTest.__init__(self, methodName=methodName)
3700
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003701 def _check_defaults(self, sock):
3702 self.assertIsInstance(sock, socket.socket)
3703 if hasattr(socket, 'AF_UNIX'):
3704 self.assertEqual(sock.family, socket.AF_UNIX)
3705 else:
3706 self.assertEqual(sock.family, socket.AF_INET)
3707 self.assertEqual(sock.type, socket.SOCK_STREAM)
3708 self.assertEqual(sock.proto, 0)
3709
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003710 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003711 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003712
3713 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003714 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003715
Dave Cole331708b2004-08-09 04:51:41 +00003716 def testRecv(self):
3717 msg = self.serv.recv(1024)
3718 self.assertEqual(msg, MSG)
3719
3720 def _testRecv(self):
3721 self.cli.send(MSG)
3722
3723 def testSend(self):
3724 self.serv.send(MSG)
3725
3726 def _testSend(self):
3727 msg = self.cli.recv(1024)
3728 self.assertEqual(msg, MSG)
3729
Victor Stinner45df8202010-04-28 22:31:17 +00003730@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003731class NonBlockingTCPTests(ThreadedTCPSocketTest):
3732
3733 def __init__(self, methodName='runTest'):
3734 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3735
3736 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003737 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003738 self.serv.setblocking(True)
3739 self.assertIsNone(self.serv.gettimeout())
3740 self.serv.setblocking(False)
3741 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003742 start = time.time()
3743 try:
3744 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003745 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003746 pass
3747 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003748 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003749
3750 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003751 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003752
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003753 @support.cpython_only
3754 def testSetBlocking_overflow(self):
3755 # Issue 15989
3756 import _testcapi
3757 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3758 self.skipTest('needs UINT_MAX < ULONG_MAX')
3759 self.serv.setblocking(False)
3760 self.assertEqual(self.serv.gettimeout(), 0.0)
3761 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3762 self.assertIsNone(self.serv.gettimeout())
3763
3764 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3765
Serhiy Storchaka43767632013-11-03 21:31:38 +02003766 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3767 'test needs socket.SOCK_NONBLOCK')
3768 @support.requires_linux_version(2, 6, 28)
3769 def testInitNonBlocking(self):
3770 # reinit server socket
3771 self.serv.close()
3772 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3773 socket.SOCK_NONBLOCK)
3774 self.port = support.bind_port(self.serv)
3775 self.serv.listen(1)
3776 # actual testing
3777 start = time.time()
3778 try:
3779 self.serv.accept()
3780 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003781 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003782 end = time.time()
3783 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3784
3785 def _testInitNonBlocking(self):
3786 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003787
Antoine Pitrou600232b2011-01-05 21:03:42 +00003788 def testInheritFlags(self):
3789 # Issue #7995: when calling accept() on a listening socket with a
3790 # timeout, the resulting socket should not be non-blocking.
3791 self.serv.settimeout(10)
3792 try:
3793 conn, addr = self.serv.accept()
3794 message = conn.recv(len(MSG))
3795 finally:
3796 conn.close()
3797 self.serv.settimeout(None)
3798
3799 def _testInheritFlags(self):
3800 time.sleep(0.1)
3801 self.cli.connect((HOST, self.port))
3802 time.sleep(0.5)
3803 self.cli.send(MSG)
3804
Guido van Rossum24e4af82002-06-12 19:18:08 +00003805 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003806 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003807 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003808 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003809 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003810 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003811 pass
3812 else:
3813 self.fail("Error trying to do non-blocking accept.")
3814 read, write, err = select.select([self.serv], [], [])
3815 if self.serv in read:
3816 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003817 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003818 else:
3819 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003820
Guido van Rossum24e4af82002-06-12 19:18:08 +00003821 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003822 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003823 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003824
3825 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003826 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003827 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003828 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003829
3830 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003831 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003832 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003833
3834 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003835 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003836 conn, addr = self.serv.accept()
3837 conn.setblocking(0)
3838 try:
3839 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003840 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003841 pass
3842 else:
3843 self.fail("Error trying to do non-blocking recv.")
3844 read, write, err = select.select([conn], [], [])
3845 if conn in read:
3846 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003847 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003848 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003849 else:
3850 self.fail("Error during select call to non-blocking socket.")
3851
3852 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003853 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003854 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003855 self.cli.send(MSG)
3856
Victor Stinner45df8202010-04-28 22:31:17 +00003857@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003858class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003859 """Unit tests for the object returned by socket.makefile()
3860
Antoine Pitrou834bd812010-10-13 16:17:14 +00003861 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003862 the client connection. You can read from this file to
3863 get output from the server.
3864
Antoine Pitrou834bd812010-10-13 16:17:14 +00003865 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003866 server connection. You can write to this file to send output
3867 to the client.
3868 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003869
Guido van Rossume9f66142002-08-07 15:46:19 +00003870 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003871 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003872 errors = 'strict'
3873 newline = None
3874
3875 read_mode = 'rb'
3876 read_msg = MSG
3877 write_mode = 'wb'
3878 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003879
Guido van Rossum24e4af82002-06-12 19:18:08 +00003880 def __init__(self, methodName='runTest'):
3881 SocketConnectedTest.__init__(self, methodName=methodName)
3882
3883 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003884 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3885 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003886 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003887 self.read_file = self.cli_conn.makefile(
3888 self.read_mode, self.bufsize,
3889 encoding = self.encoding,
3890 errors = self.errors,
3891 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003892
3893 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003894 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003895 self.read_file.close()
3896 self.assertTrue(self.read_file.closed)
3897 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003898 SocketConnectedTest.tearDown(self)
3899
3900 def clientSetUp(self):
3901 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003902 self.write_file = self.serv_conn.makefile(
3903 self.write_mode, self.bufsize,
3904 encoding = self.encoding,
3905 errors = self.errors,
3906 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003907
3908 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003909 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003910 self.write_file.close()
3911 self.assertTrue(self.write_file.closed)
3912 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003913 SocketConnectedTest.clientTearDown(self)
3914
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003915 def testReadAfterTimeout(self):
3916 # Issue #7322: A file object must disallow further reads
3917 # after a timeout has occurred.
3918 self.cli_conn.settimeout(1)
3919 self.read_file.read(3)
3920 # First read raises a timeout
3921 self.assertRaises(socket.timeout, self.read_file.read, 1)
3922 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003923 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003924 self.read_file.read(1)
3925 self.assertIn("cannot read from timed out object", str(ctx.exception))
3926
3927 def _testReadAfterTimeout(self):
3928 self.write_file.write(self.write_msg[0:3])
3929 self.write_file.flush()
3930 self.serv_finished.wait()
3931
Guido van Rossum24e4af82002-06-12 19:18:08 +00003932 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003933 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003934 first_seg = self.read_file.read(len(self.read_msg)-3)
3935 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003936 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003937 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003938
3939 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003940 self.write_file.write(self.write_msg)
3941 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003942
Guido van Rossum8c943832002-08-08 01:00:28 +00003943 def testFullRead(self):
3944 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945 msg = self.read_file.read()
3946 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003947
3948 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003949 self.write_file.write(self.write_msg)
3950 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003951
Guido van Rossum24e4af82002-06-12 19:18:08 +00003952 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003953 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003954 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003955 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003956 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003957 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003958 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003959 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003960 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003961
3962 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003963 self.write_file.write(self.write_msg)
3964 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003965
3966 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003967 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003968 line = self.read_file.readline()
3969 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003970
3971 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003972 self.write_file.write(self.write_msg)
3973 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003974
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003975 def testCloseAfterMakefile(self):
3976 # The file returned by makefile should keep the socket open.
3977 self.cli_conn.close()
3978 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003979 msg = self.read_file.read()
3980 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003981
3982 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003983 self.write_file.write(self.write_msg)
3984 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003985
3986 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003987 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003988 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003989 if isinstance(self.read_msg, str):
3990 msg = msg.decode()
3991 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003992
3993 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003994 self.write_file.write(self.write_msg)
3995 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003996
Tim Peters116d83c2004-03-28 02:20:45 +00003997 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003998 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003999
4000 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004001 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004002
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004003 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004004 self.assertEqual(self.read_file.mode, self.read_mode)
4005 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004006
4007 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004008 self.assertEqual(self.write_file.mode, self.write_mode)
4009 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004010
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004011 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004012 self.read_file.close()
4013 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004014 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004015 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004016
4017 def _testRealClose(self):
4018 pass
4019
4020
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004021class FileObjectInterruptedTestCase(unittest.TestCase):
4022 """Test that the file object correctly handles EINTR internally."""
4023
4024 class MockSocket(object):
4025 def __init__(self, recv_funcs=()):
4026 # A generator that returns callables that we'll call for each
4027 # call to recv().
4028 self._recv_step = iter(recv_funcs)
4029
4030 def recv_into(self, buffer):
4031 data = next(self._recv_step)()
4032 assert len(buffer) >= len(data)
4033 buffer[:len(data)] = data
4034 return len(data)
4035
4036 def _decref_socketios(self):
4037 pass
4038
4039 def _textiowrap_for_test(self, buffering=-1):
4040 raw = socket.SocketIO(self, "r")
4041 if buffering < 0:
4042 buffering = io.DEFAULT_BUFFER_SIZE
4043 if buffering == 0:
4044 return raw
4045 buffer = io.BufferedReader(raw, buffering)
4046 text = io.TextIOWrapper(buffer, None, None)
4047 text.mode = "rb"
4048 return text
4049
4050 @staticmethod
4051 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004052 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004053
4054 def _textiowrap_mock_socket(self, mock, buffering=-1):
4055 raw = socket.SocketIO(mock, "r")
4056 if buffering < 0:
4057 buffering = io.DEFAULT_BUFFER_SIZE
4058 if buffering == 0:
4059 return raw
4060 buffer = io.BufferedReader(raw, buffering)
4061 text = io.TextIOWrapper(buffer, None, None)
4062 text.mode = "rb"
4063 return text
4064
4065 def _test_readline(self, size=-1, buffering=-1):
4066 mock_sock = self.MockSocket(recv_funcs=[
4067 lambda : b"This is the first line\nAnd the sec",
4068 self._raise_eintr,
4069 lambda : b"ond line is here\n",
4070 lambda : b"",
4071 lambda : b"", # XXX(gps): io library does an extra EOF read
4072 ])
4073 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004074 self.assertEqual(fo.readline(size), "This is the first line\n")
4075 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004076
4077 def _test_read(self, size=-1, buffering=-1):
4078 mock_sock = self.MockSocket(recv_funcs=[
4079 lambda : b"This is the first line\nAnd the sec",
4080 self._raise_eintr,
4081 lambda : b"ond line is here\n",
4082 lambda : b"",
4083 lambda : b"", # XXX(gps): io library does an extra EOF read
4084 ])
4085 expecting = (b"This is the first line\n"
4086 b"And the second line is here\n")
4087 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4088 if buffering == 0:
4089 data = b''
4090 else:
4091 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004092 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004093 while len(data) != len(expecting):
4094 part = fo.read(size)
4095 if not part:
4096 break
4097 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004098 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004099
4100 def test_default(self):
4101 self._test_readline()
4102 self._test_readline(size=100)
4103 self._test_read()
4104 self._test_read(size=100)
4105
4106 def test_with_1k_buffer(self):
4107 self._test_readline(buffering=1024)
4108 self._test_readline(size=100, buffering=1024)
4109 self._test_read(buffering=1024)
4110 self._test_read(size=100, buffering=1024)
4111
4112 def _test_readline_no_buffer(self, size=-1):
4113 mock_sock = self.MockSocket(recv_funcs=[
4114 lambda : b"a",
4115 lambda : b"\n",
4116 lambda : b"B",
4117 self._raise_eintr,
4118 lambda : b"b",
4119 lambda : b"",
4120 ])
4121 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004122 self.assertEqual(fo.readline(size), b"a\n")
4123 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004124
4125 def test_no_buffer(self):
4126 self._test_readline_no_buffer()
4127 self._test_readline_no_buffer(size=4)
4128 self._test_read(buffering=0)
4129 self._test_read(size=100, buffering=0)
4130
4131
Guido van Rossume9f66142002-08-07 15:46:19 +00004132class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4133
4134 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004135
Guido van Rossume9f66142002-08-07 15:46:19 +00004136 In this case (and in this case only), it should be possible to
4137 create a file object, read a line from it, create another file
4138 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004139 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004140 when reading multiple requests from the same socket."""
4141
4142 bufsize = 0 # Use unbuffered mode
4143
4144 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004145 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004146 line = self.read_file.readline() # first line
4147 self.assertEqual(line, b"A. " + self.write_msg) # first line
4148 self.read_file = self.cli_conn.makefile('rb', 0)
4149 line = self.read_file.readline() # second line
4150 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004151
4152 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004153 self.write_file.write(b"A. " + self.write_msg)
4154 self.write_file.write(b"B. " + self.write_msg)
4155 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004156
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004157 def testMakefileClose(self):
4158 # The file returned by makefile should keep the socket open...
4159 self.cli_conn.close()
4160 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004161 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004162 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004163 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004164 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004165
4166 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004167 self.write_file.write(self.write_msg)
4168 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004169
4170 def testMakefileCloseSocketDestroy(self):
4171 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004172 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004173 refcount_after = sys.getrefcount(self.cli_conn)
4174 self.assertEqual(refcount_before - 1, refcount_after)
4175
4176 def _testMakefileCloseSocketDestroy(self):
4177 pass
4178
Antoine Pitrou98b46702010-09-18 22:59:00 +00004179 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004180 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004181 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4182
4183 def testSmallReadNonBlocking(self):
4184 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004185 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4186 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004187 self.evt1.set()
4188 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004189 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004190 if first_seg is None:
4191 # Data not arrived (can happen under Windows), wait a bit
4192 time.sleep(0.5)
4193 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004194 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004195 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004196 self.assertEqual(n, 3)
4197 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004198 self.assertEqual(msg, self.read_msg)
4199 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4200 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004201
4202 def _testSmallReadNonBlocking(self):
4203 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004204 self.write_file.write(self.write_msg)
4205 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004206 self.evt2.set()
4207 # Avoid cloding the socket before the server test has finished,
4208 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4209 self.serv_finished.wait(5.0)
4210
4211 def testWriteNonBlocking(self):
4212 self.cli_finished.wait(5.0)
4213 # The client thread can't skip directly - the SkipTest exception
4214 # would appear as a failure.
4215 if self.serv_skipped:
4216 self.skipTest(self.serv_skipped)
4217
4218 def _testWriteNonBlocking(self):
4219 self.serv_skipped = None
4220 self.serv_conn.setblocking(False)
4221 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004222 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004223 LIMIT = 10
4224 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004225 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004226 self.assertGreater(n, 0)
4227 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004228 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004229 if n is None:
4230 # Succeeded
4231 break
4232 self.assertGreater(n, 0)
4233 else:
4234 # Let us know that this test didn't manage to establish
4235 # the expected conditions. This is not a failure in itself but,
4236 # if it happens repeatedly, the test should be fixed.
4237 self.serv_skipped = "failed to saturate the socket buffer"
4238
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004239
Guido van Rossum8c943832002-08-08 01:00:28 +00004240class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4241
4242 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4243
4244
4245class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4246
4247 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004248
Thomas Woutersb2137042007-02-01 18:02:27 +00004249
Antoine Pitrou834bd812010-10-13 16:17:14 +00004250class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4251 """Tests for socket.makefile() in text mode (rather than binary)"""
4252
4253 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004254 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004255 write_mode = 'wb'
4256 write_msg = MSG
4257 newline = ''
4258
4259
4260class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4261 """Tests for socket.makefile() in text mode (rather than binary)"""
4262
4263 read_mode = 'rb'
4264 read_msg = MSG
4265 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004266 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004267 newline = ''
4268
4269
4270class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4271 """Tests for socket.makefile() in text mode (rather than binary)"""
4272
4273 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004274 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004275 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004276 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004277 newline = ''
4278
4279
Guido van Rossumd8faa362007-04-27 19:54:29 +00004280class NetworkConnectionTest(object):
4281 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004282
Guido van Rossumd8faa362007-04-27 19:54:29 +00004283 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004284 # We're inherited below by BasicTCPTest2, which also inherits
4285 # BasicTCPTest, which defines self.port referenced below.
4286 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004287 self.serv_conn = self.cli
4288
4289class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4290 """Tests that NetworkConnection does not break existing TCP functionality.
4291 """
4292
4293class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004294
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004295 class MockSocket(socket.socket):
4296 def connect(self, *args):
4297 raise socket.timeout('timed out')
4298
4299 @contextlib.contextmanager
4300 def mocked_socket_module(self):
4301 """Return a socket which times out on connect"""
4302 old_socket = socket.socket
4303 socket.socket = self.MockSocket
4304 try:
4305 yield
4306 finally:
4307 socket.socket = old_socket
4308
4309 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004310 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004311 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004312 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004313 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004314 cli.connect((HOST, port))
4315 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4316
4317 def test_create_connection(self):
4318 # Issue #9792: errors raised by create_connection() should have
4319 # a proper errno attribute.
4320 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004321 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004322 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004323
4324 # Issue #16257: create_connection() calls getaddrinfo() against
4325 # 'localhost'. This may result in an IPV6 addr being returned
4326 # as well as an IPV4 one:
4327 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4328 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4329 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4330 #
4331 # create_connection() enumerates through all the addresses returned
4332 # and if it doesn't successfully bind to any of them, it propagates
4333 # the last exception it encountered.
4334 #
4335 # On Solaris, ENETUNREACH is returned in this circumstance instead
4336 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4337 # expected errnos.
4338 expected_errnos = [ errno.ECONNREFUSED, ]
4339 if hasattr(errno, 'ENETUNREACH'):
4340 expected_errnos.append(errno.ENETUNREACH)
4341
4342 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004343
4344 def test_create_connection_timeout(self):
4345 # Issue #9792: create_connection() should not recast timeout errors
4346 # as generic socket errors.
4347 with self.mocked_socket_module():
4348 with self.assertRaises(socket.timeout):
4349 socket.create_connection((HOST, 1234))
4350
Guido van Rossumd8faa362007-04-27 19:54:29 +00004351
Victor Stinner45df8202010-04-28 22:31:17 +00004352@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004353class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4354
4355 def __init__(self, methodName='runTest'):
4356 SocketTCPTest.__init__(self, methodName=methodName)
4357 ThreadableTest.__init__(self)
4358
4359 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004360 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004361
4362 def clientTearDown(self):
4363 self.cli.close()
4364 self.cli = None
4365 ThreadableTest.clientTearDown(self)
4366
4367 def _justAccept(self):
4368 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004369 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004370
4371 testFamily = _justAccept
4372 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004373 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004374 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004375 self.assertEqual(self.cli.family, 2)
4376
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004377 testSourceAddress = _justAccept
4378 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004379 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4380 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004381 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004382 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004383 # The port number being used is sufficient to show that the bind()
4384 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004385
Guido van Rossumd8faa362007-04-27 19:54:29 +00004386 testTimeoutDefault = _justAccept
4387 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004388 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004389 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004390 socket.setdefaulttimeout(42)
4391 try:
4392 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004393 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004394 finally:
4395 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004396 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004397
4398 testTimeoutNone = _justAccept
4399 def _testTimeoutNone(self):
4400 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004401 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004402 socket.setdefaulttimeout(30)
4403 try:
4404 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004405 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004406 finally:
4407 socket.setdefaulttimeout(None)
4408 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004409
4410 testTimeoutValueNamed = _justAccept
4411 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004412 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004413 self.assertEqual(self.cli.gettimeout(), 30)
4414
4415 testTimeoutValueNonamed = _justAccept
4416 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004417 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004418 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004419 self.assertEqual(self.cli.gettimeout(), 30)
4420
Victor Stinner45df8202010-04-28 22:31:17 +00004421@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004422class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4423
4424 def __init__(self, methodName='runTest'):
4425 SocketTCPTest.__init__(self, methodName=methodName)
4426 ThreadableTest.__init__(self)
4427
4428 def clientSetUp(self):
4429 pass
4430
4431 def clientTearDown(self):
4432 self.cli.close()
4433 self.cli = None
4434 ThreadableTest.clientTearDown(self)
4435
4436 def testInsideTimeout(self):
4437 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004438 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004439 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004440 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004441 testOutsideTimeout = testInsideTimeout
4442
4443 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004444 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004445 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004446 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004447
4448 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004449 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004450 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004451
4452
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004453class TCPTimeoutTest(SocketTCPTest):
4454
4455 def testTCPTimeout(self):
4456 def raise_timeout(*args, **kwargs):
4457 self.serv.settimeout(1.0)
4458 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004459 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004460 "Error generating a timeout exception (TCP)")
4461
4462 def testTimeoutZero(self):
4463 ok = False
4464 try:
4465 self.serv.settimeout(0.0)
4466 foo = self.serv.accept()
4467 except socket.timeout:
4468 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004469 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004470 ok = True
4471 except:
4472 self.fail("caught unexpected exception (TCP)")
4473 if not ok:
4474 self.fail("accept() returned success when we did not expect it")
4475
Serhiy Storchaka43767632013-11-03 21:31:38 +02004476 @unittest.skipUnless(hasattr(signal, 'alarm'),
4477 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004478 def testInterruptedTimeout(self):
4479 # XXX I don't know how to do this test on MSWindows or any other
4480 # plaform that doesn't support signal.alarm() or os.kill(), though
4481 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004482 self.serv.settimeout(5.0) # must be longer than alarm
4483 class Alarm(Exception):
4484 pass
4485 def alarm_handler(signal, frame):
4486 raise Alarm
4487 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4488 try:
4489 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4490 try:
4491 foo = self.serv.accept()
4492 except socket.timeout:
4493 self.fail("caught timeout instead of Alarm")
4494 except Alarm:
4495 pass
4496 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004497 self.fail("caught other exception instead of Alarm:"
4498 " %s(%s):\n%s" %
4499 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004500 else:
4501 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004502 finally:
4503 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004504 except Alarm:
4505 self.fail("got Alarm in wrong place")
4506 finally:
4507 # no alarm can be pending. Safe to restore old handler.
4508 signal.signal(signal.SIGALRM, old_alarm)
4509
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004510class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004511
4512 def testUDPTimeout(self):
4513 def raise_timeout(*args, **kwargs):
4514 self.serv.settimeout(1.0)
4515 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004516 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004517 "Error generating a timeout exception (UDP)")
4518
4519 def testTimeoutZero(self):
4520 ok = False
4521 try:
4522 self.serv.settimeout(0.0)
4523 foo = self.serv.recv(1024)
4524 except socket.timeout:
4525 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004526 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004527 ok = True
4528 except:
4529 self.fail("caught unexpected exception (UDP)")
4530 if not ok:
4531 self.fail("recv() returned success when we did not expect it")
4532
4533class TestExceptions(unittest.TestCase):
4534
4535 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004536 self.assertTrue(issubclass(OSError, Exception))
4537 self.assertTrue(issubclass(socket.herror, OSError))
4538 self.assertTrue(issubclass(socket.gaierror, OSError))
4539 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004540
Serhiy Storchaka43767632013-11-03 21:31:38 +02004541@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004542class TestLinuxAbstractNamespace(unittest.TestCase):
4543
4544 UNIX_PATH_MAX = 108
4545
4546 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004547 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004548 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4549 s1.bind(address)
4550 s1.listen(1)
4551 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4552 s2.connect(s1.getsockname())
4553 with s1.accept()[0] as s3:
4554 self.assertEqual(s1.getsockname(), address)
4555 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004556
4557 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004558 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004559 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4560 s.bind(address)
4561 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004562
4563 def testNameOverflow(self):
4564 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004565 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004566 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004567
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004568 def testStrName(self):
4569 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004570 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4571 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004572 s.bind("\x00python\x00test\x00")
4573 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004574 finally:
4575 s.close()
4576
Serhiy Storchaka43767632013-11-03 21:31:38 +02004577@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004578class TestUnixDomain(unittest.TestCase):
4579
4580 def setUp(self):
4581 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4582
4583 def tearDown(self):
4584 self.sock.close()
4585
4586 def encoded(self, path):
4587 # Return the given path encoded in the file system encoding,
4588 # or skip the test if this is not possible.
4589 try:
4590 return os.fsencode(path)
4591 except UnicodeEncodeError:
4592 self.skipTest(
4593 "Pathname {0!a} cannot be represented in file "
4594 "system encoding {1!r}".format(
4595 path, sys.getfilesystemencoding()))
4596
Antoine Pitrou16374872011-12-16 15:04:12 +01004597 def bind(self, sock, path):
4598 # Bind the socket
4599 try:
4600 sock.bind(path)
4601 except OSError as e:
4602 if str(e) == "AF_UNIX path too long":
4603 self.skipTest(
4604 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4605 .format(path))
4606 else:
4607 raise
4608
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004609 def testStrAddr(self):
4610 # Test binding to and retrieving a normal string pathname.
4611 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004612 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004613 self.addCleanup(support.unlink, path)
4614 self.assertEqual(self.sock.getsockname(), path)
4615
4616 def testBytesAddr(self):
4617 # Test binding to a bytes pathname.
4618 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004619 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004620 self.addCleanup(support.unlink, path)
4621 self.assertEqual(self.sock.getsockname(), path)
4622
4623 def testSurrogateescapeBind(self):
4624 # Test binding to a valid non-ASCII pathname, with the
4625 # non-ASCII bytes supplied using surrogateescape encoding.
4626 path = os.path.abspath(support.TESTFN_UNICODE)
4627 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004628 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004629 self.addCleanup(support.unlink, path)
4630 self.assertEqual(self.sock.getsockname(), path)
4631
4632 def testUnencodableAddr(self):
4633 # Test binding to a pathname that cannot be encoded in the
4634 # file system encoding.
4635 if support.TESTFN_UNENCODABLE is None:
4636 self.skipTest("No unencodable filename available")
4637 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004638 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004639 self.addCleanup(support.unlink, path)
4640 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004641
Victor Stinner45df8202010-04-28 22:31:17 +00004642@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004643class BufferIOTest(SocketConnectedTest):
4644 """
4645 Test the buffer versions of socket.recv() and socket.send().
4646 """
4647 def __init__(self, methodName='runTest'):
4648 SocketConnectedTest.__init__(self, methodName=methodName)
4649
Antoine Pitrou25480782010-03-17 22:50:28 +00004650 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004651 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004652 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004653 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004654 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004655 self.assertEqual(msg, MSG)
4656
Antoine Pitrou25480782010-03-17 22:50:28 +00004657 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004658 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004659 self.serv_conn.send(buf)
4660
Antoine Pitrou25480782010-03-17 22:50:28 +00004661 def testRecvIntoBytearray(self):
4662 buf = bytearray(1024)
4663 nbytes = self.cli_conn.recv_into(buf)
4664 self.assertEqual(nbytes, len(MSG))
4665 msg = buf[:len(MSG)]
4666 self.assertEqual(msg, MSG)
4667
4668 _testRecvIntoBytearray = _testRecvIntoArray
4669
4670 def testRecvIntoMemoryview(self):
4671 buf = bytearray(1024)
4672 nbytes = self.cli_conn.recv_into(memoryview(buf))
4673 self.assertEqual(nbytes, len(MSG))
4674 msg = buf[:len(MSG)]
4675 self.assertEqual(msg, MSG)
4676
4677 _testRecvIntoMemoryview = _testRecvIntoArray
4678
4679 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004680 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004681 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004682 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004683 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004684 self.assertEqual(msg, MSG)
4685
Antoine Pitrou25480782010-03-17 22:50:28 +00004686 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004687 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004688 self.serv_conn.send(buf)
4689
Antoine Pitrou25480782010-03-17 22:50:28 +00004690 def testRecvFromIntoBytearray(self):
4691 buf = bytearray(1024)
4692 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4693 self.assertEqual(nbytes, len(MSG))
4694 msg = buf[:len(MSG)]
4695 self.assertEqual(msg, MSG)
4696
4697 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4698
4699 def testRecvFromIntoMemoryview(self):
4700 buf = bytearray(1024)
4701 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4702 self.assertEqual(nbytes, len(MSG))
4703 msg = buf[:len(MSG)]
4704 self.assertEqual(msg, MSG)
4705
4706 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4707
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004708 def testRecvFromIntoSmallBuffer(self):
4709 # See issue #20246.
4710 buf = bytearray(8)
4711 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4712
4713 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004714 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004715
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004716 def testRecvFromIntoEmptyBuffer(self):
4717 buf = bytearray()
4718 self.cli_conn.recvfrom_into(buf)
4719 self.cli_conn.recvfrom_into(buf, 0)
4720
4721 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4722
Christian Heimes043d6f62008-01-07 17:19:16 +00004723
4724TIPC_STYPE = 2000
4725TIPC_LOWER = 200
4726TIPC_UPPER = 210
4727
4728def isTipcAvailable():
4729 """Check if the TIPC module is loaded
4730
4731 The TIPC module is not loaded automatically on Ubuntu and probably
4732 other Linux distros.
4733 """
4734 if not hasattr(socket, "AF_TIPC"):
4735 return False
4736 if not os.path.isfile("/proc/modules"):
4737 return False
4738 with open("/proc/modules") as f:
4739 for line in f:
4740 if line.startswith("tipc "):
4741 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004742 return False
4743
Serhiy Storchaka43767632013-11-03 21:31:38 +02004744@unittest.skipUnless(isTipcAvailable(),
4745 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004746class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004747 def testRDM(self):
4748 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4749 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004750 self.addCleanup(srv.close)
4751 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004752
4753 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4754 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4755 TIPC_LOWER, TIPC_UPPER)
4756 srv.bind(srvaddr)
4757
4758 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4759 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4760 cli.sendto(MSG, sendaddr)
4761
4762 msg, recvaddr = srv.recvfrom(1024)
4763
4764 self.assertEqual(cli.getsockname(), recvaddr)
4765 self.assertEqual(msg, MSG)
4766
4767
Serhiy Storchaka43767632013-11-03 21:31:38 +02004768@unittest.skipUnless(isTipcAvailable(),
4769 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004770class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004771 def __init__(self, methodName = 'runTest'):
4772 unittest.TestCase.__init__(self, methodName = methodName)
4773 ThreadableTest.__init__(self)
4774
4775 def setUp(self):
4776 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004777 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004778 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4779 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4780 TIPC_LOWER, TIPC_UPPER)
4781 self.srv.bind(srvaddr)
4782 self.srv.listen(5)
4783 self.serverExplicitReady()
4784 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004785 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004786
4787 def clientSetUp(self):
4788 # The is a hittable race between serverExplicitReady() and the
4789 # accept() call; sleep a little while to avoid it, otherwise
4790 # we could get an exception
4791 time.sleep(0.1)
4792 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004793 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004794 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4795 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4796 self.cli.connect(addr)
4797 self.cliaddr = self.cli.getsockname()
4798
4799 def testStream(self):
4800 msg = self.conn.recv(1024)
4801 self.assertEqual(msg, MSG)
4802 self.assertEqual(self.cliaddr, self.connaddr)
4803
4804 def _testStream(self):
4805 self.cli.send(MSG)
4806 self.cli.close()
4807
4808
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004809@unittest.skipUnless(thread, 'Threading required for this test.')
4810class ContextManagersTest(ThreadedTCPSocketTest):
4811
4812 def _testSocketClass(self):
4813 # base test
4814 with socket.socket() as sock:
4815 self.assertFalse(sock._closed)
4816 self.assertTrue(sock._closed)
4817 # close inside with block
4818 with socket.socket() as sock:
4819 sock.close()
4820 self.assertTrue(sock._closed)
4821 # exception inside with block
4822 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004823 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004824 self.assertTrue(sock._closed)
4825
4826 def testCreateConnectionBase(self):
4827 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004828 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004829 data = conn.recv(1024)
4830 conn.sendall(data)
4831
4832 def _testCreateConnectionBase(self):
4833 address = self.serv.getsockname()
4834 with socket.create_connection(address) as sock:
4835 self.assertFalse(sock._closed)
4836 sock.sendall(b'foo')
4837 self.assertEqual(sock.recv(1024), b'foo')
4838 self.assertTrue(sock._closed)
4839
4840 def testCreateConnectionClose(self):
4841 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004842 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004843 data = conn.recv(1024)
4844 conn.sendall(data)
4845
4846 def _testCreateConnectionClose(self):
4847 address = self.serv.getsockname()
4848 with socket.create_connection(address) as sock:
4849 sock.close()
4850 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004851 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004852
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004853
Victor Stinnerdaf45552013-08-28 00:53:59 +02004854class InheritanceTest(unittest.TestCase):
4855 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4856 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004857 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004858 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004859 with socket.socket(socket.AF_INET,
4860 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4861 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004862 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004863
4864 def test_default_inheritable(self):
4865 sock = socket.socket()
4866 with sock:
4867 self.assertEqual(sock.get_inheritable(), False)
4868
4869 def test_dup(self):
4870 sock = socket.socket()
4871 with sock:
4872 newsock = sock.dup()
4873 sock.close()
4874 with newsock:
4875 self.assertEqual(newsock.get_inheritable(), False)
4876
4877 def test_set_inheritable(self):
4878 sock = socket.socket()
4879 with sock:
4880 sock.set_inheritable(True)
4881 self.assertEqual(sock.get_inheritable(), True)
4882
4883 sock.set_inheritable(False)
4884 self.assertEqual(sock.get_inheritable(), False)
4885
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004886 @unittest.skipIf(fcntl is None, "need fcntl")
4887 def test_get_inheritable_cloexec(self):
4888 sock = socket.socket()
4889 with sock:
4890 fd = sock.fileno()
4891 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004892
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004893 # clear FD_CLOEXEC flag
4894 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4895 flags &= ~fcntl.FD_CLOEXEC
4896 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004897
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004898 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004899
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004900 @unittest.skipIf(fcntl is None, "need fcntl")
4901 def test_set_inheritable_cloexec(self):
4902 sock = socket.socket()
4903 with sock:
4904 fd = sock.fileno()
4905 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4906 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004907
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004908 sock.set_inheritable(True)
4909 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4910 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004911
4912
Victor Stinnerdaf45552013-08-28 00:53:59 +02004913 @unittest.skipUnless(hasattr(socket, "socketpair"),
4914 "need socket.socketpair()")
4915 def test_socketpair(self):
4916 s1, s2 = socket.socketpair()
4917 self.addCleanup(s1.close)
4918 self.addCleanup(s2.close)
4919 self.assertEqual(s1.get_inheritable(), False)
4920 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004921
4922
4923@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4924 "SOCK_NONBLOCK not defined")
4925class NonblockConstantTest(unittest.TestCase):
4926 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4927 if nonblock:
4928 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4929 self.assertEqual(s.gettimeout(), timeout)
4930 else:
4931 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4932 self.assertEqual(s.gettimeout(), None)
4933
Charles-François Natali239bb962011-06-03 12:55:15 +02004934 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004935 def test_SOCK_NONBLOCK(self):
4936 # a lot of it seems silly and redundant, but I wanted to test that
4937 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004938 with socket.socket(socket.AF_INET,
4939 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4940 self.checkNonblock(s)
4941 s.setblocking(1)
4942 self.checkNonblock(s, False)
4943 s.setblocking(0)
4944 self.checkNonblock(s)
4945 s.settimeout(None)
4946 self.checkNonblock(s, False)
4947 s.settimeout(2.0)
4948 self.checkNonblock(s, timeout=2.0)
4949 s.setblocking(1)
4950 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004951 # defaulttimeout
4952 t = socket.getdefaulttimeout()
4953 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004954 with socket.socket() as s:
4955 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004956 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004957 with socket.socket() as s:
4958 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004959 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004960 with socket.socket() as s:
4961 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004962 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004963 with socket.socket() as s:
4964 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004965 socket.setdefaulttimeout(t)
4966
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004967
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004968@unittest.skipUnless(os.name == "nt", "Windows specific")
4969@unittest.skipUnless(multiprocessing, "need multiprocessing")
4970class TestSocketSharing(SocketTCPTest):
4971 # This must be classmethod and not staticmethod or multiprocessing
4972 # won't be able to bootstrap it.
4973 @classmethod
4974 def remoteProcessServer(cls, q):
4975 # Recreate socket from shared data
4976 sdata = q.get()
4977 message = q.get()
4978
4979 s = socket.fromshare(sdata)
4980 s2, c = s.accept()
4981
4982 # Send the message
4983 s2.sendall(message)
4984 s2.close()
4985 s.close()
4986
4987 def testShare(self):
4988 # Transfer the listening server socket to another process
4989 # and service it from there.
4990
4991 # Create process:
4992 q = multiprocessing.Queue()
4993 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4994 p.start()
4995
4996 # Get the shared socket data
4997 data = self.serv.share(p.pid)
4998
4999 # Pass the shared socket to the other process
5000 addr = self.serv.getsockname()
5001 self.serv.close()
5002 q.put(data)
5003
5004 # The data that the server will send us
5005 message = b"slapmahfro"
5006 q.put(message)
5007
5008 # Connect
5009 s = socket.create_connection(addr)
5010 # listen for the data
5011 m = []
5012 while True:
5013 data = s.recv(100)
5014 if not data:
5015 break
5016 m.append(data)
5017 s.close()
5018 received = b"".join(m)
5019 self.assertEqual(received, message)
5020 p.join()
5021
5022 def testShareLength(self):
5023 data = self.serv.share(os.getpid())
5024 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5025 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5026
5027 def compareSockets(self, org, other):
5028 # socket sharing is expected to work only for blocking socket
5029 # since the internal python timout value isn't transfered.
5030 self.assertEqual(org.gettimeout(), None)
5031 self.assertEqual(org.gettimeout(), other.gettimeout())
5032
5033 self.assertEqual(org.family, other.family)
5034 self.assertEqual(org.type, other.type)
5035 # If the user specified "0" for proto, then
5036 # internally windows will have picked the correct value.
5037 # Python introspection on the socket however will still return
5038 # 0. For the shared socket, the python value is recreated
5039 # from the actual value, so it may not compare correctly.
5040 if org.proto != 0:
5041 self.assertEqual(org.proto, other.proto)
5042
5043 def testShareLocal(self):
5044 data = self.serv.share(os.getpid())
5045 s = socket.fromshare(data)
5046 try:
5047 self.compareSockets(self.serv, s)
5048 finally:
5049 s.close()
5050
5051 def testTypes(self):
5052 families = [socket.AF_INET, socket.AF_INET6]
5053 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5054 for f in families:
5055 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005056 try:
5057 source = socket.socket(f, t)
5058 except OSError:
5059 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005060 try:
5061 data = source.share(os.getpid())
5062 shared = socket.fromshare(data)
5063 try:
5064 self.compareSockets(source, shared)
5065 finally:
5066 shared.close()
5067 finally:
5068 source.close()
5069
5070
Guido van Rossumb995eb72002-07-31 16:08:40 +00005071def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005072 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005073 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005074
5075 tests.extend([
5076 NonBlockingTCPTests,
5077 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005078 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005079 UnbufferedFileObjectClassTestCase,
5080 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005081 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005082 UnicodeReadFileObjectClassTestCase,
5083 UnicodeWriteFileObjectClassTestCase,
5084 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005085 NetworkConnectionNoServer,
5086 NetworkConnectionAttributesTest,
5087 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005088 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005089 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005090 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005091 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005092 tests.append(BasicSocketPairTest)
5093 tests.append(TestUnixDomain)
5094 tests.append(TestLinuxAbstractNamespace)
5095 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005096 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005097 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005098 tests.extend([
5099 CmsgMacroTests,
5100 SendmsgUDPTest,
5101 RecvmsgUDPTest,
5102 RecvmsgIntoUDPTest,
5103 SendmsgUDP6Test,
5104 RecvmsgUDP6Test,
5105 RecvmsgRFC3542AncillaryUDP6Test,
5106 RecvmsgIntoRFC3542AncillaryUDP6Test,
5107 RecvmsgIntoUDP6Test,
5108 SendmsgTCPTest,
5109 RecvmsgTCPTest,
5110 RecvmsgIntoTCPTest,
5111 SendmsgSCTPStreamTest,
5112 RecvmsgSCTPStreamTest,
5113 RecvmsgIntoSCTPStreamTest,
5114 SendmsgUnixStreamTest,
5115 RecvmsgUnixStreamTest,
5116 RecvmsgIntoUnixStreamTest,
5117 RecvmsgSCMRightsStreamTest,
5118 RecvmsgIntoSCMRightsStreamTest,
5119 # These are slow when setitimer() is not available
5120 InterruptedRecvTimeoutTest,
5121 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005122 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005123 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005124
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005125 thread_info = support.threading_setup()
5126 support.run_unittest(*tests)
5127 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005128
5129if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005130 test_main()