blob: aed10a70ac1521e645dc3b8a52c0a093d8bc489f [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.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200870 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200871 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
Ned Deilyb24f4812014-02-13 22:50:42 -08001237 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001238 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001239 try:
1240 # The arguments here are undefined and the call may succeed
1241 # or fail. All we care here is that it doesn't segfault.
1242 socket.getaddrinfo("localhost", None, 0, 0, 0,
1243 socket.AI_NUMERICSERV)
1244 except socket.gaierror:
1245 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001246
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001247 def test_getnameinfo(self):
1248 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001249 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001250
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001251 @unittest.skipUnless(support.is_resource_enabled('network'),
1252 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001253 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001254 # Check for internet access before running test (issue #12804).
1255 try:
1256 socket.gethostbyname('python.org')
1257 except socket.gaierror as e:
1258 if e.errno == socket.EAI_NODATA:
1259 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001260 # these should all be successful
1261 socket.gethostbyname('испытание.python.org')
1262 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001263 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1264 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1265 # have a reverse entry yet
1266 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001267
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001268 def check_sendall_interrupted(self, with_timeout):
1269 # socketpair() is not stricly required, but it makes things easier.
1270 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1271 self.skipTest("signal.alarm and socket.socketpair required for this test")
1272 # Our signal handlers clobber the C errno by calling a math function
1273 # with an invalid domain value.
1274 def ok_handler(*args):
1275 self.assertRaises(ValueError, math.acosh, 0)
1276 def raising_handler(*args):
1277 self.assertRaises(ValueError, math.acosh, 0)
1278 1 // 0
1279 c, s = socket.socketpair()
1280 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1281 try:
1282 if with_timeout:
1283 # Just above the one second minimum for signal.alarm
1284 c.settimeout(1.5)
1285 with self.assertRaises(ZeroDivisionError):
1286 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001287 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001288 if with_timeout:
1289 signal.signal(signal.SIGALRM, ok_handler)
1290 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001291 self.assertRaises(socket.timeout, c.sendall,
1292 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001293 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001294 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001295 signal.signal(signal.SIGALRM, old_alarm)
1296 c.close()
1297 s.close()
1298
1299 def test_sendall_interrupted(self):
1300 self.check_sendall_interrupted(False)
1301
1302 def test_sendall_interrupted_with_timeout(self):
1303 self.check_sendall_interrupted(True)
1304
Antoine Pitroue033e062010-10-29 10:38:18 +00001305 def test_dealloc_warn(self):
1306 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1307 r = repr(sock)
1308 with self.assertWarns(ResourceWarning) as cm:
1309 sock = None
1310 support.gc_collect()
1311 self.assertIn(r, str(cm.warning.args[0]))
1312 # An open socket file object gets dereferenced after the socket
1313 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1314 f = sock.makefile('rb')
1315 r = repr(sock)
1316 sock = None
1317 support.gc_collect()
1318 with self.assertWarns(ResourceWarning):
1319 f = None
1320 support.gc_collect()
1321
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001322 def test_name_closed_socketio(self):
1323 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1324 fp = sock.makefile("rb")
1325 fp.close()
1326 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1327
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001328 def test_unusable_closed_socketio(self):
1329 with socket.socket() as sock:
1330 fp = sock.makefile("rb", buffering=0)
1331 self.assertTrue(fp.readable())
1332 self.assertFalse(fp.writable())
1333 self.assertFalse(fp.seekable())
1334 fp.close()
1335 self.assertRaises(ValueError, fp.readable)
1336 self.assertRaises(ValueError, fp.writable)
1337 self.assertRaises(ValueError, fp.seekable)
1338
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001339 def test_pickle(self):
1340 sock = socket.socket()
1341 with sock:
1342 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1343 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1344
Serhiy Storchaka78980432013-01-15 01:12:17 +02001345 def test_listen_backlog(self):
1346 for backlog in 0, -1:
1347 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1348 srv.bind((HOST, 0))
1349 srv.listen(backlog)
1350 srv.close()
1351
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001352 @support.cpython_only
1353 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001354 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001355 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001356 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1357 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001358 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001359 srv.close()
1360
Charles-François Natali42663332012-01-02 15:57:30 +01001361 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001362 def test_flowinfo(self):
1363 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001364 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001365 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001366 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001367
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001368 def test_str_for_enums(self):
1369 # Make sure that the AF_* and SOCK_* constants have enum-like string
1370 # reprs.
1371 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1372 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
1373 self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM')
1374
1375 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1376 def test_uknown_socket_family_repr(self):
1377 # Test that when created with a family that's not one of the known
1378 # AF_*/SOCK_* constants, socket.family just returns the number.
1379 #
1380 # To do this we fool socket.socket into believing it already has an
1381 # open fd because on this path it doesn't actually verify the family and
1382 # type and populates the socket object.
1383 #
1384 # On Windows this trick won't work, so the test is skipped.
1385 fd, _ = tempfile.mkstemp()
1386 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1387 self.assertEqual(s.family, 42424)
1388 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001389
Charles-François Natali47413c12011-10-06 19:47:44 +02001390@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1391class BasicCANTest(unittest.TestCase):
1392
1393 def testCrucialConstants(self):
1394 socket.AF_CAN
1395 socket.PF_CAN
1396 socket.CAN_RAW
1397
Charles-François Natali773e42d2013-02-05 19:42:01 +01001398 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1399 'socket.CAN_BCM required for this test.')
1400 def testBCMConstants(self):
1401 socket.CAN_BCM
1402
1403 # opcodes
1404 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1405 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1406 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1407 socket.CAN_BCM_TX_SEND # send one CAN frame
1408 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1409 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1410 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1411 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1412 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1413 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1414 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1415 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1416
Charles-François Natali47413c12011-10-06 19:47:44 +02001417 def testCreateSocket(self):
1418 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1419 pass
1420
Charles-François Natali773e42d2013-02-05 19:42:01 +01001421 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1422 'socket.CAN_BCM required for this test.')
1423 def testCreateBCMSocket(self):
1424 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1425 pass
1426
Charles-François Natali47413c12011-10-06 19:47:44 +02001427 def testBindAny(self):
1428 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1429 s.bind(('', ))
1430
1431 def testTooLongInterfaceName(self):
1432 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1433 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001434 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001435 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001436
1437 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1438 'socket.CAN_RAW_LOOPBACK required for this test.')
1439 def testLoopback(self):
1440 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1441 for loopback in (0, 1):
1442 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1443 loopback)
1444 self.assertEqual(loopback,
1445 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1446
1447 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1448 'socket.CAN_RAW_FILTER required for this test.')
1449 def testFilter(self):
1450 can_id, can_mask = 0x200, 0x700
1451 can_filter = struct.pack("=II", can_id, can_mask)
1452 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1453 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1454 self.assertEqual(can_filter,
1455 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1456
1457
1458@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001459class CANTest(ThreadedCANSocketTest):
1460
Charles-François Natali47413c12011-10-06 19:47:44 +02001461 def __init__(self, methodName='runTest'):
1462 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1463
1464 @classmethod
1465 def build_can_frame(cls, can_id, data):
1466 """Build a CAN frame."""
1467 can_dlc = len(data)
1468 data = data.ljust(8, b'\x00')
1469 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1470
1471 @classmethod
1472 def dissect_can_frame(cls, frame):
1473 """Dissect a CAN frame."""
1474 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1475 return (can_id, can_dlc, data[:can_dlc])
1476
1477 def testSendFrame(self):
1478 cf, addr = self.s.recvfrom(self.bufsize)
1479 self.assertEqual(self.cf, cf)
1480 self.assertEqual(addr[0], self.interface)
1481 self.assertEqual(addr[1], socket.AF_CAN)
1482
1483 def _testSendFrame(self):
1484 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1485 self.cli.send(self.cf)
1486
1487 def testSendMaxFrame(self):
1488 cf, addr = self.s.recvfrom(self.bufsize)
1489 self.assertEqual(self.cf, cf)
1490
1491 def _testSendMaxFrame(self):
1492 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1493 self.cli.send(self.cf)
1494
1495 def testSendMultiFrames(self):
1496 cf, addr = self.s.recvfrom(self.bufsize)
1497 self.assertEqual(self.cf1, cf)
1498
1499 cf, addr = self.s.recvfrom(self.bufsize)
1500 self.assertEqual(self.cf2, cf)
1501
1502 def _testSendMultiFrames(self):
1503 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1504 self.cli.send(self.cf1)
1505
1506 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1507 self.cli.send(self.cf2)
1508
Charles-François Natali773e42d2013-02-05 19:42:01 +01001509 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1510 'socket.CAN_BCM required for this test.')
1511 def _testBCM(self):
1512 cf, addr = self.cli.recvfrom(self.bufsize)
1513 self.assertEqual(self.cf, cf)
1514 can_id, can_dlc, data = self.dissect_can_frame(cf)
1515 self.assertEqual(self.can_id, can_id)
1516 self.assertEqual(self.data, data)
1517
1518 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1519 'socket.CAN_BCM required for this test.')
1520 def testBCM(self):
1521 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1522 self.addCleanup(bcm.close)
1523 bcm.connect((self.interface,))
1524 self.can_id = 0x123
1525 self.data = bytes([0xc0, 0xff, 0xee])
1526 self.cf = self.build_can_frame(self.can_id, self.data)
1527 opcode = socket.CAN_BCM_TX_SEND
1528 flags = 0
1529 count = 0
1530 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1531 bcm_can_id = 0x0222
1532 nframes = 1
1533 assert len(self.cf) == 16
1534 header = struct.pack(self.bcm_cmd_msg_fmt,
1535 opcode,
1536 flags,
1537 count,
1538 ival1_seconds,
1539 ival1_usec,
1540 ival2_seconds,
1541 ival2_usec,
1542 bcm_can_id,
1543 nframes,
1544 )
1545 header_plus_frame = header + self.cf
1546 bytes_sent = bcm.send(header_plus_frame)
1547 self.assertEqual(bytes_sent, len(header_plus_frame))
1548
Charles-François Natali47413c12011-10-06 19:47:44 +02001549
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001550@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1551class BasicRDSTest(unittest.TestCase):
1552
1553 def testCrucialConstants(self):
1554 socket.AF_RDS
1555 socket.PF_RDS
1556
1557 def testCreateSocket(self):
1558 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1559 pass
1560
1561 def testSocketBufferSize(self):
1562 bufsize = 16384
1563 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1564 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1565 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1566
1567
1568@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1569@unittest.skipUnless(thread, 'Threading required for this test.')
1570class RDSTest(ThreadedRDSSocketTest):
1571
1572 def __init__(self, methodName='runTest'):
1573 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1574
Charles-François Natali240c55f2011-11-10 20:33:36 +01001575 def setUp(self):
1576 super().setUp()
1577 self.evt = threading.Event()
1578
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001579 def testSendAndRecv(self):
1580 data, addr = self.serv.recvfrom(self.bufsize)
1581 self.assertEqual(self.data, data)
1582 self.assertEqual(self.cli_addr, addr)
1583
1584 def _testSendAndRecv(self):
1585 self.data = b'spam'
1586 self.cli.sendto(self.data, 0, (HOST, self.port))
1587
1588 def testPeek(self):
1589 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1590 self.assertEqual(self.data, data)
1591 data, addr = self.serv.recvfrom(self.bufsize)
1592 self.assertEqual(self.data, data)
1593
1594 def _testPeek(self):
1595 self.data = b'spam'
1596 self.cli.sendto(self.data, 0, (HOST, self.port))
1597
1598 @requireAttrs(socket.socket, 'recvmsg')
1599 def testSendAndRecvMsg(self):
1600 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1601 self.assertEqual(self.data, data)
1602
1603 @requireAttrs(socket.socket, 'sendmsg')
1604 def _testSendAndRecvMsg(self):
1605 self.data = b'hello ' * 10
1606 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1607
1608 def testSendAndRecvMulti(self):
1609 data, addr = self.serv.recvfrom(self.bufsize)
1610 self.assertEqual(self.data1, data)
1611
1612 data, addr = self.serv.recvfrom(self.bufsize)
1613 self.assertEqual(self.data2, data)
1614
1615 def _testSendAndRecvMulti(self):
1616 self.data1 = b'bacon'
1617 self.cli.sendto(self.data1, 0, (HOST, self.port))
1618
1619 self.data2 = b'egg'
1620 self.cli.sendto(self.data2, 0, (HOST, self.port))
1621
1622 def testSelect(self):
1623 r, w, x = select.select([self.serv], [], [], 3.0)
1624 self.assertIn(self.serv, r)
1625 data, addr = self.serv.recvfrom(self.bufsize)
1626 self.assertEqual(self.data, data)
1627
1628 def _testSelect(self):
1629 self.data = b'select'
1630 self.cli.sendto(self.data, 0, (HOST, self.port))
1631
1632 def testCongestion(self):
1633 # wait until the sender is done
1634 self.evt.wait()
1635
1636 def _testCongestion(self):
1637 # test the behavior in case of congestion
1638 self.data = b'fill'
1639 self.cli.setblocking(False)
1640 try:
1641 # try to lower the receiver's socket buffer size
1642 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1643 except OSError:
1644 pass
1645 with self.assertRaises(OSError) as cm:
1646 try:
1647 # fill the receiver's socket buffer
1648 while True:
1649 self.cli.sendto(self.data, 0, (HOST, self.port))
1650 finally:
1651 # signal the receiver we're done
1652 self.evt.set()
1653 # sendto() should have failed with ENOBUFS
1654 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1655 # and we should have received a congestion notification through poll
1656 r, w, x = select.select([self.serv], [], [], 3.0)
1657 self.assertIn(self.serv, r)
1658
1659
Victor Stinner45df8202010-04-28 22:31:17 +00001660@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001661class BasicTCPTest(SocketConnectedTest):
1662
1663 def __init__(self, methodName='runTest'):
1664 SocketConnectedTest.__init__(self, methodName=methodName)
1665
1666 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001667 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001668 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001669 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001670
1671 def _testRecv(self):
1672 self.serv_conn.send(MSG)
1673
1674 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001675 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001676 seg1 = self.cli_conn.recv(len(MSG) - 3)
1677 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001678 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001679 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001680
1681 def _testOverFlowRecv(self):
1682 self.serv_conn.send(MSG)
1683
1684 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001685 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001686 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001687 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001688
1689 def _testRecvFrom(self):
1690 self.serv_conn.send(MSG)
1691
1692 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001693 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001694 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1695 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001696 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001697 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001698
1699 def _testOverFlowRecvFrom(self):
1700 self.serv_conn.send(MSG)
1701
1702 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001703 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001704 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001705 while 1:
1706 read = self.cli_conn.recv(1024)
1707 if not read:
1708 break
Guido van Rossume531e292002-08-08 20:28:34 +00001709 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001710 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001711
1712 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001713 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001714 self.serv_conn.sendall(big_chunk)
1715
1716 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001717 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001718 fd = self.cli_conn.fileno()
1719 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001720 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001721 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001722 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001723 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001724
1725 def _testFromFd(self):
1726 self.serv_conn.send(MSG)
1727
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001728 def testDup(self):
1729 # Testing dup()
1730 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001731 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001732 msg = sock.recv(1024)
1733 self.assertEqual(msg, MSG)
1734
1735 def _testDup(self):
1736 self.serv_conn.send(MSG)
1737
Guido van Rossum24e4af82002-06-12 19:18:08 +00001738 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001739 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001740 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001741 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001742 # wait for _testShutdown to finish: on OS X, when the server
1743 # closes the connection the client also becomes disconnected,
1744 # and the client's shutdown call will fail. (Issue #4397.)
1745 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001746
1747 def _testShutdown(self):
1748 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001749 self.serv_conn.shutdown(2)
1750
1751 testShutdown_overflow = support.cpython_only(testShutdown)
1752
1753 @support.cpython_only
1754 def _testShutdown_overflow(self):
1755 import _testcapi
1756 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001757 # Issue 15989
1758 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1759 _testcapi.INT_MAX + 1)
1760 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1761 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001762 self.serv_conn.shutdown(2)
1763
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001764 def testDetach(self):
1765 # Testing detach()
1766 fileno = self.cli_conn.fileno()
1767 f = self.cli_conn.detach()
1768 self.assertEqual(f, fileno)
1769 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001770 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001771 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001772 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001773 # ...but we can create another socket using the (still open)
1774 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001775 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001776 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001777 msg = sock.recv(1024)
1778 self.assertEqual(msg, MSG)
1779
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001780 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001781 self.serv_conn.send(MSG)
1782
Victor Stinner45df8202010-04-28 22:31:17 +00001783@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001784class BasicUDPTest(ThreadedUDPSocketTest):
1785
1786 def __init__(self, methodName='runTest'):
1787 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1788
1789 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001790 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001791 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001792 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001793
1794 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001795 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001796
Guido van Rossum1c938012002-06-12 21:17:20 +00001797 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001798 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001799 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001800 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001801
Guido van Rossum1c938012002-06-12 21:17:20 +00001802 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001803 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001804
Guido van Rossumd8faa362007-04-27 19:54:29 +00001805 def testRecvFromNegative(self):
1806 # Negative lengths passed to recvfrom should give ValueError.
1807 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1808
1809 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001810 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001811
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001812# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1813# same test code is used with different families and types of socket
1814# (e.g. stream, datagram), and tests using recvmsg() are repeated
1815# using recvmsg_into().
1816#
1817# The generic test classes such as SendmsgTests and
1818# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1819# supplied with sockets cli_sock and serv_sock representing the
1820# client's and the server's end of the connection respectively, and
1821# attributes cli_addr and serv_addr holding their (numeric where
1822# appropriate) addresses.
1823#
1824# The final concrete test classes combine these with subclasses of
1825# SocketTestBase which set up client and server sockets of a specific
1826# type, and with subclasses of SendrecvmsgBase such as
1827# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1828# sockets to cli_sock and serv_sock and override the methods and
1829# attributes of SendrecvmsgBase to fill in destination addresses if
1830# needed when sending, check for specific flags in msg_flags, etc.
1831#
1832# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1833# recvmsg_into().
1834
1835# XXX: like the other datagram (UDP) tests in this module, the code
1836# here assumes that datagram delivery on the local machine will be
1837# reliable.
1838
1839class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1840 # Base class for sendmsg()/recvmsg() tests.
1841
1842 # Time in seconds to wait before considering a test failed, or
1843 # None for no timeout. Not all tests actually set a timeout.
1844 fail_timeout = 3.0
1845
1846 def setUp(self):
1847 self.misc_event = threading.Event()
1848 super().setUp()
1849
1850 def sendToServer(self, msg):
1851 # Send msg to the server.
1852 return self.cli_sock.send(msg)
1853
1854 # Tuple of alternative default arguments for sendmsg() when called
1855 # via sendmsgToServer() (e.g. to include a destination address).
1856 sendmsg_to_server_defaults = ()
1857
1858 def sendmsgToServer(self, *args):
1859 # Call sendmsg() on self.cli_sock with the given arguments,
1860 # filling in any arguments which are not supplied with the
1861 # corresponding items of self.sendmsg_to_server_defaults, if
1862 # any.
1863 return self.cli_sock.sendmsg(
1864 *(args + self.sendmsg_to_server_defaults[len(args):]))
1865
1866 def doRecvmsg(self, sock, bufsize, *args):
1867 # Call recvmsg() on sock with given arguments and return its
1868 # result. Should be used for tests which can use either
1869 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1870 # this method with one which emulates it using recvmsg_into(),
1871 # thus allowing the same test to be used for both methods.
1872 result = sock.recvmsg(bufsize, *args)
1873 self.registerRecvmsgResult(result)
1874 return result
1875
1876 def registerRecvmsgResult(self, result):
1877 # Called by doRecvmsg() with the return value of recvmsg() or
1878 # recvmsg_into(). Can be overridden to arrange cleanup based
1879 # on the returned ancillary data, for instance.
1880 pass
1881
1882 def checkRecvmsgAddress(self, addr1, addr2):
1883 # Called to compare the received address with the address of
1884 # the peer.
1885 self.assertEqual(addr1, addr2)
1886
1887 # Flags that are normally unset in msg_flags
1888 msg_flags_common_unset = 0
1889 for name in ("MSG_CTRUNC", "MSG_OOB"):
1890 msg_flags_common_unset |= getattr(socket, name, 0)
1891
1892 # Flags that are normally set
1893 msg_flags_common_set = 0
1894
1895 # Flags set when a complete record has been received (e.g. MSG_EOR
1896 # for SCTP)
1897 msg_flags_eor_indicator = 0
1898
1899 # Flags set when a complete record has not been received
1900 # (e.g. MSG_TRUNC for datagram sockets)
1901 msg_flags_non_eor_indicator = 0
1902
1903 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1904 # Method to check the value of msg_flags returned by recvmsg[_into]().
1905 #
1906 # Checks that all bits in msg_flags_common_set attribute are
1907 # set in "flags" and all bits in msg_flags_common_unset are
1908 # unset.
1909 #
1910 # The "eor" argument specifies whether the flags should
1911 # indicate that a full record (or datagram) has been received.
1912 # If "eor" is None, no checks are done; otherwise, checks
1913 # that:
1914 #
1915 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1916 # set and all bits in msg_flags_non_eor_indicator are unset
1917 #
1918 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1919 # are set and all bits in msg_flags_eor_indicator are unset
1920 #
1921 # If "checkset" and/or "checkunset" are supplied, they require
1922 # the given bits to be set or unset respectively, overriding
1923 # what the attributes require for those bits.
1924 #
1925 # If any bits are set in "ignore", they will not be checked,
1926 # regardless of the other inputs.
1927 #
1928 # Will raise Exception if the inputs require a bit to be both
1929 # set and unset, and it is not ignored.
1930
1931 defaultset = self.msg_flags_common_set
1932 defaultunset = self.msg_flags_common_unset
1933
1934 if eor:
1935 defaultset |= self.msg_flags_eor_indicator
1936 defaultunset |= self.msg_flags_non_eor_indicator
1937 elif eor is not None:
1938 defaultset |= self.msg_flags_non_eor_indicator
1939 defaultunset |= self.msg_flags_eor_indicator
1940
1941 # Function arguments override defaults
1942 defaultset &= ~checkunset
1943 defaultunset &= ~checkset
1944
1945 # Merge arguments with remaining defaults, and check for conflicts
1946 checkset |= defaultset
1947 checkunset |= defaultunset
1948 inboth = checkset & checkunset & ~ignore
1949 if inboth:
1950 raise Exception("contradictory set, unset requirements for flags "
1951 "{0:#x}".format(inboth))
1952
1953 # Compare with given msg_flags value
1954 mask = (checkset | checkunset) & ~ignore
1955 self.assertEqual(flags & mask, checkset & mask)
1956
1957
1958class RecvmsgIntoMixin(SendrecvmsgBase):
1959 # Mixin to implement doRecvmsg() using recvmsg_into().
1960
1961 def doRecvmsg(self, sock, bufsize, *args):
1962 buf = bytearray(bufsize)
1963 result = sock.recvmsg_into([buf], *args)
1964 self.registerRecvmsgResult(result)
1965 self.assertGreaterEqual(result[0], 0)
1966 self.assertLessEqual(result[0], bufsize)
1967 return (bytes(buf[:result[0]]),) + result[1:]
1968
1969
1970class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1971 # Defines flags to be checked in msg_flags for datagram sockets.
1972
1973 @property
1974 def msg_flags_non_eor_indicator(self):
1975 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1976
1977
1978class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1979 # Defines flags to be checked in msg_flags for SCTP sockets.
1980
1981 @property
1982 def msg_flags_eor_indicator(self):
1983 return super().msg_flags_eor_indicator | socket.MSG_EOR
1984
1985
1986class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1987 # Base class for tests on connectionless-mode sockets. Users must
1988 # supply sockets on attributes cli and serv to be mapped to
1989 # cli_sock and serv_sock respectively.
1990
1991 @property
1992 def serv_sock(self):
1993 return self.serv
1994
1995 @property
1996 def cli_sock(self):
1997 return self.cli
1998
1999 @property
2000 def sendmsg_to_server_defaults(self):
2001 return ([], [], 0, self.serv_addr)
2002
2003 def sendToServer(self, msg):
2004 return self.cli_sock.sendto(msg, self.serv_addr)
2005
2006
2007class SendrecvmsgConnectedBase(SendrecvmsgBase):
2008 # Base class for tests on connected sockets. Users must supply
2009 # sockets on attributes serv_conn and cli_conn (representing the
2010 # connections *to* the server and the client), to be mapped to
2011 # cli_sock and serv_sock respectively.
2012
2013 @property
2014 def serv_sock(self):
2015 return self.cli_conn
2016
2017 @property
2018 def cli_sock(self):
2019 return self.serv_conn
2020
2021 def checkRecvmsgAddress(self, addr1, addr2):
2022 # Address is currently "unspecified" for a connected socket,
2023 # so we don't examine it
2024 pass
2025
2026
2027class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2028 # Base class to set a timeout on server's socket.
2029
2030 def setUp(self):
2031 super().setUp()
2032 self.serv_sock.settimeout(self.fail_timeout)
2033
2034
2035class SendmsgTests(SendrecvmsgServerTimeoutBase):
2036 # Tests for sendmsg() which can use any socket type and do not
2037 # involve recvmsg() or recvmsg_into().
2038
2039 def testSendmsg(self):
2040 # Send a simple message with sendmsg().
2041 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2042
2043 def _testSendmsg(self):
2044 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2045
2046 def testSendmsgDataGenerator(self):
2047 # Send from buffer obtained from a generator (not a sequence).
2048 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2049
2050 def _testSendmsgDataGenerator(self):
2051 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2052 len(MSG))
2053
2054 def testSendmsgAncillaryGenerator(self):
2055 # Gather (empty) ancillary data from a generator.
2056 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2057
2058 def _testSendmsgAncillaryGenerator(self):
2059 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2060 len(MSG))
2061
2062 def testSendmsgArray(self):
2063 # Send data from an array instead of the usual bytes object.
2064 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2065
2066 def _testSendmsgArray(self):
2067 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2068 len(MSG))
2069
2070 def testSendmsgGather(self):
2071 # Send message data from more than one buffer (gather write).
2072 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2073
2074 def _testSendmsgGather(self):
2075 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2076
2077 def testSendmsgBadArgs(self):
2078 # Check that sendmsg() rejects invalid arguments.
2079 self.assertEqual(self.serv_sock.recv(1000), b"done")
2080
2081 def _testSendmsgBadArgs(self):
2082 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2083 self.assertRaises(TypeError, self.sendmsgToServer,
2084 b"not in an iterable")
2085 self.assertRaises(TypeError, self.sendmsgToServer,
2086 object())
2087 self.assertRaises(TypeError, self.sendmsgToServer,
2088 [object()])
2089 self.assertRaises(TypeError, self.sendmsgToServer,
2090 [MSG, object()])
2091 self.assertRaises(TypeError, self.sendmsgToServer,
2092 [MSG], object())
2093 self.assertRaises(TypeError, self.sendmsgToServer,
2094 [MSG], [], object())
2095 self.assertRaises(TypeError, self.sendmsgToServer,
2096 [MSG], [], 0, object())
2097 self.sendToServer(b"done")
2098
2099 def testSendmsgBadCmsg(self):
2100 # Check that invalid ancillary data items are rejected.
2101 self.assertEqual(self.serv_sock.recv(1000), b"done")
2102
2103 def _testSendmsgBadCmsg(self):
2104 self.assertRaises(TypeError, self.sendmsgToServer,
2105 [MSG], [object()])
2106 self.assertRaises(TypeError, self.sendmsgToServer,
2107 [MSG], [(object(), 0, b"data")])
2108 self.assertRaises(TypeError, self.sendmsgToServer,
2109 [MSG], [(0, object(), b"data")])
2110 self.assertRaises(TypeError, self.sendmsgToServer,
2111 [MSG], [(0, 0, object())])
2112 self.assertRaises(TypeError, self.sendmsgToServer,
2113 [MSG], [(0, 0)])
2114 self.assertRaises(TypeError, self.sendmsgToServer,
2115 [MSG], [(0, 0, b"data", 42)])
2116 self.sendToServer(b"done")
2117
2118 @requireAttrs(socket, "CMSG_SPACE")
2119 def testSendmsgBadMultiCmsg(self):
2120 # Check that invalid ancillary data items are rejected when
2121 # more than one item is present.
2122 self.assertEqual(self.serv_sock.recv(1000), b"done")
2123
2124 @testSendmsgBadMultiCmsg.client_skip
2125 def _testSendmsgBadMultiCmsg(self):
2126 self.assertRaises(TypeError, self.sendmsgToServer,
2127 [MSG], [0, 0, b""])
2128 self.assertRaises(TypeError, self.sendmsgToServer,
2129 [MSG], [(0, 0, b""), object()])
2130 self.sendToServer(b"done")
2131
2132 def testSendmsgExcessCmsgReject(self):
2133 # Check that sendmsg() rejects excess ancillary data items
2134 # when the number that can be sent is limited.
2135 self.assertEqual(self.serv_sock.recv(1000), b"done")
2136
2137 def _testSendmsgExcessCmsgReject(self):
2138 if not hasattr(socket, "CMSG_SPACE"):
2139 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002140 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002141 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2142 self.assertIsNone(cm.exception.errno)
2143 self.sendToServer(b"done")
2144
2145 def testSendmsgAfterClose(self):
2146 # Check that sendmsg() fails on a closed socket.
2147 pass
2148
2149 def _testSendmsgAfterClose(self):
2150 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002151 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002152
2153
2154class SendmsgStreamTests(SendmsgTests):
2155 # Tests for sendmsg() which require a stream socket and do not
2156 # involve recvmsg() or recvmsg_into().
2157
2158 def testSendmsgExplicitNoneAddr(self):
2159 # Check that peer address can be specified as None.
2160 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2161
2162 def _testSendmsgExplicitNoneAddr(self):
2163 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2164
2165 def testSendmsgTimeout(self):
2166 # Check that timeout works with sendmsg().
2167 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2168 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2169
2170 def _testSendmsgTimeout(self):
2171 try:
2172 self.cli_sock.settimeout(0.03)
2173 with self.assertRaises(socket.timeout):
2174 while True:
2175 self.sendmsgToServer([b"a"*512])
2176 finally:
2177 self.misc_event.set()
2178
2179 # XXX: would be nice to have more tests for sendmsg flags argument.
2180
2181 # Linux supports MSG_DONTWAIT when sending, but in general, it
2182 # only works when receiving. Could add other platforms if they
2183 # support it too.
2184 @skipWithClientIf(sys.platform not in {"linux2"},
2185 "MSG_DONTWAIT not known to work on this platform when "
2186 "sending")
2187 def testSendmsgDontWait(self):
2188 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2189 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2190 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2191
2192 @testSendmsgDontWait.client_skip
2193 def _testSendmsgDontWait(self):
2194 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002195 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002196 while True:
2197 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2198 self.assertIn(cm.exception.errno,
2199 (errno.EAGAIN, errno.EWOULDBLOCK))
2200 finally:
2201 self.misc_event.set()
2202
2203
2204class SendmsgConnectionlessTests(SendmsgTests):
2205 # Tests for sendmsg() which require a connectionless-mode
2206 # (e.g. datagram) socket, and do not involve recvmsg() or
2207 # recvmsg_into().
2208
2209 def testSendmsgNoDestAddr(self):
2210 # Check that sendmsg() fails when no destination address is
2211 # given for unconnected socket.
2212 pass
2213
2214 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002215 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002216 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002217 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002218 [MSG], [], 0, None)
2219
2220
2221class RecvmsgGenericTests(SendrecvmsgBase):
2222 # Tests for recvmsg() which can also be emulated using
2223 # recvmsg_into(), and can use any socket type.
2224
2225 def testRecvmsg(self):
2226 # Receive a simple message with recvmsg[_into]().
2227 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2228 self.assertEqual(msg, MSG)
2229 self.checkRecvmsgAddress(addr, self.cli_addr)
2230 self.assertEqual(ancdata, [])
2231 self.checkFlags(flags, eor=True)
2232
2233 def _testRecvmsg(self):
2234 self.sendToServer(MSG)
2235
2236 def testRecvmsgExplicitDefaults(self):
2237 # Test recvmsg[_into]() with default arguments provided explicitly.
2238 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2239 len(MSG), 0, 0)
2240 self.assertEqual(msg, MSG)
2241 self.checkRecvmsgAddress(addr, self.cli_addr)
2242 self.assertEqual(ancdata, [])
2243 self.checkFlags(flags, eor=True)
2244
2245 def _testRecvmsgExplicitDefaults(self):
2246 self.sendToServer(MSG)
2247
2248 def testRecvmsgShorter(self):
2249 # Receive a message smaller than buffer.
2250 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2251 len(MSG) + 42)
2252 self.assertEqual(msg, MSG)
2253 self.checkRecvmsgAddress(addr, self.cli_addr)
2254 self.assertEqual(ancdata, [])
2255 self.checkFlags(flags, eor=True)
2256
2257 def _testRecvmsgShorter(self):
2258 self.sendToServer(MSG)
2259
Charles-François Natali8619cd72011-10-03 19:43:15 +02002260 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2261 # datagram is received (issue #13001).
2262 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002263 def testRecvmsgTrunc(self):
2264 # Receive part of message, check for truncation indicators.
2265 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2266 len(MSG) - 3)
2267 self.assertEqual(msg, MSG[:-3])
2268 self.checkRecvmsgAddress(addr, self.cli_addr)
2269 self.assertEqual(ancdata, [])
2270 self.checkFlags(flags, eor=False)
2271
Charles-François Natali8619cd72011-10-03 19:43:15 +02002272 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002273 def _testRecvmsgTrunc(self):
2274 self.sendToServer(MSG)
2275
2276 def testRecvmsgShortAncillaryBuf(self):
2277 # Test ancillary data buffer too small to hold any ancillary data.
2278 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2279 len(MSG), 1)
2280 self.assertEqual(msg, MSG)
2281 self.checkRecvmsgAddress(addr, self.cli_addr)
2282 self.assertEqual(ancdata, [])
2283 self.checkFlags(flags, eor=True)
2284
2285 def _testRecvmsgShortAncillaryBuf(self):
2286 self.sendToServer(MSG)
2287
2288 def testRecvmsgLongAncillaryBuf(self):
2289 # Test large ancillary data buffer.
2290 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2291 len(MSG), 10240)
2292 self.assertEqual(msg, MSG)
2293 self.checkRecvmsgAddress(addr, self.cli_addr)
2294 self.assertEqual(ancdata, [])
2295 self.checkFlags(flags, eor=True)
2296
2297 def _testRecvmsgLongAncillaryBuf(self):
2298 self.sendToServer(MSG)
2299
2300 def testRecvmsgAfterClose(self):
2301 # Check that recvmsg[_into]() fails on a closed socket.
2302 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002303 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002304
2305 def _testRecvmsgAfterClose(self):
2306 pass
2307
2308 def testRecvmsgTimeout(self):
2309 # Check that timeout works.
2310 try:
2311 self.serv_sock.settimeout(0.03)
2312 self.assertRaises(socket.timeout,
2313 self.doRecvmsg, self.serv_sock, len(MSG))
2314 finally:
2315 self.misc_event.set()
2316
2317 def _testRecvmsgTimeout(self):
2318 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2319
2320 @requireAttrs(socket, "MSG_PEEK")
2321 def testRecvmsgPeek(self):
2322 # Check that MSG_PEEK in flags enables examination of pending
2323 # data without consuming it.
2324
2325 # Receive part of data with MSG_PEEK.
2326 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2327 len(MSG) - 3, 0,
2328 socket.MSG_PEEK)
2329 self.assertEqual(msg, MSG[:-3])
2330 self.checkRecvmsgAddress(addr, self.cli_addr)
2331 self.assertEqual(ancdata, [])
2332 # Ignoring MSG_TRUNC here (so this test is the same for stream
2333 # and datagram sockets). Some wording in POSIX seems to
2334 # suggest that it needn't be set when peeking, but that may
2335 # just be a slip.
2336 self.checkFlags(flags, eor=False,
2337 ignore=getattr(socket, "MSG_TRUNC", 0))
2338
2339 # Receive all data with MSG_PEEK.
2340 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2341 len(MSG), 0,
2342 socket.MSG_PEEK)
2343 self.assertEqual(msg, MSG)
2344 self.checkRecvmsgAddress(addr, self.cli_addr)
2345 self.assertEqual(ancdata, [])
2346 self.checkFlags(flags, eor=True)
2347
2348 # Check that the same data can still be received normally.
2349 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2350 self.assertEqual(msg, MSG)
2351 self.checkRecvmsgAddress(addr, self.cli_addr)
2352 self.assertEqual(ancdata, [])
2353 self.checkFlags(flags, eor=True)
2354
2355 @testRecvmsgPeek.client_skip
2356 def _testRecvmsgPeek(self):
2357 self.sendToServer(MSG)
2358
2359 @requireAttrs(socket.socket, "sendmsg")
2360 def testRecvmsgFromSendmsg(self):
2361 # Test receiving with recvmsg[_into]() when message is sent
2362 # using sendmsg().
2363 self.serv_sock.settimeout(self.fail_timeout)
2364 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2365 self.assertEqual(msg, MSG)
2366 self.checkRecvmsgAddress(addr, self.cli_addr)
2367 self.assertEqual(ancdata, [])
2368 self.checkFlags(flags, eor=True)
2369
2370 @testRecvmsgFromSendmsg.client_skip
2371 def _testRecvmsgFromSendmsg(self):
2372 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2373
2374
2375class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2376 # Tests which require a stream socket and can use either recvmsg()
2377 # or recvmsg_into().
2378
2379 def testRecvmsgEOF(self):
2380 # Receive end-of-stream indicator (b"", peer socket closed).
2381 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2382 self.assertEqual(msg, b"")
2383 self.checkRecvmsgAddress(addr, self.cli_addr)
2384 self.assertEqual(ancdata, [])
2385 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2386
2387 def _testRecvmsgEOF(self):
2388 self.cli_sock.close()
2389
2390 def testRecvmsgOverflow(self):
2391 # Receive a message in more than one chunk.
2392 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2393 len(MSG) - 3)
2394 self.checkRecvmsgAddress(addr, self.cli_addr)
2395 self.assertEqual(ancdata, [])
2396 self.checkFlags(flags, eor=False)
2397
2398 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2399 self.checkRecvmsgAddress(addr, self.cli_addr)
2400 self.assertEqual(ancdata, [])
2401 self.checkFlags(flags, eor=True)
2402
2403 msg = seg1 + seg2
2404 self.assertEqual(msg, MSG)
2405
2406 def _testRecvmsgOverflow(self):
2407 self.sendToServer(MSG)
2408
2409
2410class RecvmsgTests(RecvmsgGenericTests):
2411 # Tests for recvmsg() which can use any socket type.
2412
2413 def testRecvmsgBadArgs(self):
2414 # Check that recvmsg() rejects invalid arguments.
2415 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2416 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2417 -1, 0, 0)
2418 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2419 len(MSG), -1, 0)
2420 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2421 [bytearray(10)], 0, 0)
2422 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2423 object(), 0, 0)
2424 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2425 len(MSG), object(), 0)
2426 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2427 len(MSG), 0, object())
2428
2429 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2430 self.assertEqual(msg, MSG)
2431 self.checkRecvmsgAddress(addr, self.cli_addr)
2432 self.assertEqual(ancdata, [])
2433 self.checkFlags(flags, eor=True)
2434
2435 def _testRecvmsgBadArgs(self):
2436 self.sendToServer(MSG)
2437
2438
2439class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2440 # Tests for recvmsg_into() which can use any socket type.
2441
2442 def testRecvmsgIntoBadArgs(self):
2443 # Check that recvmsg_into() rejects invalid arguments.
2444 buf = bytearray(len(MSG))
2445 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2446 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2447 len(MSG), 0, 0)
2448 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2449 buf, 0, 0)
2450 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2451 [object()], 0, 0)
2452 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2453 [b"I'm not writable"], 0, 0)
2454 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2455 [buf, object()], 0, 0)
2456 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2457 [buf], -1, 0)
2458 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2459 [buf], object(), 0)
2460 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2461 [buf], 0, object())
2462
2463 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2464 self.assertEqual(nbytes, len(MSG))
2465 self.assertEqual(buf, bytearray(MSG))
2466 self.checkRecvmsgAddress(addr, self.cli_addr)
2467 self.assertEqual(ancdata, [])
2468 self.checkFlags(flags, eor=True)
2469
2470 def _testRecvmsgIntoBadArgs(self):
2471 self.sendToServer(MSG)
2472
2473 def testRecvmsgIntoGenerator(self):
2474 # Receive into buffer obtained from a generator (not a sequence).
2475 buf = bytearray(len(MSG))
2476 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2477 (o for o in [buf]))
2478 self.assertEqual(nbytes, len(MSG))
2479 self.assertEqual(buf, bytearray(MSG))
2480 self.checkRecvmsgAddress(addr, self.cli_addr)
2481 self.assertEqual(ancdata, [])
2482 self.checkFlags(flags, eor=True)
2483
2484 def _testRecvmsgIntoGenerator(self):
2485 self.sendToServer(MSG)
2486
2487 def testRecvmsgIntoArray(self):
2488 # Receive into an array rather than the usual bytearray.
2489 buf = array.array("B", [0] * len(MSG))
2490 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2491 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002492 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002493 self.checkRecvmsgAddress(addr, self.cli_addr)
2494 self.assertEqual(ancdata, [])
2495 self.checkFlags(flags, eor=True)
2496
2497 def _testRecvmsgIntoArray(self):
2498 self.sendToServer(MSG)
2499
2500 def testRecvmsgIntoScatter(self):
2501 # Receive into multiple buffers (scatter write).
2502 b1 = bytearray(b"----")
2503 b2 = bytearray(b"0123456789")
2504 b3 = bytearray(b"--------------")
2505 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2506 [b1, memoryview(b2)[2:9], b3])
2507 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2508 self.assertEqual(b1, bytearray(b"Mary"))
2509 self.assertEqual(b2, bytearray(b"01 had a 9"))
2510 self.assertEqual(b3, bytearray(b"little lamb---"))
2511 self.checkRecvmsgAddress(addr, self.cli_addr)
2512 self.assertEqual(ancdata, [])
2513 self.checkFlags(flags, eor=True)
2514
2515 def _testRecvmsgIntoScatter(self):
2516 self.sendToServer(b"Mary had a little lamb")
2517
2518
2519class CmsgMacroTests(unittest.TestCase):
2520 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2521 # assumptions used by sendmsg() and recvmsg[_into](), which share
2522 # code with these functions.
2523
2524 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002525 try:
2526 import _testcapi
2527 except ImportError:
2528 socklen_t_limit = 0x7fffffff
2529 else:
2530 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002531
2532 @requireAttrs(socket, "CMSG_LEN")
2533 def testCMSG_LEN(self):
2534 # Test CMSG_LEN() with various valid and invalid values,
2535 # checking the assumptions used by recvmsg() and sendmsg().
2536 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2537 values = list(range(257)) + list(range(toobig - 257, toobig))
2538
2539 # struct cmsghdr has at least three members, two of which are ints
2540 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2541 for n in values:
2542 ret = socket.CMSG_LEN(n)
2543 # This is how recvmsg() calculates the data size
2544 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2545 self.assertLessEqual(ret, self.socklen_t_limit)
2546
2547 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2548 # sendmsg() shares code with these functions, and requires
2549 # that it reject values over the limit.
2550 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2551 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2552
2553 @requireAttrs(socket, "CMSG_SPACE")
2554 def testCMSG_SPACE(self):
2555 # Test CMSG_SPACE() with various valid and invalid values,
2556 # checking the assumptions used by sendmsg().
2557 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2558 values = list(range(257)) + list(range(toobig - 257, toobig))
2559
2560 last = socket.CMSG_SPACE(0)
2561 # struct cmsghdr has at least three members, two of which are ints
2562 self.assertGreater(last, array.array("i").itemsize * 2)
2563 for n in values:
2564 ret = socket.CMSG_SPACE(n)
2565 self.assertGreaterEqual(ret, last)
2566 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2567 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2568 self.assertLessEqual(ret, self.socklen_t_limit)
2569 last = ret
2570
2571 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2572 # sendmsg() shares code with these functions, and requires
2573 # that it reject values over the limit.
2574 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2575 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2576
2577
2578class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2579 # Tests for file descriptor passing on Unix-domain sockets.
2580
2581 # Invalid file descriptor value that's unlikely to evaluate to a
2582 # real FD even if one of its bytes is replaced with a different
2583 # value (which shouldn't actually happen).
2584 badfd = -0x5555
2585
2586 def newFDs(self, n):
2587 # Return a list of n file descriptors for newly-created files
2588 # containing their list indices as ASCII numbers.
2589 fds = []
2590 for i in range(n):
2591 fd, path = tempfile.mkstemp()
2592 self.addCleanup(os.unlink, path)
2593 self.addCleanup(os.close, fd)
2594 os.write(fd, str(i).encode())
2595 fds.append(fd)
2596 return fds
2597
2598 def checkFDs(self, fds):
2599 # Check that the file descriptors in the given list contain
2600 # their correct list indices as ASCII numbers.
2601 for n, fd in enumerate(fds):
2602 os.lseek(fd, 0, os.SEEK_SET)
2603 self.assertEqual(os.read(fd, 1024), str(n).encode())
2604
2605 def registerRecvmsgResult(self, result):
2606 self.addCleanup(self.closeRecvmsgFDs, result)
2607
2608 def closeRecvmsgFDs(self, recvmsg_result):
2609 # Close all file descriptors specified in the ancillary data
2610 # of the given return value from recvmsg() or recvmsg_into().
2611 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2612 if (cmsg_level == socket.SOL_SOCKET and
2613 cmsg_type == socket.SCM_RIGHTS):
2614 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002615 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002616 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2617 for fd in fds:
2618 os.close(fd)
2619
2620 def createAndSendFDs(self, n):
2621 # Send n new file descriptors created by newFDs() to the
2622 # server, with the constant MSG as the non-ancillary data.
2623 self.assertEqual(
2624 self.sendmsgToServer([MSG],
2625 [(socket.SOL_SOCKET,
2626 socket.SCM_RIGHTS,
2627 array.array("i", self.newFDs(n)))]),
2628 len(MSG))
2629
2630 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2631 # Check that constant MSG was received with numfds file
2632 # descriptors in a maximum of maxcmsgs control messages (which
2633 # must contain only complete integers). By default, check
2634 # that MSG_CTRUNC is unset, but ignore any flags in
2635 # ignoreflags.
2636 msg, ancdata, flags, addr = result
2637 self.assertEqual(msg, MSG)
2638 self.checkRecvmsgAddress(addr, self.cli_addr)
2639 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2640 ignore=ignoreflags)
2641
2642 self.assertIsInstance(ancdata, list)
2643 self.assertLessEqual(len(ancdata), maxcmsgs)
2644 fds = array.array("i")
2645 for item in ancdata:
2646 self.assertIsInstance(item, tuple)
2647 cmsg_level, cmsg_type, cmsg_data = item
2648 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2649 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2650 self.assertIsInstance(cmsg_data, bytes)
2651 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002652 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002653
2654 self.assertEqual(len(fds), numfds)
2655 self.checkFDs(fds)
2656
2657 def testFDPassSimple(self):
2658 # Pass a single FD (array read from bytes object).
2659 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2660 len(MSG), 10240))
2661
2662 def _testFDPassSimple(self):
2663 self.assertEqual(
2664 self.sendmsgToServer(
2665 [MSG],
2666 [(socket.SOL_SOCKET,
2667 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002668 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002669 len(MSG))
2670
2671 def testMultipleFDPass(self):
2672 # Pass multiple FDs in a single array.
2673 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2674 len(MSG), 10240))
2675
2676 def _testMultipleFDPass(self):
2677 self.createAndSendFDs(4)
2678
2679 @requireAttrs(socket, "CMSG_SPACE")
2680 def testFDPassCMSG_SPACE(self):
2681 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2682 self.checkRecvmsgFDs(
2683 4, self.doRecvmsg(self.serv_sock, len(MSG),
2684 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2685
2686 @testFDPassCMSG_SPACE.client_skip
2687 def _testFDPassCMSG_SPACE(self):
2688 self.createAndSendFDs(4)
2689
2690 def testFDPassCMSG_LEN(self):
2691 # Test using CMSG_LEN() to calculate ancillary buffer size.
2692 self.checkRecvmsgFDs(1,
2693 self.doRecvmsg(self.serv_sock, len(MSG),
2694 socket.CMSG_LEN(4 * SIZEOF_INT)),
2695 # RFC 3542 says implementations may set
2696 # MSG_CTRUNC if there isn't enough space
2697 # for trailing padding.
2698 ignoreflags=socket.MSG_CTRUNC)
2699
2700 def _testFDPassCMSG_LEN(self):
2701 self.createAndSendFDs(1)
2702
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002703 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002704 @requireAttrs(socket, "CMSG_SPACE")
2705 def testFDPassSeparate(self):
2706 # Pass two FDs in two separate arrays. Arrays may be combined
2707 # into a single control message by the OS.
2708 self.checkRecvmsgFDs(2,
2709 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2710 maxcmsgs=2)
2711
2712 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002713 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002714 def _testFDPassSeparate(self):
2715 fd0, fd1 = self.newFDs(2)
2716 self.assertEqual(
2717 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2718 socket.SCM_RIGHTS,
2719 array.array("i", [fd0])),
2720 (socket.SOL_SOCKET,
2721 socket.SCM_RIGHTS,
2722 array.array("i", [fd1]))]),
2723 len(MSG))
2724
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002725 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002726 @requireAttrs(socket, "CMSG_SPACE")
2727 def testFDPassSeparateMinSpace(self):
2728 # Pass two FDs in two separate arrays, receiving them into the
2729 # minimum space for two arrays.
2730 self.checkRecvmsgFDs(2,
2731 self.doRecvmsg(self.serv_sock, len(MSG),
2732 socket.CMSG_SPACE(SIZEOF_INT) +
2733 socket.CMSG_LEN(SIZEOF_INT)),
2734 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2735
2736 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002737 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002738 def _testFDPassSeparateMinSpace(self):
2739 fd0, fd1 = self.newFDs(2)
2740 self.assertEqual(
2741 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2742 socket.SCM_RIGHTS,
2743 array.array("i", [fd0])),
2744 (socket.SOL_SOCKET,
2745 socket.SCM_RIGHTS,
2746 array.array("i", [fd1]))]),
2747 len(MSG))
2748
2749 def sendAncillaryIfPossible(self, msg, ancdata):
2750 # Try to send msg and ancdata to server, but if the system
2751 # call fails, just send msg with no ancillary data.
2752 try:
2753 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002754 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002755 # Check that it was the system call that failed
2756 self.assertIsInstance(e.errno, int)
2757 nbytes = self.sendmsgToServer([msg])
2758 self.assertEqual(nbytes, len(msg))
2759
2760 def testFDPassEmpty(self):
2761 # Try to pass an empty FD array. Can receive either no array
2762 # or an empty array.
2763 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2764 len(MSG), 10240),
2765 ignoreflags=socket.MSG_CTRUNC)
2766
2767 def _testFDPassEmpty(self):
2768 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2769 socket.SCM_RIGHTS,
2770 b"")])
2771
2772 def testFDPassPartialInt(self):
2773 # Try to pass a truncated FD array.
2774 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2775 len(MSG), 10240)
2776 self.assertEqual(msg, MSG)
2777 self.checkRecvmsgAddress(addr, self.cli_addr)
2778 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2779 self.assertLessEqual(len(ancdata), 1)
2780 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2781 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2782 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2783 self.assertLess(len(cmsg_data), SIZEOF_INT)
2784
2785 def _testFDPassPartialInt(self):
2786 self.sendAncillaryIfPossible(
2787 MSG,
2788 [(socket.SOL_SOCKET,
2789 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002790 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002791
2792 @requireAttrs(socket, "CMSG_SPACE")
2793 def testFDPassPartialIntInMiddle(self):
2794 # Try to pass two FD arrays, the first of which is truncated.
2795 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2796 len(MSG), 10240)
2797 self.assertEqual(msg, MSG)
2798 self.checkRecvmsgAddress(addr, self.cli_addr)
2799 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2800 self.assertLessEqual(len(ancdata), 2)
2801 fds = array.array("i")
2802 # Arrays may have been combined in a single control message
2803 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2804 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2805 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002806 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002807 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2808 self.assertLessEqual(len(fds), 2)
2809 self.checkFDs(fds)
2810
2811 @testFDPassPartialIntInMiddle.client_skip
2812 def _testFDPassPartialIntInMiddle(self):
2813 fd0, fd1 = self.newFDs(2)
2814 self.sendAncillaryIfPossible(
2815 MSG,
2816 [(socket.SOL_SOCKET,
2817 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002818 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002819 (socket.SOL_SOCKET,
2820 socket.SCM_RIGHTS,
2821 array.array("i", [fd1]))])
2822
2823 def checkTruncatedHeader(self, result, ignoreflags=0):
2824 # Check that no ancillary data items are returned when data is
2825 # truncated inside the cmsghdr structure.
2826 msg, ancdata, flags, addr = result
2827 self.assertEqual(msg, MSG)
2828 self.checkRecvmsgAddress(addr, self.cli_addr)
2829 self.assertEqual(ancdata, [])
2830 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2831 ignore=ignoreflags)
2832
2833 def testCmsgTruncNoBufSize(self):
2834 # Check that no ancillary data is received when no buffer size
2835 # is specified.
2836 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2837 # BSD seems to set MSG_CTRUNC only
2838 # if an item has been partially
2839 # received.
2840 ignoreflags=socket.MSG_CTRUNC)
2841
2842 def _testCmsgTruncNoBufSize(self):
2843 self.createAndSendFDs(1)
2844
2845 def testCmsgTrunc0(self):
2846 # Check that no ancillary data is received when buffer size is 0.
2847 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2848 ignoreflags=socket.MSG_CTRUNC)
2849
2850 def _testCmsgTrunc0(self):
2851 self.createAndSendFDs(1)
2852
2853 # Check that no ancillary data is returned for various non-zero
2854 # (but still too small) buffer sizes.
2855
2856 def testCmsgTrunc1(self):
2857 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2858
2859 def _testCmsgTrunc1(self):
2860 self.createAndSendFDs(1)
2861
2862 def testCmsgTrunc2Int(self):
2863 # The cmsghdr structure has at least three members, two of
2864 # which are ints, so we still shouldn't see any ancillary
2865 # data.
2866 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2867 SIZEOF_INT * 2))
2868
2869 def _testCmsgTrunc2Int(self):
2870 self.createAndSendFDs(1)
2871
2872 def testCmsgTruncLen0Minus1(self):
2873 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2874 socket.CMSG_LEN(0) - 1))
2875
2876 def _testCmsgTruncLen0Minus1(self):
2877 self.createAndSendFDs(1)
2878
2879 # The following tests try to truncate the control message in the
2880 # middle of the FD array.
2881
2882 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2883 # Check that file descriptor data is truncated to between
2884 # mindata and maxdata bytes when received with buffer size
2885 # ancbuf, and that any complete file descriptor numbers are
2886 # valid.
2887 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2888 len(MSG), ancbuf)
2889 self.assertEqual(msg, MSG)
2890 self.checkRecvmsgAddress(addr, self.cli_addr)
2891 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2892
2893 if mindata == 0 and ancdata == []:
2894 return
2895 self.assertEqual(len(ancdata), 1)
2896 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2897 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2898 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2899 self.assertGreaterEqual(len(cmsg_data), mindata)
2900 self.assertLessEqual(len(cmsg_data), maxdata)
2901 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002902 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002903 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2904 self.checkFDs(fds)
2905
2906 def testCmsgTruncLen0(self):
2907 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2908
2909 def _testCmsgTruncLen0(self):
2910 self.createAndSendFDs(1)
2911
2912 def testCmsgTruncLen0Plus1(self):
2913 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2914
2915 def _testCmsgTruncLen0Plus1(self):
2916 self.createAndSendFDs(2)
2917
2918 def testCmsgTruncLen1(self):
2919 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2920 maxdata=SIZEOF_INT)
2921
2922 def _testCmsgTruncLen1(self):
2923 self.createAndSendFDs(2)
2924
2925 def testCmsgTruncLen2Minus1(self):
2926 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2927 maxdata=(2 * SIZEOF_INT) - 1)
2928
2929 def _testCmsgTruncLen2Minus1(self):
2930 self.createAndSendFDs(2)
2931
2932
2933class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2934 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2935 # features of the RFC 3542 Advanced Sockets API for IPv6.
2936 # Currently we can only handle certain data items (e.g. traffic
2937 # class, hop limit, MTU discovery and fragmentation settings)
2938 # without resorting to unportable means such as the struct module,
2939 # but the tests here are aimed at testing the ancillary data
2940 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2941 # itself.
2942
2943 # Test value to use when setting hop limit of packet
2944 hop_limit = 2
2945
2946 # Test value to use when setting traffic class of packet.
2947 # -1 means "use kernel default".
2948 traffic_class = -1
2949
2950 def ancillaryMapping(self, ancdata):
2951 # Given ancillary data list ancdata, return a mapping from
2952 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2953 # Check that no (level, type) pair appears more than once.
2954 d = {}
2955 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2956 self.assertNotIn((cmsg_level, cmsg_type), d)
2957 d[(cmsg_level, cmsg_type)] = cmsg_data
2958 return d
2959
2960 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2961 # Receive hop limit into ancbufsize bytes of ancillary data
2962 # space. Check that data is MSG, ancillary data is not
2963 # truncated (but ignore any flags in ignoreflags), and hop
2964 # limit is between 0 and maxhop inclusive.
2965 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2966 socket.IPV6_RECVHOPLIMIT, 1)
2967 self.misc_event.set()
2968 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2969 len(MSG), ancbufsize)
2970
2971 self.assertEqual(msg, MSG)
2972 self.checkRecvmsgAddress(addr, self.cli_addr)
2973 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2974 ignore=ignoreflags)
2975
2976 self.assertEqual(len(ancdata), 1)
2977 self.assertIsInstance(ancdata[0], tuple)
2978 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2979 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2980 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2981 self.assertIsInstance(cmsg_data, bytes)
2982 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2983 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002984 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002985 self.assertGreaterEqual(a[0], 0)
2986 self.assertLessEqual(a[0], maxhop)
2987
2988 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2989 def testRecvHopLimit(self):
2990 # Test receiving the packet hop limit as ancillary data.
2991 self.checkHopLimit(ancbufsize=10240)
2992
2993 @testRecvHopLimit.client_skip
2994 def _testRecvHopLimit(self):
2995 # Need to wait until server has asked to receive ancillary
2996 # data, as implementations are not required to buffer it
2997 # otherwise.
2998 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2999 self.sendToServer(MSG)
3000
3001 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3002 def testRecvHopLimitCMSG_SPACE(self):
3003 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3004 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3005
3006 @testRecvHopLimitCMSG_SPACE.client_skip
3007 def _testRecvHopLimitCMSG_SPACE(self):
3008 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3009 self.sendToServer(MSG)
3010
3011 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3012 # 3542 says portable applications must provide space for trailing
3013 # padding. Implementations may set MSG_CTRUNC if there isn't
3014 # enough space for the padding.
3015
3016 @requireAttrs(socket.socket, "sendmsg")
3017 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3018 def testSetHopLimit(self):
3019 # Test setting hop limit on outgoing packet and receiving it
3020 # at the other end.
3021 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3022
3023 @testSetHopLimit.client_skip
3024 def _testSetHopLimit(self):
3025 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3026 self.assertEqual(
3027 self.sendmsgToServer([MSG],
3028 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3029 array.array("i", [self.hop_limit]))]),
3030 len(MSG))
3031
3032 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3033 ignoreflags=0):
3034 # Receive traffic class and hop limit into ancbufsize bytes of
3035 # ancillary data space. Check that data is MSG, ancillary
3036 # data is not truncated (but ignore any flags in ignoreflags),
3037 # and traffic class and hop limit are in range (hop limit no
3038 # more than maxhop).
3039 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3040 socket.IPV6_RECVHOPLIMIT, 1)
3041 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3042 socket.IPV6_RECVTCLASS, 1)
3043 self.misc_event.set()
3044 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3045 len(MSG), ancbufsize)
3046
3047 self.assertEqual(msg, MSG)
3048 self.checkRecvmsgAddress(addr, self.cli_addr)
3049 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3050 ignore=ignoreflags)
3051 self.assertEqual(len(ancdata), 2)
3052 ancmap = self.ancillaryMapping(ancdata)
3053
3054 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3055 self.assertEqual(len(tcdata), SIZEOF_INT)
3056 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003057 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003058 self.assertGreaterEqual(a[0], 0)
3059 self.assertLessEqual(a[0], 255)
3060
3061 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3062 self.assertEqual(len(hldata), SIZEOF_INT)
3063 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003064 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003065 self.assertGreaterEqual(a[0], 0)
3066 self.assertLessEqual(a[0], maxhop)
3067
3068 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3069 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3070 def testRecvTrafficClassAndHopLimit(self):
3071 # Test receiving traffic class and hop limit as ancillary data.
3072 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3073
3074 @testRecvTrafficClassAndHopLimit.client_skip
3075 def _testRecvTrafficClassAndHopLimit(self):
3076 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3077 self.sendToServer(MSG)
3078
3079 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3080 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3081 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3082 # Test receiving traffic class and hop limit, using
3083 # CMSG_SPACE() to calculate buffer size.
3084 self.checkTrafficClassAndHopLimit(
3085 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3086
3087 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3088 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3089 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3090 self.sendToServer(MSG)
3091
3092 @requireAttrs(socket.socket, "sendmsg")
3093 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3094 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3095 def testSetTrafficClassAndHopLimit(self):
3096 # Test setting traffic class and hop limit on outgoing packet,
3097 # and receiving them at the other end.
3098 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3099 maxhop=self.hop_limit)
3100
3101 @testSetTrafficClassAndHopLimit.client_skip
3102 def _testSetTrafficClassAndHopLimit(self):
3103 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3104 self.assertEqual(
3105 self.sendmsgToServer([MSG],
3106 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3107 array.array("i", [self.traffic_class])),
3108 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3109 array.array("i", [self.hop_limit]))]),
3110 len(MSG))
3111
3112 @requireAttrs(socket.socket, "sendmsg")
3113 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3114 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3115 def testOddCmsgSize(self):
3116 # Try to send ancillary data with first item one byte too
3117 # long. Fall back to sending with correct size if this fails,
3118 # and check that second item was handled correctly.
3119 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3120 maxhop=self.hop_limit)
3121
3122 @testOddCmsgSize.client_skip
3123 def _testOddCmsgSize(self):
3124 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3125 try:
3126 nbytes = self.sendmsgToServer(
3127 [MSG],
3128 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003129 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003130 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3131 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003132 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003133 self.assertIsInstance(e.errno, int)
3134 nbytes = self.sendmsgToServer(
3135 [MSG],
3136 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3137 array.array("i", [self.traffic_class])),
3138 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3139 array.array("i", [self.hop_limit]))])
3140 self.assertEqual(nbytes, len(MSG))
3141
3142 # Tests for proper handling of truncated ancillary data
3143
3144 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3145 # Receive hop limit into ancbufsize bytes of ancillary data
3146 # space, which should be too small to contain the ancillary
3147 # data header (if ancbufsize is None, pass no second argument
3148 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3149 # (unless included in ignoreflags), and no ancillary data is
3150 # returned.
3151 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3152 socket.IPV6_RECVHOPLIMIT, 1)
3153 self.misc_event.set()
3154 args = () if ancbufsize is None else (ancbufsize,)
3155 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3156 len(MSG), *args)
3157
3158 self.assertEqual(msg, MSG)
3159 self.checkRecvmsgAddress(addr, self.cli_addr)
3160 self.assertEqual(ancdata, [])
3161 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3162 ignore=ignoreflags)
3163
3164 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3165 def testCmsgTruncNoBufSize(self):
3166 # Check that no ancillary data is received when no ancillary
3167 # buffer size is provided.
3168 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3169 # BSD seems to set
3170 # MSG_CTRUNC only if an item
3171 # has been partially
3172 # received.
3173 ignoreflags=socket.MSG_CTRUNC)
3174
3175 @testCmsgTruncNoBufSize.client_skip
3176 def _testCmsgTruncNoBufSize(self):
3177 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3178 self.sendToServer(MSG)
3179
3180 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3181 def testSingleCmsgTrunc0(self):
3182 # Check that no ancillary data is received when ancillary
3183 # buffer size is zero.
3184 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3185 ignoreflags=socket.MSG_CTRUNC)
3186
3187 @testSingleCmsgTrunc0.client_skip
3188 def _testSingleCmsgTrunc0(self):
3189 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3190 self.sendToServer(MSG)
3191
3192 # Check that no ancillary data is returned for various non-zero
3193 # (but still too small) buffer sizes.
3194
3195 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3196 def testSingleCmsgTrunc1(self):
3197 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3198
3199 @testSingleCmsgTrunc1.client_skip
3200 def _testSingleCmsgTrunc1(self):
3201 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3202 self.sendToServer(MSG)
3203
3204 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3205 def testSingleCmsgTrunc2Int(self):
3206 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3207
3208 @testSingleCmsgTrunc2Int.client_skip
3209 def _testSingleCmsgTrunc2Int(self):
3210 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3211 self.sendToServer(MSG)
3212
3213 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3214 def testSingleCmsgTruncLen0Minus1(self):
3215 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3216
3217 @testSingleCmsgTruncLen0Minus1.client_skip
3218 def _testSingleCmsgTruncLen0Minus1(self):
3219 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3220 self.sendToServer(MSG)
3221
3222 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3223 def testSingleCmsgTruncInData(self):
3224 # Test truncation of a control message inside its associated
3225 # data. The message may be returned with its data truncated,
3226 # or not returned at all.
3227 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3228 socket.IPV6_RECVHOPLIMIT, 1)
3229 self.misc_event.set()
3230 msg, ancdata, flags, addr = self.doRecvmsg(
3231 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3232
3233 self.assertEqual(msg, MSG)
3234 self.checkRecvmsgAddress(addr, self.cli_addr)
3235 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3236
3237 self.assertLessEqual(len(ancdata), 1)
3238 if ancdata:
3239 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3240 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3241 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3242 self.assertLess(len(cmsg_data), SIZEOF_INT)
3243
3244 @testSingleCmsgTruncInData.client_skip
3245 def _testSingleCmsgTruncInData(self):
3246 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3247 self.sendToServer(MSG)
3248
3249 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3250 # Receive traffic class and hop limit into ancbufsize bytes of
3251 # ancillary data space, which should be large enough to
3252 # contain the first item, but too small to contain the header
3253 # of the second. Check that data is MSG, MSG_CTRUNC is set
3254 # (unless included in ignoreflags), and only one ancillary
3255 # data item is returned.
3256 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3257 socket.IPV6_RECVHOPLIMIT, 1)
3258 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3259 socket.IPV6_RECVTCLASS, 1)
3260 self.misc_event.set()
3261 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3262 len(MSG), ancbufsize)
3263
3264 self.assertEqual(msg, MSG)
3265 self.checkRecvmsgAddress(addr, self.cli_addr)
3266 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3267 ignore=ignoreflags)
3268
3269 self.assertEqual(len(ancdata), 1)
3270 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3271 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3272 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3273 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3274 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003275 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003276 self.assertGreaterEqual(a[0], 0)
3277 self.assertLessEqual(a[0], 255)
3278
3279 # Try the above test with various buffer sizes.
3280
3281 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3282 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3283 def testSecondCmsgTrunc0(self):
3284 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3285 ignoreflags=socket.MSG_CTRUNC)
3286
3287 @testSecondCmsgTrunc0.client_skip
3288 def _testSecondCmsgTrunc0(self):
3289 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3290 self.sendToServer(MSG)
3291
3292 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3293 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3294 def testSecondCmsgTrunc1(self):
3295 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3296
3297 @testSecondCmsgTrunc1.client_skip
3298 def _testSecondCmsgTrunc1(self):
3299 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3300 self.sendToServer(MSG)
3301
3302 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3303 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3304 def testSecondCmsgTrunc2Int(self):
3305 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3306 2 * SIZEOF_INT)
3307
3308 @testSecondCmsgTrunc2Int.client_skip
3309 def _testSecondCmsgTrunc2Int(self):
3310 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3311 self.sendToServer(MSG)
3312
3313 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3314 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3315 def testSecondCmsgTruncLen0Minus1(self):
3316 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3317 socket.CMSG_LEN(0) - 1)
3318
3319 @testSecondCmsgTruncLen0Minus1.client_skip
3320 def _testSecondCmsgTruncLen0Minus1(self):
3321 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3322 self.sendToServer(MSG)
3323
3324 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3325 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3326 def testSecomdCmsgTruncInData(self):
3327 # Test truncation of the second of two control messages inside
3328 # its associated data.
3329 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3330 socket.IPV6_RECVHOPLIMIT, 1)
3331 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3332 socket.IPV6_RECVTCLASS, 1)
3333 self.misc_event.set()
3334 msg, ancdata, flags, addr = self.doRecvmsg(
3335 self.serv_sock, len(MSG),
3336 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3337
3338 self.assertEqual(msg, MSG)
3339 self.checkRecvmsgAddress(addr, self.cli_addr)
3340 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3341
3342 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3343
3344 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3345 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3346 cmsg_types.remove(cmsg_type)
3347 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3348 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003349 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003350 self.assertGreaterEqual(a[0], 0)
3351 self.assertLessEqual(a[0], 255)
3352
3353 if ancdata:
3354 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3355 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3356 cmsg_types.remove(cmsg_type)
3357 self.assertLess(len(cmsg_data), SIZEOF_INT)
3358
3359 self.assertEqual(ancdata, [])
3360
3361 @testSecomdCmsgTruncInData.client_skip
3362 def _testSecomdCmsgTruncInData(self):
3363 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3364 self.sendToServer(MSG)
3365
3366
3367# Derive concrete test classes for different socket types.
3368
3369class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3370 SendrecvmsgConnectionlessBase,
3371 ThreadedSocketTestMixin, UDPTestBase):
3372 pass
3373
3374@requireAttrs(socket.socket, "sendmsg")
3375@unittest.skipUnless(thread, 'Threading required for this test.')
3376class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3377 pass
3378
3379@requireAttrs(socket.socket, "recvmsg")
3380@unittest.skipUnless(thread, 'Threading required for this test.')
3381class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3382 pass
3383
3384@requireAttrs(socket.socket, "recvmsg_into")
3385@unittest.skipUnless(thread, 'Threading required for this test.')
3386class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3387 pass
3388
3389
3390class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3391 SendrecvmsgConnectionlessBase,
3392 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003393
3394 def checkRecvmsgAddress(self, addr1, addr2):
3395 # Called to compare the received address with the address of
3396 # the peer, ignoring scope ID
3397 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003398
3399@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003400@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003401@requireSocket("AF_INET6", "SOCK_DGRAM")
3402@unittest.skipUnless(thread, 'Threading required for this test.')
3403class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3404 pass
3405
3406@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003407@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003408@requireSocket("AF_INET6", "SOCK_DGRAM")
3409@unittest.skipUnless(thread, 'Threading required for this test.')
3410class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3411 pass
3412
3413@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003414@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003415@requireSocket("AF_INET6", "SOCK_DGRAM")
3416@unittest.skipUnless(thread, 'Threading required for this test.')
3417class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3418 pass
3419
3420@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003421@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003422@requireAttrs(socket, "IPPROTO_IPV6")
3423@requireSocket("AF_INET6", "SOCK_DGRAM")
3424@unittest.skipUnless(thread, 'Threading required for this test.')
3425class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3426 SendrecvmsgUDP6TestBase):
3427 pass
3428
3429@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003430@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003431@requireAttrs(socket, "IPPROTO_IPV6")
3432@requireSocket("AF_INET6", "SOCK_DGRAM")
3433@unittest.skipUnless(thread, 'Threading required for this test.')
3434class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3435 RFC3542AncillaryTest,
3436 SendrecvmsgUDP6TestBase):
3437 pass
3438
3439
3440class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3441 ConnectedStreamTestMixin, TCPTestBase):
3442 pass
3443
3444@requireAttrs(socket.socket, "sendmsg")
3445@unittest.skipUnless(thread, 'Threading required for this test.')
3446class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3447 pass
3448
3449@requireAttrs(socket.socket, "recvmsg")
3450@unittest.skipUnless(thread, 'Threading required for this test.')
3451class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3452 SendrecvmsgTCPTestBase):
3453 pass
3454
3455@requireAttrs(socket.socket, "recvmsg_into")
3456@unittest.skipUnless(thread, 'Threading required for this test.')
3457class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3458 SendrecvmsgTCPTestBase):
3459 pass
3460
3461
3462class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3463 SendrecvmsgConnectedBase,
3464 ConnectedStreamTestMixin, SCTPStreamBase):
3465 pass
3466
3467@requireAttrs(socket.socket, "sendmsg")
3468@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3469@unittest.skipUnless(thread, 'Threading required for this test.')
3470class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3471 pass
3472
3473@requireAttrs(socket.socket, "recvmsg")
3474@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3475@unittest.skipUnless(thread, 'Threading required for this test.')
3476class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3477 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003478
3479 def testRecvmsgEOF(self):
3480 try:
3481 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3482 except OSError as e:
3483 if e.errno != errno.ENOTCONN:
3484 raise
3485 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003486
3487@requireAttrs(socket.socket, "recvmsg_into")
3488@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3489@unittest.skipUnless(thread, 'Threading required for this test.')
3490class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3491 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003492
3493 def testRecvmsgEOF(self):
3494 try:
3495 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3496 except OSError as e:
3497 if e.errno != errno.ENOTCONN:
3498 raise
3499 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003500
3501
3502class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3503 ConnectedStreamTestMixin, UnixStreamBase):
3504 pass
3505
3506@requireAttrs(socket.socket, "sendmsg")
3507@requireAttrs(socket, "AF_UNIX")
3508@unittest.skipUnless(thread, 'Threading required for this test.')
3509class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3510 pass
3511
3512@requireAttrs(socket.socket, "recvmsg")
3513@requireAttrs(socket, "AF_UNIX")
3514@unittest.skipUnless(thread, 'Threading required for this test.')
3515class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3516 SendrecvmsgUnixStreamTestBase):
3517 pass
3518
3519@requireAttrs(socket.socket, "recvmsg_into")
3520@requireAttrs(socket, "AF_UNIX")
3521@unittest.skipUnless(thread, 'Threading required for this test.')
3522class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3523 SendrecvmsgUnixStreamTestBase):
3524 pass
3525
3526@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3527@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3528@unittest.skipUnless(thread, 'Threading required for this test.')
3529class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3530 pass
3531
3532@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3533@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3534@unittest.skipUnless(thread, 'Threading required for this test.')
3535class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3536 SendrecvmsgUnixStreamTestBase):
3537 pass
3538
3539
3540# Test interrupting the interruptible send/receive methods with a
3541# signal when a timeout is set. These tests avoid having multiple
3542# threads alive during the test so that the OS cannot deliver the
3543# signal to the wrong one.
3544
3545class InterruptedTimeoutBase(unittest.TestCase):
3546 # Base class for interrupted send/receive tests. Installs an
3547 # empty handler for SIGALRM and removes it on teardown, along with
3548 # any scheduled alarms.
3549
3550 def setUp(self):
3551 super().setUp()
3552 orig_alrm_handler = signal.signal(signal.SIGALRM,
3553 lambda signum, frame: None)
3554 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3555 self.addCleanup(self.setAlarm, 0)
3556
3557 # Timeout for socket operations
3558 timeout = 4.0
3559
3560 # Provide setAlarm() method to schedule delivery of SIGALRM after
3561 # given number of seconds, or cancel it if zero, and an
3562 # appropriate time value to use. Use setitimer() if available.
3563 if hasattr(signal, "setitimer"):
3564 alarm_time = 0.05
3565
3566 def setAlarm(self, seconds):
3567 signal.setitimer(signal.ITIMER_REAL, seconds)
3568 else:
3569 # Old systems may deliver the alarm up to one second early
3570 alarm_time = 2
3571
3572 def setAlarm(self, seconds):
3573 signal.alarm(seconds)
3574
3575
3576# Require siginterrupt() in order to ensure that system calls are
3577# interrupted by default.
3578@requireAttrs(signal, "siginterrupt")
3579@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3580 "Don't have signal.alarm or signal.setitimer")
3581class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3582 # Test interrupting the recv*() methods with signals when a
3583 # timeout is set.
3584
3585 def setUp(self):
3586 super().setUp()
3587 self.serv.settimeout(self.timeout)
3588
3589 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003590 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003591 # errno of EINTR when interrupted by a signal.
3592 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003593 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003594 func(*args, **kwargs)
3595 self.assertNotIsInstance(cm.exception, socket.timeout)
3596 self.assertEqual(cm.exception.errno, errno.EINTR)
3597
3598 def testInterruptedRecvTimeout(self):
3599 self.checkInterruptedRecv(self.serv.recv, 1024)
3600
3601 def testInterruptedRecvIntoTimeout(self):
3602 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3603
3604 def testInterruptedRecvfromTimeout(self):
3605 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3606
3607 def testInterruptedRecvfromIntoTimeout(self):
3608 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3609
3610 @requireAttrs(socket.socket, "recvmsg")
3611 def testInterruptedRecvmsgTimeout(self):
3612 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3613
3614 @requireAttrs(socket.socket, "recvmsg_into")
3615 def testInterruptedRecvmsgIntoTimeout(self):
3616 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3617
3618
3619# Require siginterrupt() in order to ensure that system calls are
3620# interrupted by default.
3621@requireAttrs(signal, "siginterrupt")
3622@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3623 "Don't have signal.alarm or signal.setitimer")
3624@unittest.skipUnless(thread, 'Threading required for this test.')
3625class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3626 ThreadSafeCleanupTestCase,
3627 SocketListeningTestMixin, TCPTestBase):
3628 # Test interrupting the interruptible send*() methods with signals
3629 # when a timeout is set.
3630
3631 def setUp(self):
3632 super().setUp()
3633 self.serv_conn = self.newSocket()
3634 self.addCleanup(self.serv_conn.close)
3635 # Use a thread to complete the connection, but wait for it to
3636 # terminate before running the test, so that there is only one
3637 # thread to accept the signal.
3638 cli_thread = threading.Thread(target=self.doConnect)
3639 cli_thread.start()
3640 self.cli_conn, addr = self.serv.accept()
3641 self.addCleanup(self.cli_conn.close)
3642 cli_thread.join()
3643 self.serv_conn.settimeout(self.timeout)
3644
3645 def doConnect(self):
3646 self.serv_conn.connect(self.serv_addr)
3647
3648 def checkInterruptedSend(self, func, *args, **kwargs):
3649 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003650 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003651 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003652 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003653 while True:
3654 self.setAlarm(self.alarm_time)
3655 func(*args, **kwargs)
3656 self.assertNotIsInstance(cm.exception, socket.timeout)
3657 self.assertEqual(cm.exception.errno, errno.EINTR)
3658
Ned Deilyc5640382014-02-03 13:58:31 -08003659 # Issue #12958: The following tests have problems on OS X prior to 10.7
3660 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003661 def testInterruptedSendTimeout(self):
3662 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3663
Ned Deilyc5640382014-02-03 13:58:31 -08003664 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003665 def testInterruptedSendtoTimeout(self):
3666 # Passing an actual address here as Python's wrapper for
3667 # sendto() doesn't allow passing a zero-length one; POSIX
3668 # requires that the address is ignored since the socket is
3669 # connection-mode, however.
3670 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3671 self.serv_addr)
3672
Ned Deilyc5640382014-02-03 13:58:31 -08003673 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003674 @requireAttrs(socket.socket, "sendmsg")
3675 def testInterruptedSendmsgTimeout(self):
3676 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3677
3678
Victor Stinner45df8202010-04-28 22:31:17 +00003679@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003680class TCPCloserTest(ThreadedTCPSocketTest):
3681
3682 def testClose(self):
3683 conn, addr = self.serv.accept()
3684 conn.close()
3685
3686 sd = self.cli
3687 read, write, err = select.select([sd], [], [], 1.0)
3688 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003689 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003690
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003691 # Calling close() many times should be safe.
3692 conn.close()
3693 conn.close()
3694
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003695 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003696 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003697 time.sleep(1.0)
3698
Serhiy Storchaka43767632013-11-03 21:31:38 +02003699@unittest.skipUnless(hasattr(socket, 'socketpair'),
3700 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003701@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003702class BasicSocketPairTest(SocketPairTest):
3703
3704 def __init__(self, methodName='runTest'):
3705 SocketPairTest.__init__(self, methodName=methodName)
3706
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003707 def _check_defaults(self, sock):
3708 self.assertIsInstance(sock, socket.socket)
3709 if hasattr(socket, 'AF_UNIX'):
3710 self.assertEqual(sock.family, socket.AF_UNIX)
3711 else:
3712 self.assertEqual(sock.family, socket.AF_INET)
3713 self.assertEqual(sock.type, socket.SOCK_STREAM)
3714 self.assertEqual(sock.proto, 0)
3715
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003716 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003717 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003718
3719 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003720 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003721
Dave Cole331708b2004-08-09 04:51:41 +00003722 def testRecv(self):
3723 msg = self.serv.recv(1024)
3724 self.assertEqual(msg, MSG)
3725
3726 def _testRecv(self):
3727 self.cli.send(MSG)
3728
3729 def testSend(self):
3730 self.serv.send(MSG)
3731
3732 def _testSend(self):
3733 msg = self.cli.recv(1024)
3734 self.assertEqual(msg, MSG)
3735
Victor Stinner45df8202010-04-28 22:31:17 +00003736@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003737class NonBlockingTCPTests(ThreadedTCPSocketTest):
3738
3739 def __init__(self, methodName='runTest'):
3740 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3741
3742 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003743 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003744 self.serv.setblocking(True)
3745 self.assertIsNone(self.serv.gettimeout())
3746 self.serv.setblocking(False)
3747 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003748 start = time.time()
3749 try:
3750 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003751 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003752 pass
3753 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003754 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003755
3756 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003757 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003758
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003759 @support.cpython_only
3760 def testSetBlocking_overflow(self):
3761 # Issue 15989
3762 import _testcapi
3763 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3764 self.skipTest('needs UINT_MAX < ULONG_MAX')
3765 self.serv.setblocking(False)
3766 self.assertEqual(self.serv.gettimeout(), 0.0)
3767 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3768 self.assertIsNone(self.serv.gettimeout())
3769
3770 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3771
Serhiy Storchaka43767632013-11-03 21:31:38 +02003772 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3773 'test needs socket.SOCK_NONBLOCK')
3774 @support.requires_linux_version(2, 6, 28)
3775 def testInitNonBlocking(self):
3776 # reinit server socket
3777 self.serv.close()
3778 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3779 socket.SOCK_NONBLOCK)
3780 self.port = support.bind_port(self.serv)
3781 self.serv.listen(1)
3782 # actual testing
3783 start = time.time()
3784 try:
3785 self.serv.accept()
3786 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003787 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003788 end = time.time()
3789 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3790
3791 def _testInitNonBlocking(self):
3792 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003793
Antoine Pitrou600232b2011-01-05 21:03:42 +00003794 def testInheritFlags(self):
3795 # Issue #7995: when calling accept() on a listening socket with a
3796 # timeout, the resulting socket should not be non-blocking.
3797 self.serv.settimeout(10)
3798 try:
3799 conn, addr = self.serv.accept()
3800 message = conn.recv(len(MSG))
3801 finally:
3802 conn.close()
3803 self.serv.settimeout(None)
3804
3805 def _testInheritFlags(self):
3806 time.sleep(0.1)
3807 self.cli.connect((HOST, self.port))
3808 time.sleep(0.5)
3809 self.cli.send(MSG)
3810
Guido van Rossum24e4af82002-06-12 19:18:08 +00003811 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003812 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003813 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003814 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003815 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003816 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003817 pass
3818 else:
3819 self.fail("Error trying to do non-blocking accept.")
3820 read, write, err = select.select([self.serv], [], [])
3821 if self.serv in read:
3822 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003823 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003824 else:
3825 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003826
Guido van Rossum24e4af82002-06-12 19:18:08 +00003827 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003828 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003829 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003830
3831 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003832 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003833 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003834 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003835
3836 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003837 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003838 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003839
3840 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003841 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003842 conn, addr = self.serv.accept()
3843 conn.setblocking(0)
3844 try:
3845 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003846 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003847 pass
3848 else:
3849 self.fail("Error trying to do non-blocking recv.")
3850 read, write, err = select.select([conn], [], [])
3851 if conn in read:
3852 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003853 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003854 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003855 else:
3856 self.fail("Error during select call to non-blocking socket.")
3857
3858 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003859 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003860 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003861 self.cli.send(MSG)
3862
Victor Stinner45df8202010-04-28 22:31:17 +00003863@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003864class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003865 """Unit tests for the object returned by socket.makefile()
3866
Antoine Pitrou834bd812010-10-13 16:17:14 +00003867 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003868 the client connection. You can read from this file to
3869 get output from the server.
3870
Antoine Pitrou834bd812010-10-13 16:17:14 +00003871 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003872 server connection. You can write to this file to send output
3873 to the client.
3874 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003875
Guido van Rossume9f66142002-08-07 15:46:19 +00003876 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003877 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003878 errors = 'strict'
3879 newline = None
3880
3881 read_mode = 'rb'
3882 read_msg = MSG
3883 write_mode = 'wb'
3884 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003885
Guido van Rossum24e4af82002-06-12 19:18:08 +00003886 def __init__(self, methodName='runTest'):
3887 SocketConnectedTest.__init__(self, methodName=methodName)
3888
3889 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003890 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3891 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003892 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003893 self.read_file = self.cli_conn.makefile(
3894 self.read_mode, self.bufsize,
3895 encoding = self.encoding,
3896 errors = self.errors,
3897 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003898
3899 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003900 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003901 self.read_file.close()
3902 self.assertTrue(self.read_file.closed)
3903 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003904 SocketConnectedTest.tearDown(self)
3905
3906 def clientSetUp(self):
3907 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003908 self.write_file = self.serv_conn.makefile(
3909 self.write_mode, self.bufsize,
3910 encoding = self.encoding,
3911 errors = self.errors,
3912 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003913
3914 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003915 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003916 self.write_file.close()
3917 self.assertTrue(self.write_file.closed)
3918 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003919 SocketConnectedTest.clientTearDown(self)
3920
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003921 def testReadAfterTimeout(self):
3922 # Issue #7322: A file object must disallow further reads
3923 # after a timeout has occurred.
3924 self.cli_conn.settimeout(1)
3925 self.read_file.read(3)
3926 # First read raises a timeout
3927 self.assertRaises(socket.timeout, self.read_file.read, 1)
3928 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003929 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003930 self.read_file.read(1)
3931 self.assertIn("cannot read from timed out object", str(ctx.exception))
3932
3933 def _testReadAfterTimeout(self):
3934 self.write_file.write(self.write_msg[0:3])
3935 self.write_file.flush()
3936 self.serv_finished.wait()
3937
Guido van Rossum24e4af82002-06-12 19:18:08 +00003938 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003939 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003940 first_seg = self.read_file.read(len(self.read_msg)-3)
3941 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003942 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003943 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003944
3945 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003946 self.write_file.write(self.write_msg)
3947 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003948
Guido van Rossum8c943832002-08-08 01:00:28 +00003949 def testFullRead(self):
3950 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003951 msg = self.read_file.read()
3952 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003953
3954 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003955 self.write_file.write(self.write_msg)
3956 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003957
Guido van Rossum24e4af82002-06-12 19:18:08 +00003958 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003959 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003960 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003961 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003962 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003963 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003964 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003965 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003966 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003967
3968 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003969 self.write_file.write(self.write_msg)
3970 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003971
3972 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003973 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003974 line = self.read_file.readline()
3975 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003976
3977 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003978 self.write_file.write(self.write_msg)
3979 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003980
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003981 def testCloseAfterMakefile(self):
3982 # The file returned by makefile should keep the socket open.
3983 self.cli_conn.close()
3984 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003985 msg = self.read_file.read()
3986 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003987
3988 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003989 self.write_file.write(self.write_msg)
3990 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003991
3992 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003993 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003994 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003995 if isinstance(self.read_msg, str):
3996 msg = msg.decode()
3997 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003998
3999 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004000 self.write_file.write(self.write_msg)
4001 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004002
Tim Peters116d83c2004-03-28 02:20:45 +00004003 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004004 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004005
4006 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004007 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004008
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004009 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004010 self.assertEqual(self.read_file.mode, self.read_mode)
4011 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004012
4013 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004014 self.assertEqual(self.write_file.mode, self.write_mode)
4015 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004016
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004017 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004018 self.read_file.close()
4019 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004020 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004021 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004022
4023 def _testRealClose(self):
4024 pass
4025
4026
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004027class FileObjectInterruptedTestCase(unittest.TestCase):
4028 """Test that the file object correctly handles EINTR internally."""
4029
4030 class MockSocket(object):
4031 def __init__(self, recv_funcs=()):
4032 # A generator that returns callables that we'll call for each
4033 # call to recv().
4034 self._recv_step = iter(recv_funcs)
4035
4036 def recv_into(self, buffer):
4037 data = next(self._recv_step)()
4038 assert len(buffer) >= len(data)
4039 buffer[:len(data)] = data
4040 return len(data)
4041
4042 def _decref_socketios(self):
4043 pass
4044
4045 def _textiowrap_for_test(self, buffering=-1):
4046 raw = socket.SocketIO(self, "r")
4047 if buffering < 0:
4048 buffering = io.DEFAULT_BUFFER_SIZE
4049 if buffering == 0:
4050 return raw
4051 buffer = io.BufferedReader(raw, buffering)
4052 text = io.TextIOWrapper(buffer, None, None)
4053 text.mode = "rb"
4054 return text
4055
4056 @staticmethod
4057 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004058 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004059
4060 def _textiowrap_mock_socket(self, mock, buffering=-1):
4061 raw = socket.SocketIO(mock, "r")
4062 if buffering < 0:
4063 buffering = io.DEFAULT_BUFFER_SIZE
4064 if buffering == 0:
4065 return raw
4066 buffer = io.BufferedReader(raw, buffering)
4067 text = io.TextIOWrapper(buffer, None, None)
4068 text.mode = "rb"
4069 return text
4070
4071 def _test_readline(self, size=-1, buffering=-1):
4072 mock_sock = self.MockSocket(recv_funcs=[
4073 lambda : b"This is the first line\nAnd the sec",
4074 self._raise_eintr,
4075 lambda : b"ond line is here\n",
4076 lambda : b"",
4077 lambda : b"", # XXX(gps): io library does an extra EOF read
4078 ])
4079 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004080 self.assertEqual(fo.readline(size), "This is the first line\n")
4081 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004082
4083 def _test_read(self, size=-1, buffering=-1):
4084 mock_sock = self.MockSocket(recv_funcs=[
4085 lambda : b"This is the first line\nAnd the sec",
4086 self._raise_eintr,
4087 lambda : b"ond line is here\n",
4088 lambda : b"",
4089 lambda : b"", # XXX(gps): io library does an extra EOF read
4090 ])
4091 expecting = (b"This is the first line\n"
4092 b"And the second line is here\n")
4093 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4094 if buffering == 0:
4095 data = b''
4096 else:
4097 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004098 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004099 while len(data) != len(expecting):
4100 part = fo.read(size)
4101 if not part:
4102 break
4103 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004104 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004105
4106 def test_default(self):
4107 self._test_readline()
4108 self._test_readline(size=100)
4109 self._test_read()
4110 self._test_read(size=100)
4111
4112 def test_with_1k_buffer(self):
4113 self._test_readline(buffering=1024)
4114 self._test_readline(size=100, buffering=1024)
4115 self._test_read(buffering=1024)
4116 self._test_read(size=100, buffering=1024)
4117
4118 def _test_readline_no_buffer(self, size=-1):
4119 mock_sock = self.MockSocket(recv_funcs=[
4120 lambda : b"a",
4121 lambda : b"\n",
4122 lambda : b"B",
4123 self._raise_eintr,
4124 lambda : b"b",
4125 lambda : b"",
4126 ])
4127 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004128 self.assertEqual(fo.readline(size), b"a\n")
4129 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004130
4131 def test_no_buffer(self):
4132 self._test_readline_no_buffer()
4133 self._test_readline_no_buffer(size=4)
4134 self._test_read(buffering=0)
4135 self._test_read(size=100, buffering=0)
4136
4137
Guido van Rossume9f66142002-08-07 15:46:19 +00004138class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4139
4140 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004141
Guido van Rossume9f66142002-08-07 15:46:19 +00004142 In this case (and in this case only), it should be possible to
4143 create a file object, read a line from it, create another file
4144 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004145 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004146 when reading multiple requests from the same socket."""
4147
4148 bufsize = 0 # Use unbuffered mode
4149
4150 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004151 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004152 line = self.read_file.readline() # first line
4153 self.assertEqual(line, b"A. " + self.write_msg) # first line
4154 self.read_file = self.cli_conn.makefile('rb', 0)
4155 line = self.read_file.readline() # second line
4156 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004157
4158 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004159 self.write_file.write(b"A. " + self.write_msg)
4160 self.write_file.write(b"B. " + self.write_msg)
4161 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004162
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004163 def testMakefileClose(self):
4164 # The file returned by makefile should keep the socket open...
4165 self.cli_conn.close()
4166 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004167 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004168 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004169 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004170 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004171
4172 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004173 self.write_file.write(self.write_msg)
4174 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004175
4176 def testMakefileCloseSocketDestroy(self):
4177 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004178 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004179 refcount_after = sys.getrefcount(self.cli_conn)
4180 self.assertEqual(refcount_before - 1, refcount_after)
4181
4182 def _testMakefileCloseSocketDestroy(self):
4183 pass
4184
Antoine Pitrou98b46702010-09-18 22:59:00 +00004185 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004186 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004187 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4188
4189 def testSmallReadNonBlocking(self):
4190 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004191 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4192 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004193 self.evt1.set()
4194 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004195 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004196 if first_seg is None:
4197 # Data not arrived (can happen under Windows), wait a bit
4198 time.sleep(0.5)
4199 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004200 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004201 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004202 self.assertEqual(n, 3)
4203 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004204 self.assertEqual(msg, self.read_msg)
4205 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4206 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004207
4208 def _testSmallReadNonBlocking(self):
4209 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004210 self.write_file.write(self.write_msg)
4211 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004212 self.evt2.set()
4213 # Avoid cloding the socket before the server test has finished,
4214 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4215 self.serv_finished.wait(5.0)
4216
4217 def testWriteNonBlocking(self):
4218 self.cli_finished.wait(5.0)
4219 # The client thread can't skip directly - the SkipTest exception
4220 # would appear as a failure.
4221 if self.serv_skipped:
4222 self.skipTest(self.serv_skipped)
4223
4224 def _testWriteNonBlocking(self):
4225 self.serv_skipped = None
4226 self.serv_conn.setblocking(False)
4227 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004228 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004229 LIMIT = 10
4230 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004231 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004232 self.assertGreater(n, 0)
4233 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004234 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004235 if n is None:
4236 # Succeeded
4237 break
4238 self.assertGreater(n, 0)
4239 else:
4240 # Let us know that this test didn't manage to establish
4241 # the expected conditions. This is not a failure in itself but,
4242 # if it happens repeatedly, the test should be fixed.
4243 self.serv_skipped = "failed to saturate the socket buffer"
4244
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004245
Guido van Rossum8c943832002-08-08 01:00:28 +00004246class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4247
4248 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4249
4250
4251class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4252
4253 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004254
Thomas Woutersb2137042007-02-01 18:02:27 +00004255
Antoine Pitrou834bd812010-10-13 16:17:14 +00004256class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4257 """Tests for socket.makefile() in text mode (rather than binary)"""
4258
4259 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004260 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004261 write_mode = 'wb'
4262 write_msg = MSG
4263 newline = ''
4264
4265
4266class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4267 """Tests for socket.makefile() in text mode (rather than binary)"""
4268
4269 read_mode = 'rb'
4270 read_msg = MSG
4271 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004272 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004273 newline = ''
4274
4275
4276class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4277 """Tests for socket.makefile() in text mode (rather than binary)"""
4278
4279 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004280 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004281 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004282 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004283 newline = ''
4284
4285
Guido van Rossumd8faa362007-04-27 19:54:29 +00004286class NetworkConnectionTest(object):
4287 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004288
Guido van Rossumd8faa362007-04-27 19:54:29 +00004289 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004290 # We're inherited below by BasicTCPTest2, which also inherits
4291 # BasicTCPTest, which defines self.port referenced below.
4292 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004293 self.serv_conn = self.cli
4294
4295class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4296 """Tests that NetworkConnection does not break existing TCP functionality.
4297 """
4298
4299class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004300
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004301 class MockSocket(socket.socket):
4302 def connect(self, *args):
4303 raise socket.timeout('timed out')
4304
4305 @contextlib.contextmanager
4306 def mocked_socket_module(self):
4307 """Return a socket which times out on connect"""
4308 old_socket = socket.socket
4309 socket.socket = self.MockSocket
4310 try:
4311 yield
4312 finally:
4313 socket.socket = old_socket
4314
4315 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004316 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004317 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004318 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004319 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004320 cli.connect((HOST, port))
4321 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4322
4323 def test_create_connection(self):
4324 # Issue #9792: errors raised by create_connection() should have
4325 # a proper errno attribute.
4326 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004327 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004328 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004329
4330 # Issue #16257: create_connection() calls getaddrinfo() against
4331 # 'localhost'. This may result in an IPV6 addr being returned
4332 # as well as an IPV4 one:
4333 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4334 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4335 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4336 #
4337 # create_connection() enumerates through all the addresses returned
4338 # and if it doesn't successfully bind to any of them, it propagates
4339 # the last exception it encountered.
4340 #
4341 # On Solaris, ENETUNREACH is returned in this circumstance instead
4342 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4343 # expected errnos.
4344 expected_errnos = [ errno.ECONNREFUSED, ]
4345 if hasattr(errno, 'ENETUNREACH'):
4346 expected_errnos.append(errno.ENETUNREACH)
4347
4348 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004349
4350 def test_create_connection_timeout(self):
4351 # Issue #9792: create_connection() should not recast timeout errors
4352 # as generic socket errors.
4353 with self.mocked_socket_module():
4354 with self.assertRaises(socket.timeout):
4355 socket.create_connection((HOST, 1234))
4356
Guido van Rossumd8faa362007-04-27 19:54:29 +00004357
Victor Stinner45df8202010-04-28 22:31:17 +00004358@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004359class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4360
4361 def __init__(self, methodName='runTest'):
4362 SocketTCPTest.__init__(self, methodName=methodName)
4363 ThreadableTest.__init__(self)
4364
4365 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004366 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004367
4368 def clientTearDown(self):
4369 self.cli.close()
4370 self.cli = None
4371 ThreadableTest.clientTearDown(self)
4372
4373 def _justAccept(self):
4374 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004375 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004376
4377 testFamily = _justAccept
4378 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004379 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004380 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004381 self.assertEqual(self.cli.family, 2)
4382
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004383 testSourceAddress = _justAccept
4384 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004385 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4386 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004387 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004388 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004389 # The port number being used is sufficient to show that the bind()
4390 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004391
Guido van Rossumd8faa362007-04-27 19:54:29 +00004392 testTimeoutDefault = _justAccept
4393 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004394 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004395 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004396 socket.setdefaulttimeout(42)
4397 try:
4398 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004399 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004400 finally:
4401 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004402 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004403
4404 testTimeoutNone = _justAccept
4405 def _testTimeoutNone(self):
4406 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004407 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004408 socket.setdefaulttimeout(30)
4409 try:
4410 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004411 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004412 finally:
4413 socket.setdefaulttimeout(None)
4414 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004415
4416 testTimeoutValueNamed = _justAccept
4417 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004418 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004419 self.assertEqual(self.cli.gettimeout(), 30)
4420
4421 testTimeoutValueNonamed = _justAccept
4422 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004423 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004424 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004425 self.assertEqual(self.cli.gettimeout(), 30)
4426
Victor Stinner45df8202010-04-28 22:31:17 +00004427@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004428class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4429
4430 def __init__(self, methodName='runTest'):
4431 SocketTCPTest.__init__(self, methodName=methodName)
4432 ThreadableTest.__init__(self)
4433
4434 def clientSetUp(self):
4435 pass
4436
4437 def clientTearDown(self):
4438 self.cli.close()
4439 self.cli = None
4440 ThreadableTest.clientTearDown(self)
4441
4442 def testInsideTimeout(self):
4443 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004444 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004445 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004446 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004447 testOutsideTimeout = testInsideTimeout
4448
4449 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004450 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004451 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004452 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004453
4454 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004455 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004456 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004457
4458
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004459class TCPTimeoutTest(SocketTCPTest):
4460
4461 def testTCPTimeout(self):
4462 def raise_timeout(*args, **kwargs):
4463 self.serv.settimeout(1.0)
4464 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004465 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004466 "Error generating a timeout exception (TCP)")
4467
4468 def testTimeoutZero(self):
4469 ok = False
4470 try:
4471 self.serv.settimeout(0.0)
4472 foo = self.serv.accept()
4473 except socket.timeout:
4474 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004475 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004476 ok = True
4477 except:
4478 self.fail("caught unexpected exception (TCP)")
4479 if not ok:
4480 self.fail("accept() returned success when we did not expect it")
4481
Serhiy Storchaka43767632013-11-03 21:31:38 +02004482 @unittest.skipUnless(hasattr(signal, 'alarm'),
4483 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004484 def testInterruptedTimeout(self):
4485 # XXX I don't know how to do this test on MSWindows or any other
4486 # plaform that doesn't support signal.alarm() or os.kill(), though
4487 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004488 self.serv.settimeout(5.0) # must be longer than alarm
4489 class Alarm(Exception):
4490 pass
4491 def alarm_handler(signal, frame):
4492 raise Alarm
4493 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4494 try:
4495 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4496 try:
4497 foo = self.serv.accept()
4498 except socket.timeout:
4499 self.fail("caught timeout instead of Alarm")
4500 except Alarm:
4501 pass
4502 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004503 self.fail("caught other exception instead of Alarm:"
4504 " %s(%s):\n%s" %
4505 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004506 else:
4507 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004508 finally:
4509 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004510 except Alarm:
4511 self.fail("got Alarm in wrong place")
4512 finally:
4513 # no alarm can be pending. Safe to restore old handler.
4514 signal.signal(signal.SIGALRM, old_alarm)
4515
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004516class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004517
4518 def testUDPTimeout(self):
4519 def raise_timeout(*args, **kwargs):
4520 self.serv.settimeout(1.0)
4521 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004522 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004523 "Error generating a timeout exception (UDP)")
4524
4525 def testTimeoutZero(self):
4526 ok = False
4527 try:
4528 self.serv.settimeout(0.0)
4529 foo = self.serv.recv(1024)
4530 except socket.timeout:
4531 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004532 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004533 ok = True
4534 except:
4535 self.fail("caught unexpected exception (UDP)")
4536 if not ok:
4537 self.fail("recv() returned success when we did not expect it")
4538
4539class TestExceptions(unittest.TestCase):
4540
4541 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004542 self.assertTrue(issubclass(OSError, Exception))
4543 self.assertTrue(issubclass(socket.herror, OSError))
4544 self.assertTrue(issubclass(socket.gaierror, OSError))
4545 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004546
Serhiy Storchaka43767632013-11-03 21:31:38 +02004547@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004548class TestLinuxAbstractNamespace(unittest.TestCase):
4549
4550 UNIX_PATH_MAX = 108
4551
4552 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004553 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004554 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4555 s1.bind(address)
4556 s1.listen(1)
4557 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4558 s2.connect(s1.getsockname())
4559 with s1.accept()[0] as s3:
4560 self.assertEqual(s1.getsockname(), address)
4561 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004562
4563 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004564 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004565 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4566 s.bind(address)
4567 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004568
4569 def testNameOverflow(self):
4570 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004571 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004572 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004573
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004574 def testStrName(self):
4575 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004576 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4577 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004578 s.bind("\x00python\x00test\x00")
4579 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004580 finally:
4581 s.close()
4582
Serhiy Storchaka43767632013-11-03 21:31:38 +02004583@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004584class TestUnixDomain(unittest.TestCase):
4585
4586 def setUp(self):
4587 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4588
4589 def tearDown(self):
4590 self.sock.close()
4591
4592 def encoded(self, path):
4593 # Return the given path encoded in the file system encoding,
4594 # or skip the test if this is not possible.
4595 try:
4596 return os.fsencode(path)
4597 except UnicodeEncodeError:
4598 self.skipTest(
4599 "Pathname {0!a} cannot be represented in file "
4600 "system encoding {1!r}".format(
4601 path, sys.getfilesystemencoding()))
4602
Antoine Pitrou16374872011-12-16 15:04:12 +01004603 def bind(self, sock, path):
4604 # Bind the socket
4605 try:
4606 sock.bind(path)
4607 except OSError as e:
4608 if str(e) == "AF_UNIX path too long":
4609 self.skipTest(
4610 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4611 .format(path))
4612 else:
4613 raise
4614
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004615 def testStrAddr(self):
4616 # Test binding to and retrieving a normal string pathname.
4617 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004618 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004619 self.addCleanup(support.unlink, path)
4620 self.assertEqual(self.sock.getsockname(), path)
4621
4622 def testBytesAddr(self):
4623 # Test binding to a bytes pathname.
4624 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004625 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004626 self.addCleanup(support.unlink, path)
4627 self.assertEqual(self.sock.getsockname(), path)
4628
4629 def testSurrogateescapeBind(self):
4630 # Test binding to a valid non-ASCII pathname, with the
4631 # non-ASCII bytes supplied using surrogateescape encoding.
4632 path = os.path.abspath(support.TESTFN_UNICODE)
4633 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004634 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004635 self.addCleanup(support.unlink, path)
4636 self.assertEqual(self.sock.getsockname(), path)
4637
4638 def testUnencodableAddr(self):
4639 # Test binding to a pathname that cannot be encoded in the
4640 # file system encoding.
4641 if support.TESTFN_UNENCODABLE is None:
4642 self.skipTest("No unencodable filename available")
4643 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004644 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004645 self.addCleanup(support.unlink, path)
4646 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004647
Victor Stinner45df8202010-04-28 22:31:17 +00004648@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004649class BufferIOTest(SocketConnectedTest):
4650 """
4651 Test the buffer versions of socket.recv() and socket.send().
4652 """
4653 def __init__(self, methodName='runTest'):
4654 SocketConnectedTest.__init__(self, methodName=methodName)
4655
Antoine Pitrou25480782010-03-17 22:50:28 +00004656 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004657 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004658 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004659 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004660 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004661 self.assertEqual(msg, MSG)
4662
Antoine Pitrou25480782010-03-17 22:50:28 +00004663 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004664 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004665 self.serv_conn.send(buf)
4666
Antoine Pitrou25480782010-03-17 22:50:28 +00004667 def testRecvIntoBytearray(self):
4668 buf = bytearray(1024)
4669 nbytes = self.cli_conn.recv_into(buf)
4670 self.assertEqual(nbytes, len(MSG))
4671 msg = buf[:len(MSG)]
4672 self.assertEqual(msg, MSG)
4673
4674 _testRecvIntoBytearray = _testRecvIntoArray
4675
4676 def testRecvIntoMemoryview(self):
4677 buf = bytearray(1024)
4678 nbytes = self.cli_conn.recv_into(memoryview(buf))
4679 self.assertEqual(nbytes, len(MSG))
4680 msg = buf[:len(MSG)]
4681 self.assertEqual(msg, MSG)
4682
4683 _testRecvIntoMemoryview = _testRecvIntoArray
4684
4685 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004686 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004687 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004688 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004689 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004690 self.assertEqual(msg, MSG)
4691
Antoine Pitrou25480782010-03-17 22:50:28 +00004692 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004693 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004694 self.serv_conn.send(buf)
4695
Antoine Pitrou25480782010-03-17 22:50:28 +00004696 def testRecvFromIntoBytearray(self):
4697 buf = bytearray(1024)
4698 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4699 self.assertEqual(nbytes, len(MSG))
4700 msg = buf[:len(MSG)]
4701 self.assertEqual(msg, MSG)
4702
4703 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4704
4705 def testRecvFromIntoMemoryview(self):
4706 buf = bytearray(1024)
4707 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4708 self.assertEqual(nbytes, len(MSG))
4709 msg = buf[:len(MSG)]
4710 self.assertEqual(msg, MSG)
4711
4712 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4713
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004714 def testRecvFromIntoSmallBuffer(self):
4715 # See issue #20246.
4716 buf = bytearray(8)
4717 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4718
4719 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004720 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004721
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004722 def testRecvFromIntoEmptyBuffer(self):
4723 buf = bytearray()
4724 self.cli_conn.recvfrom_into(buf)
4725 self.cli_conn.recvfrom_into(buf, 0)
4726
4727 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4728
Christian Heimes043d6f62008-01-07 17:19:16 +00004729
4730TIPC_STYPE = 2000
4731TIPC_LOWER = 200
4732TIPC_UPPER = 210
4733
4734def isTipcAvailable():
4735 """Check if the TIPC module is loaded
4736
4737 The TIPC module is not loaded automatically on Ubuntu and probably
4738 other Linux distros.
4739 """
4740 if not hasattr(socket, "AF_TIPC"):
4741 return False
4742 if not os.path.isfile("/proc/modules"):
4743 return False
4744 with open("/proc/modules") as f:
4745 for line in f:
4746 if line.startswith("tipc "):
4747 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004748 return False
4749
Serhiy Storchaka43767632013-11-03 21:31:38 +02004750@unittest.skipUnless(isTipcAvailable(),
4751 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004752class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004753 def testRDM(self):
4754 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4755 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004756 self.addCleanup(srv.close)
4757 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004758
4759 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4760 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4761 TIPC_LOWER, TIPC_UPPER)
4762 srv.bind(srvaddr)
4763
4764 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4765 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4766 cli.sendto(MSG, sendaddr)
4767
4768 msg, recvaddr = srv.recvfrom(1024)
4769
4770 self.assertEqual(cli.getsockname(), recvaddr)
4771 self.assertEqual(msg, MSG)
4772
4773
Serhiy Storchaka43767632013-11-03 21:31:38 +02004774@unittest.skipUnless(isTipcAvailable(),
4775 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004776class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004777 def __init__(self, methodName = 'runTest'):
4778 unittest.TestCase.__init__(self, methodName = methodName)
4779 ThreadableTest.__init__(self)
4780
4781 def setUp(self):
4782 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004783 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004784 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4785 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4786 TIPC_LOWER, TIPC_UPPER)
4787 self.srv.bind(srvaddr)
4788 self.srv.listen(5)
4789 self.serverExplicitReady()
4790 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004791 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004792
4793 def clientSetUp(self):
4794 # The is a hittable race between serverExplicitReady() and the
4795 # accept() call; sleep a little while to avoid it, otherwise
4796 # we could get an exception
4797 time.sleep(0.1)
4798 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004799 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004800 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4801 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4802 self.cli.connect(addr)
4803 self.cliaddr = self.cli.getsockname()
4804
4805 def testStream(self):
4806 msg = self.conn.recv(1024)
4807 self.assertEqual(msg, MSG)
4808 self.assertEqual(self.cliaddr, self.connaddr)
4809
4810 def _testStream(self):
4811 self.cli.send(MSG)
4812 self.cli.close()
4813
4814
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004815@unittest.skipUnless(thread, 'Threading required for this test.')
4816class ContextManagersTest(ThreadedTCPSocketTest):
4817
4818 def _testSocketClass(self):
4819 # base test
4820 with socket.socket() as sock:
4821 self.assertFalse(sock._closed)
4822 self.assertTrue(sock._closed)
4823 # close inside with block
4824 with socket.socket() as sock:
4825 sock.close()
4826 self.assertTrue(sock._closed)
4827 # exception inside with block
4828 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004829 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004830 self.assertTrue(sock._closed)
4831
4832 def testCreateConnectionBase(self):
4833 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004834 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004835 data = conn.recv(1024)
4836 conn.sendall(data)
4837
4838 def _testCreateConnectionBase(self):
4839 address = self.serv.getsockname()
4840 with socket.create_connection(address) as sock:
4841 self.assertFalse(sock._closed)
4842 sock.sendall(b'foo')
4843 self.assertEqual(sock.recv(1024), b'foo')
4844 self.assertTrue(sock._closed)
4845
4846 def testCreateConnectionClose(self):
4847 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004848 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004849 data = conn.recv(1024)
4850 conn.sendall(data)
4851
4852 def _testCreateConnectionClose(self):
4853 address = self.serv.getsockname()
4854 with socket.create_connection(address) as sock:
4855 sock.close()
4856 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004857 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004858
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004859
Victor Stinnerdaf45552013-08-28 00:53:59 +02004860class InheritanceTest(unittest.TestCase):
4861 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4862 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004863 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004864 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004865 with socket.socket(socket.AF_INET,
4866 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4867 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004868 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004869
4870 def test_default_inheritable(self):
4871 sock = socket.socket()
4872 with sock:
4873 self.assertEqual(sock.get_inheritable(), False)
4874
4875 def test_dup(self):
4876 sock = socket.socket()
4877 with sock:
4878 newsock = sock.dup()
4879 sock.close()
4880 with newsock:
4881 self.assertEqual(newsock.get_inheritable(), False)
4882
4883 def test_set_inheritable(self):
4884 sock = socket.socket()
4885 with sock:
4886 sock.set_inheritable(True)
4887 self.assertEqual(sock.get_inheritable(), True)
4888
4889 sock.set_inheritable(False)
4890 self.assertEqual(sock.get_inheritable(), False)
4891
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004892 @unittest.skipIf(fcntl is None, "need fcntl")
4893 def test_get_inheritable_cloexec(self):
4894 sock = socket.socket()
4895 with sock:
4896 fd = sock.fileno()
4897 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004898
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004899 # clear FD_CLOEXEC flag
4900 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4901 flags &= ~fcntl.FD_CLOEXEC
4902 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004903
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004904 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004905
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004906 @unittest.skipIf(fcntl is None, "need fcntl")
4907 def test_set_inheritable_cloexec(self):
4908 sock = socket.socket()
4909 with sock:
4910 fd = sock.fileno()
4911 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4912 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004913
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004914 sock.set_inheritable(True)
4915 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4916 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004917
4918
Victor Stinnerdaf45552013-08-28 00:53:59 +02004919 @unittest.skipUnless(hasattr(socket, "socketpair"),
4920 "need socket.socketpair()")
4921 def test_socketpair(self):
4922 s1, s2 = socket.socketpair()
4923 self.addCleanup(s1.close)
4924 self.addCleanup(s2.close)
4925 self.assertEqual(s1.get_inheritable(), False)
4926 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004927
4928
4929@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4930 "SOCK_NONBLOCK not defined")
4931class NonblockConstantTest(unittest.TestCase):
4932 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4933 if nonblock:
4934 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4935 self.assertEqual(s.gettimeout(), timeout)
4936 else:
4937 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4938 self.assertEqual(s.gettimeout(), None)
4939
Charles-François Natali239bb962011-06-03 12:55:15 +02004940 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004941 def test_SOCK_NONBLOCK(self):
4942 # a lot of it seems silly and redundant, but I wanted to test that
4943 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004944 with socket.socket(socket.AF_INET,
4945 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4946 self.checkNonblock(s)
4947 s.setblocking(1)
4948 self.checkNonblock(s, False)
4949 s.setblocking(0)
4950 self.checkNonblock(s)
4951 s.settimeout(None)
4952 self.checkNonblock(s, False)
4953 s.settimeout(2.0)
4954 self.checkNonblock(s, timeout=2.0)
4955 s.setblocking(1)
4956 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004957 # defaulttimeout
4958 t = socket.getdefaulttimeout()
4959 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004960 with socket.socket() as s:
4961 self.checkNonblock(s)
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(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004966 with socket.socket() as s:
4967 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004968 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004969 with socket.socket() as s:
4970 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004971 socket.setdefaulttimeout(t)
4972
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004973
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004974@unittest.skipUnless(os.name == "nt", "Windows specific")
4975@unittest.skipUnless(multiprocessing, "need multiprocessing")
4976class TestSocketSharing(SocketTCPTest):
4977 # This must be classmethod and not staticmethod or multiprocessing
4978 # won't be able to bootstrap it.
4979 @classmethod
4980 def remoteProcessServer(cls, q):
4981 # Recreate socket from shared data
4982 sdata = q.get()
4983 message = q.get()
4984
4985 s = socket.fromshare(sdata)
4986 s2, c = s.accept()
4987
4988 # Send the message
4989 s2.sendall(message)
4990 s2.close()
4991 s.close()
4992
4993 def testShare(self):
4994 # Transfer the listening server socket to another process
4995 # and service it from there.
4996
4997 # Create process:
4998 q = multiprocessing.Queue()
4999 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5000 p.start()
5001
5002 # Get the shared socket data
5003 data = self.serv.share(p.pid)
5004
5005 # Pass the shared socket to the other process
5006 addr = self.serv.getsockname()
5007 self.serv.close()
5008 q.put(data)
5009
5010 # The data that the server will send us
5011 message = b"slapmahfro"
5012 q.put(message)
5013
5014 # Connect
5015 s = socket.create_connection(addr)
5016 # listen for the data
5017 m = []
5018 while True:
5019 data = s.recv(100)
5020 if not data:
5021 break
5022 m.append(data)
5023 s.close()
5024 received = b"".join(m)
5025 self.assertEqual(received, message)
5026 p.join()
5027
5028 def testShareLength(self):
5029 data = self.serv.share(os.getpid())
5030 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5031 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5032
5033 def compareSockets(self, org, other):
5034 # socket sharing is expected to work only for blocking socket
5035 # since the internal python timout value isn't transfered.
5036 self.assertEqual(org.gettimeout(), None)
5037 self.assertEqual(org.gettimeout(), other.gettimeout())
5038
5039 self.assertEqual(org.family, other.family)
5040 self.assertEqual(org.type, other.type)
5041 # If the user specified "0" for proto, then
5042 # internally windows will have picked the correct value.
5043 # Python introspection on the socket however will still return
5044 # 0. For the shared socket, the python value is recreated
5045 # from the actual value, so it may not compare correctly.
5046 if org.proto != 0:
5047 self.assertEqual(org.proto, other.proto)
5048
5049 def testShareLocal(self):
5050 data = self.serv.share(os.getpid())
5051 s = socket.fromshare(data)
5052 try:
5053 self.compareSockets(self.serv, s)
5054 finally:
5055 s.close()
5056
5057 def testTypes(self):
5058 families = [socket.AF_INET, socket.AF_INET6]
5059 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5060 for f in families:
5061 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005062 try:
5063 source = socket.socket(f, t)
5064 except OSError:
5065 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005066 try:
5067 data = source.share(os.getpid())
5068 shared = socket.fromshare(data)
5069 try:
5070 self.compareSockets(source, shared)
5071 finally:
5072 shared.close()
5073 finally:
5074 source.close()
5075
5076
Guido van Rossumb995eb72002-07-31 16:08:40 +00005077def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005078 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005079 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005080
5081 tests.extend([
5082 NonBlockingTCPTests,
5083 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005084 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005085 UnbufferedFileObjectClassTestCase,
5086 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005087 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005088 UnicodeReadFileObjectClassTestCase,
5089 UnicodeWriteFileObjectClassTestCase,
5090 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005091 NetworkConnectionNoServer,
5092 NetworkConnectionAttributesTest,
5093 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005094 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005095 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005096 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005097 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005098 tests.append(BasicSocketPairTest)
5099 tests.append(TestUnixDomain)
5100 tests.append(TestLinuxAbstractNamespace)
5101 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005102 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005103 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005104 tests.extend([
5105 CmsgMacroTests,
5106 SendmsgUDPTest,
5107 RecvmsgUDPTest,
5108 RecvmsgIntoUDPTest,
5109 SendmsgUDP6Test,
5110 RecvmsgUDP6Test,
5111 RecvmsgRFC3542AncillaryUDP6Test,
5112 RecvmsgIntoRFC3542AncillaryUDP6Test,
5113 RecvmsgIntoUDP6Test,
5114 SendmsgTCPTest,
5115 RecvmsgTCPTest,
5116 RecvmsgIntoTCPTest,
5117 SendmsgSCTPStreamTest,
5118 RecvmsgSCTPStreamTest,
5119 RecvmsgIntoSCTPStreamTest,
5120 SendmsgUnixStreamTest,
5121 RecvmsgUnixStreamTest,
5122 RecvmsgIntoUnixStreamTest,
5123 RecvmsgSCMRightsStreamTest,
5124 RecvmsgIntoSCMRightsStreamTest,
5125 # These are slow when setitimer() is not available
5126 InterruptedRecvTimeoutTest,
5127 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005128 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005129 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005130
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005131 thread_info = support.threading_setup()
5132 support.run_unittest(*tests)
5133 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005134
5135if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005136 test_main()