blob: b1ce058b6419418a5b1dacc38041f0ec1df8209d [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.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001459@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001460class CANTest(ThreadedCANSocketTest):
1461
Charles-François Natali47413c12011-10-06 19:47:44 +02001462 def __init__(self, methodName='runTest'):
1463 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1464
1465 @classmethod
1466 def build_can_frame(cls, can_id, data):
1467 """Build a CAN frame."""
1468 can_dlc = len(data)
1469 data = data.ljust(8, b'\x00')
1470 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1471
1472 @classmethod
1473 def dissect_can_frame(cls, frame):
1474 """Dissect a CAN frame."""
1475 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1476 return (can_id, can_dlc, data[:can_dlc])
1477
1478 def testSendFrame(self):
1479 cf, addr = self.s.recvfrom(self.bufsize)
1480 self.assertEqual(self.cf, cf)
1481 self.assertEqual(addr[0], self.interface)
1482 self.assertEqual(addr[1], socket.AF_CAN)
1483
1484 def _testSendFrame(self):
1485 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1486 self.cli.send(self.cf)
1487
1488 def testSendMaxFrame(self):
1489 cf, addr = self.s.recvfrom(self.bufsize)
1490 self.assertEqual(self.cf, cf)
1491
1492 def _testSendMaxFrame(self):
1493 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1494 self.cli.send(self.cf)
1495
1496 def testSendMultiFrames(self):
1497 cf, addr = self.s.recvfrom(self.bufsize)
1498 self.assertEqual(self.cf1, cf)
1499
1500 cf, addr = self.s.recvfrom(self.bufsize)
1501 self.assertEqual(self.cf2, cf)
1502
1503 def _testSendMultiFrames(self):
1504 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1505 self.cli.send(self.cf1)
1506
1507 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1508 self.cli.send(self.cf2)
1509
Charles-François Natali773e42d2013-02-05 19:42:01 +01001510 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1511 'socket.CAN_BCM required for this test.')
1512 def _testBCM(self):
1513 cf, addr = self.cli.recvfrom(self.bufsize)
1514 self.assertEqual(self.cf, cf)
1515 can_id, can_dlc, data = self.dissect_can_frame(cf)
1516 self.assertEqual(self.can_id, can_id)
1517 self.assertEqual(self.data, data)
1518
1519 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1520 'socket.CAN_BCM required for this test.')
1521 def testBCM(self):
1522 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1523 self.addCleanup(bcm.close)
1524 bcm.connect((self.interface,))
1525 self.can_id = 0x123
1526 self.data = bytes([0xc0, 0xff, 0xee])
1527 self.cf = self.build_can_frame(self.can_id, self.data)
1528 opcode = socket.CAN_BCM_TX_SEND
1529 flags = 0
1530 count = 0
1531 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1532 bcm_can_id = 0x0222
1533 nframes = 1
1534 assert len(self.cf) == 16
1535 header = struct.pack(self.bcm_cmd_msg_fmt,
1536 opcode,
1537 flags,
1538 count,
1539 ival1_seconds,
1540 ival1_usec,
1541 ival2_seconds,
1542 ival2_usec,
1543 bcm_can_id,
1544 nframes,
1545 )
1546 header_plus_frame = header + self.cf
1547 bytes_sent = bcm.send(header_plus_frame)
1548 self.assertEqual(bytes_sent, len(header_plus_frame))
1549
Charles-François Natali47413c12011-10-06 19:47:44 +02001550
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001551@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1552class BasicRDSTest(unittest.TestCase):
1553
1554 def testCrucialConstants(self):
1555 socket.AF_RDS
1556 socket.PF_RDS
1557
1558 def testCreateSocket(self):
1559 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1560 pass
1561
1562 def testSocketBufferSize(self):
1563 bufsize = 16384
1564 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1565 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1566 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1567
1568
1569@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1570@unittest.skipUnless(thread, 'Threading required for this test.')
1571class RDSTest(ThreadedRDSSocketTest):
1572
1573 def __init__(self, methodName='runTest'):
1574 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1575
Charles-François Natali240c55f2011-11-10 20:33:36 +01001576 def setUp(self):
1577 super().setUp()
1578 self.evt = threading.Event()
1579
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001580 def testSendAndRecv(self):
1581 data, addr = self.serv.recvfrom(self.bufsize)
1582 self.assertEqual(self.data, data)
1583 self.assertEqual(self.cli_addr, addr)
1584
1585 def _testSendAndRecv(self):
1586 self.data = b'spam'
1587 self.cli.sendto(self.data, 0, (HOST, self.port))
1588
1589 def testPeek(self):
1590 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1591 self.assertEqual(self.data, data)
1592 data, addr = self.serv.recvfrom(self.bufsize)
1593 self.assertEqual(self.data, data)
1594
1595 def _testPeek(self):
1596 self.data = b'spam'
1597 self.cli.sendto(self.data, 0, (HOST, self.port))
1598
1599 @requireAttrs(socket.socket, 'recvmsg')
1600 def testSendAndRecvMsg(self):
1601 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1602 self.assertEqual(self.data, data)
1603
1604 @requireAttrs(socket.socket, 'sendmsg')
1605 def _testSendAndRecvMsg(self):
1606 self.data = b'hello ' * 10
1607 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1608
1609 def testSendAndRecvMulti(self):
1610 data, addr = self.serv.recvfrom(self.bufsize)
1611 self.assertEqual(self.data1, data)
1612
1613 data, addr = self.serv.recvfrom(self.bufsize)
1614 self.assertEqual(self.data2, data)
1615
1616 def _testSendAndRecvMulti(self):
1617 self.data1 = b'bacon'
1618 self.cli.sendto(self.data1, 0, (HOST, self.port))
1619
1620 self.data2 = b'egg'
1621 self.cli.sendto(self.data2, 0, (HOST, self.port))
1622
1623 def testSelect(self):
1624 r, w, x = select.select([self.serv], [], [], 3.0)
1625 self.assertIn(self.serv, r)
1626 data, addr = self.serv.recvfrom(self.bufsize)
1627 self.assertEqual(self.data, data)
1628
1629 def _testSelect(self):
1630 self.data = b'select'
1631 self.cli.sendto(self.data, 0, (HOST, self.port))
1632
1633 def testCongestion(self):
1634 # wait until the sender is done
1635 self.evt.wait()
1636
1637 def _testCongestion(self):
1638 # test the behavior in case of congestion
1639 self.data = b'fill'
1640 self.cli.setblocking(False)
1641 try:
1642 # try to lower the receiver's socket buffer size
1643 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1644 except OSError:
1645 pass
1646 with self.assertRaises(OSError) as cm:
1647 try:
1648 # fill the receiver's socket buffer
1649 while True:
1650 self.cli.sendto(self.data, 0, (HOST, self.port))
1651 finally:
1652 # signal the receiver we're done
1653 self.evt.set()
1654 # sendto() should have failed with ENOBUFS
1655 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1656 # and we should have received a congestion notification through poll
1657 r, w, x = select.select([self.serv], [], [], 3.0)
1658 self.assertIn(self.serv, r)
1659
1660
Victor Stinner45df8202010-04-28 22:31:17 +00001661@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001662class BasicTCPTest(SocketConnectedTest):
1663
1664 def __init__(self, methodName='runTest'):
1665 SocketConnectedTest.__init__(self, methodName=methodName)
1666
1667 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001668 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001669 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001670 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001671
1672 def _testRecv(self):
1673 self.serv_conn.send(MSG)
1674
1675 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001676 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001677 seg1 = self.cli_conn.recv(len(MSG) - 3)
1678 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001679 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001680 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001681
1682 def _testOverFlowRecv(self):
1683 self.serv_conn.send(MSG)
1684
1685 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001686 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001687 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001688 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001689
1690 def _testRecvFrom(self):
1691 self.serv_conn.send(MSG)
1692
1693 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001694 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001695 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1696 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001697 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001698 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001699
1700 def _testOverFlowRecvFrom(self):
1701 self.serv_conn.send(MSG)
1702
1703 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001704 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001705 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001706 while 1:
1707 read = self.cli_conn.recv(1024)
1708 if not read:
1709 break
Guido van Rossume531e292002-08-08 20:28:34 +00001710 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001711 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001712
1713 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001714 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001715 self.serv_conn.sendall(big_chunk)
1716
1717 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001718 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001719 fd = self.cli_conn.fileno()
1720 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001721 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001722 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001723 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001724 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001725
1726 def _testFromFd(self):
1727 self.serv_conn.send(MSG)
1728
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001729 def testDup(self):
1730 # Testing dup()
1731 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001732 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001733 msg = sock.recv(1024)
1734 self.assertEqual(msg, MSG)
1735
1736 def _testDup(self):
1737 self.serv_conn.send(MSG)
1738
Guido van Rossum24e4af82002-06-12 19:18:08 +00001739 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001740 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001741 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001742 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001743 # wait for _testShutdown to finish: on OS X, when the server
1744 # closes the connection the client also becomes disconnected,
1745 # and the client's shutdown call will fail. (Issue #4397.)
1746 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001747
1748 def _testShutdown(self):
1749 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001750 self.serv_conn.shutdown(2)
1751
1752 testShutdown_overflow = support.cpython_only(testShutdown)
1753
1754 @support.cpython_only
1755 def _testShutdown_overflow(self):
1756 import _testcapi
1757 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001758 # Issue 15989
1759 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1760 _testcapi.INT_MAX + 1)
1761 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1762 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001763 self.serv_conn.shutdown(2)
1764
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001765 def testDetach(self):
1766 # Testing detach()
1767 fileno = self.cli_conn.fileno()
1768 f = self.cli_conn.detach()
1769 self.assertEqual(f, fileno)
1770 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001771 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001772 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001773 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001774 # ...but we can create another socket using the (still open)
1775 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001776 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001777 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001778 msg = sock.recv(1024)
1779 self.assertEqual(msg, MSG)
1780
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001781 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001782 self.serv_conn.send(MSG)
1783
Victor Stinner45df8202010-04-28 22:31:17 +00001784@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001785class BasicUDPTest(ThreadedUDPSocketTest):
1786
1787 def __init__(self, methodName='runTest'):
1788 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1789
1790 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001791 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001792 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001793 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001794
1795 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001796 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001797
Guido van Rossum1c938012002-06-12 21:17:20 +00001798 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001799 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001800 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001801 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001802
Guido van Rossum1c938012002-06-12 21:17:20 +00001803 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001804 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001805
Guido van Rossumd8faa362007-04-27 19:54:29 +00001806 def testRecvFromNegative(self):
1807 # Negative lengths passed to recvfrom should give ValueError.
1808 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1809
1810 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001811 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001812
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001813# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1814# same test code is used with different families and types of socket
1815# (e.g. stream, datagram), and tests using recvmsg() are repeated
1816# using recvmsg_into().
1817#
1818# The generic test classes such as SendmsgTests and
1819# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1820# supplied with sockets cli_sock and serv_sock representing the
1821# client's and the server's end of the connection respectively, and
1822# attributes cli_addr and serv_addr holding their (numeric where
1823# appropriate) addresses.
1824#
1825# The final concrete test classes combine these with subclasses of
1826# SocketTestBase which set up client and server sockets of a specific
1827# type, and with subclasses of SendrecvmsgBase such as
1828# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1829# sockets to cli_sock and serv_sock and override the methods and
1830# attributes of SendrecvmsgBase to fill in destination addresses if
1831# needed when sending, check for specific flags in msg_flags, etc.
1832#
1833# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1834# recvmsg_into().
1835
1836# XXX: like the other datagram (UDP) tests in this module, the code
1837# here assumes that datagram delivery on the local machine will be
1838# reliable.
1839
1840class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1841 # Base class for sendmsg()/recvmsg() tests.
1842
1843 # Time in seconds to wait before considering a test failed, or
1844 # None for no timeout. Not all tests actually set a timeout.
1845 fail_timeout = 3.0
1846
1847 def setUp(self):
1848 self.misc_event = threading.Event()
1849 super().setUp()
1850
1851 def sendToServer(self, msg):
1852 # Send msg to the server.
1853 return self.cli_sock.send(msg)
1854
1855 # Tuple of alternative default arguments for sendmsg() when called
1856 # via sendmsgToServer() (e.g. to include a destination address).
1857 sendmsg_to_server_defaults = ()
1858
1859 def sendmsgToServer(self, *args):
1860 # Call sendmsg() on self.cli_sock with the given arguments,
1861 # filling in any arguments which are not supplied with the
1862 # corresponding items of self.sendmsg_to_server_defaults, if
1863 # any.
1864 return self.cli_sock.sendmsg(
1865 *(args + self.sendmsg_to_server_defaults[len(args):]))
1866
1867 def doRecvmsg(self, sock, bufsize, *args):
1868 # Call recvmsg() on sock with given arguments and return its
1869 # result. Should be used for tests which can use either
1870 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1871 # this method with one which emulates it using recvmsg_into(),
1872 # thus allowing the same test to be used for both methods.
1873 result = sock.recvmsg(bufsize, *args)
1874 self.registerRecvmsgResult(result)
1875 return result
1876
1877 def registerRecvmsgResult(self, result):
1878 # Called by doRecvmsg() with the return value of recvmsg() or
1879 # recvmsg_into(). Can be overridden to arrange cleanup based
1880 # on the returned ancillary data, for instance.
1881 pass
1882
1883 def checkRecvmsgAddress(self, addr1, addr2):
1884 # Called to compare the received address with the address of
1885 # the peer.
1886 self.assertEqual(addr1, addr2)
1887
1888 # Flags that are normally unset in msg_flags
1889 msg_flags_common_unset = 0
1890 for name in ("MSG_CTRUNC", "MSG_OOB"):
1891 msg_flags_common_unset |= getattr(socket, name, 0)
1892
1893 # Flags that are normally set
1894 msg_flags_common_set = 0
1895
1896 # Flags set when a complete record has been received (e.g. MSG_EOR
1897 # for SCTP)
1898 msg_flags_eor_indicator = 0
1899
1900 # Flags set when a complete record has not been received
1901 # (e.g. MSG_TRUNC for datagram sockets)
1902 msg_flags_non_eor_indicator = 0
1903
1904 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1905 # Method to check the value of msg_flags returned by recvmsg[_into]().
1906 #
1907 # Checks that all bits in msg_flags_common_set attribute are
1908 # set in "flags" and all bits in msg_flags_common_unset are
1909 # unset.
1910 #
1911 # The "eor" argument specifies whether the flags should
1912 # indicate that a full record (or datagram) has been received.
1913 # If "eor" is None, no checks are done; otherwise, checks
1914 # that:
1915 #
1916 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1917 # set and all bits in msg_flags_non_eor_indicator are unset
1918 #
1919 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1920 # are set and all bits in msg_flags_eor_indicator are unset
1921 #
1922 # If "checkset" and/or "checkunset" are supplied, they require
1923 # the given bits to be set or unset respectively, overriding
1924 # what the attributes require for those bits.
1925 #
1926 # If any bits are set in "ignore", they will not be checked,
1927 # regardless of the other inputs.
1928 #
1929 # Will raise Exception if the inputs require a bit to be both
1930 # set and unset, and it is not ignored.
1931
1932 defaultset = self.msg_flags_common_set
1933 defaultunset = self.msg_flags_common_unset
1934
1935 if eor:
1936 defaultset |= self.msg_flags_eor_indicator
1937 defaultunset |= self.msg_flags_non_eor_indicator
1938 elif eor is not None:
1939 defaultset |= self.msg_flags_non_eor_indicator
1940 defaultunset |= self.msg_flags_eor_indicator
1941
1942 # Function arguments override defaults
1943 defaultset &= ~checkunset
1944 defaultunset &= ~checkset
1945
1946 # Merge arguments with remaining defaults, and check for conflicts
1947 checkset |= defaultset
1948 checkunset |= defaultunset
1949 inboth = checkset & checkunset & ~ignore
1950 if inboth:
1951 raise Exception("contradictory set, unset requirements for flags "
1952 "{0:#x}".format(inboth))
1953
1954 # Compare with given msg_flags value
1955 mask = (checkset | checkunset) & ~ignore
1956 self.assertEqual(flags & mask, checkset & mask)
1957
1958
1959class RecvmsgIntoMixin(SendrecvmsgBase):
1960 # Mixin to implement doRecvmsg() using recvmsg_into().
1961
1962 def doRecvmsg(self, sock, bufsize, *args):
1963 buf = bytearray(bufsize)
1964 result = sock.recvmsg_into([buf], *args)
1965 self.registerRecvmsgResult(result)
1966 self.assertGreaterEqual(result[0], 0)
1967 self.assertLessEqual(result[0], bufsize)
1968 return (bytes(buf[:result[0]]),) + result[1:]
1969
1970
1971class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1972 # Defines flags to be checked in msg_flags for datagram sockets.
1973
1974 @property
1975 def msg_flags_non_eor_indicator(self):
1976 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1977
1978
1979class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1980 # Defines flags to be checked in msg_flags for SCTP sockets.
1981
1982 @property
1983 def msg_flags_eor_indicator(self):
1984 return super().msg_flags_eor_indicator | socket.MSG_EOR
1985
1986
1987class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1988 # Base class for tests on connectionless-mode sockets. Users must
1989 # supply sockets on attributes cli and serv to be mapped to
1990 # cli_sock and serv_sock respectively.
1991
1992 @property
1993 def serv_sock(self):
1994 return self.serv
1995
1996 @property
1997 def cli_sock(self):
1998 return self.cli
1999
2000 @property
2001 def sendmsg_to_server_defaults(self):
2002 return ([], [], 0, self.serv_addr)
2003
2004 def sendToServer(self, msg):
2005 return self.cli_sock.sendto(msg, self.serv_addr)
2006
2007
2008class SendrecvmsgConnectedBase(SendrecvmsgBase):
2009 # Base class for tests on connected sockets. Users must supply
2010 # sockets on attributes serv_conn and cli_conn (representing the
2011 # connections *to* the server and the client), to be mapped to
2012 # cli_sock and serv_sock respectively.
2013
2014 @property
2015 def serv_sock(self):
2016 return self.cli_conn
2017
2018 @property
2019 def cli_sock(self):
2020 return self.serv_conn
2021
2022 def checkRecvmsgAddress(self, addr1, addr2):
2023 # Address is currently "unspecified" for a connected socket,
2024 # so we don't examine it
2025 pass
2026
2027
2028class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2029 # Base class to set a timeout on server's socket.
2030
2031 def setUp(self):
2032 super().setUp()
2033 self.serv_sock.settimeout(self.fail_timeout)
2034
2035
2036class SendmsgTests(SendrecvmsgServerTimeoutBase):
2037 # Tests for sendmsg() which can use any socket type and do not
2038 # involve recvmsg() or recvmsg_into().
2039
2040 def testSendmsg(self):
2041 # Send a simple message with sendmsg().
2042 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2043
2044 def _testSendmsg(self):
2045 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2046
2047 def testSendmsgDataGenerator(self):
2048 # Send from buffer obtained from a generator (not a sequence).
2049 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2050
2051 def _testSendmsgDataGenerator(self):
2052 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2053 len(MSG))
2054
2055 def testSendmsgAncillaryGenerator(self):
2056 # Gather (empty) ancillary data from a generator.
2057 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2058
2059 def _testSendmsgAncillaryGenerator(self):
2060 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2061 len(MSG))
2062
2063 def testSendmsgArray(self):
2064 # Send data from an array instead of the usual bytes object.
2065 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2066
2067 def _testSendmsgArray(self):
2068 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2069 len(MSG))
2070
2071 def testSendmsgGather(self):
2072 # Send message data from more than one buffer (gather write).
2073 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2074
2075 def _testSendmsgGather(self):
2076 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2077
2078 def testSendmsgBadArgs(self):
2079 # Check that sendmsg() rejects invalid arguments.
2080 self.assertEqual(self.serv_sock.recv(1000), b"done")
2081
2082 def _testSendmsgBadArgs(self):
2083 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2084 self.assertRaises(TypeError, self.sendmsgToServer,
2085 b"not in an iterable")
2086 self.assertRaises(TypeError, self.sendmsgToServer,
2087 object())
2088 self.assertRaises(TypeError, self.sendmsgToServer,
2089 [object()])
2090 self.assertRaises(TypeError, self.sendmsgToServer,
2091 [MSG, object()])
2092 self.assertRaises(TypeError, self.sendmsgToServer,
2093 [MSG], object())
2094 self.assertRaises(TypeError, self.sendmsgToServer,
2095 [MSG], [], object())
2096 self.assertRaises(TypeError, self.sendmsgToServer,
2097 [MSG], [], 0, object())
2098 self.sendToServer(b"done")
2099
2100 def testSendmsgBadCmsg(self):
2101 # Check that invalid ancillary data items are rejected.
2102 self.assertEqual(self.serv_sock.recv(1000), b"done")
2103
2104 def _testSendmsgBadCmsg(self):
2105 self.assertRaises(TypeError, self.sendmsgToServer,
2106 [MSG], [object()])
2107 self.assertRaises(TypeError, self.sendmsgToServer,
2108 [MSG], [(object(), 0, b"data")])
2109 self.assertRaises(TypeError, self.sendmsgToServer,
2110 [MSG], [(0, object(), b"data")])
2111 self.assertRaises(TypeError, self.sendmsgToServer,
2112 [MSG], [(0, 0, object())])
2113 self.assertRaises(TypeError, self.sendmsgToServer,
2114 [MSG], [(0, 0)])
2115 self.assertRaises(TypeError, self.sendmsgToServer,
2116 [MSG], [(0, 0, b"data", 42)])
2117 self.sendToServer(b"done")
2118
2119 @requireAttrs(socket, "CMSG_SPACE")
2120 def testSendmsgBadMultiCmsg(self):
2121 # Check that invalid ancillary data items are rejected when
2122 # more than one item is present.
2123 self.assertEqual(self.serv_sock.recv(1000), b"done")
2124
2125 @testSendmsgBadMultiCmsg.client_skip
2126 def _testSendmsgBadMultiCmsg(self):
2127 self.assertRaises(TypeError, self.sendmsgToServer,
2128 [MSG], [0, 0, b""])
2129 self.assertRaises(TypeError, self.sendmsgToServer,
2130 [MSG], [(0, 0, b""), object()])
2131 self.sendToServer(b"done")
2132
2133 def testSendmsgExcessCmsgReject(self):
2134 # Check that sendmsg() rejects excess ancillary data items
2135 # when the number that can be sent is limited.
2136 self.assertEqual(self.serv_sock.recv(1000), b"done")
2137
2138 def _testSendmsgExcessCmsgReject(self):
2139 if not hasattr(socket, "CMSG_SPACE"):
2140 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002141 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002142 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2143 self.assertIsNone(cm.exception.errno)
2144 self.sendToServer(b"done")
2145
2146 def testSendmsgAfterClose(self):
2147 # Check that sendmsg() fails on a closed socket.
2148 pass
2149
2150 def _testSendmsgAfterClose(self):
2151 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002152 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002153
2154
2155class SendmsgStreamTests(SendmsgTests):
2156 # Tests for sendmsg() which require a stream socket and do not
2157 # involve recvmsg() or recvmsg_into().
2158
2159 def testSendmsgExplicitNoneAddr(self):
2160 # Check that peer address can be specified as None.
2161 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2162
2163 def _testSendmsgExplicitNoneAddr(self):
2164 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2165
2166 def testSendmsgTimeout(self):
2167 # Check that timeout works with sendmsg().
2168 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2169 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2170
2171 def _testSendmsgTimeout(self):
2172 try:
2173 self.cli_sock.settimeout(0.03)
2174 with self.assertRaises(socket.timeout):
2175 while True:
2176 self.sendmsgToServer([b"a"*512])
2177 finally:
2178 self.misc_event.set()
2179
2180 # XXX: would be nice to have more tests for sendmsg flags argument.
2181
2182 # Linux supports MSG_DONTWAIT when sending, but in general, it
2183 # only works when receiving. Could add other platforms if they
2184 # support it too.
2185 @skipWithClientIf(sys.platform not in {"linux2"},
2186 "MSG_DONTWAIT not known to work on this platform when "
2187 "sending")
2188 def testSendmsgDontWait(self):
2189 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2190 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2191 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2192
2193 @testSendmsgDontWait.client_skip
2194 def _testSendmsgDontWait(self):
2195 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002196 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002197 while True:
2198 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2199 self.assertIn(cm.exception.errno,
2200 (errno.EAGAIN, errno.EWOULDBLOCK))
2201 finally:
2202 self.misc_event.set()
2203
2204
2205class SendmsgConnectionlessTests(SendmsgTests):
2206 # Tests for sendmsg() which require a connectionless-mode
2207 # (e.g. datagram) socket, and do not involve recvmsg() or
2208 # recvmsg_into().
2209
2210 def testSendmsgNoDestAddr(self):
2211 # Check that sendmsg() fails when no destination address is
2212 # given for unconnected socket.
2213 pass
2214
2215 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002216 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002217 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002218 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002219 [MSG], [], 0, None)
2220
2221
2222class RecvmsgGenericTests(SendrecvmsgBase):
2223 # Tests for recvmsg() which can also be emulated using
2224 # recvmsg_into(), and can use any socket type.
2225
2226 def testRecvmsg(self):
2227 # Receive a simple message with recvmsg[_into]().
2228 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2229 self.assertEqual(msg, MSG)
2230 self.checkRecvmsgAddress(addr, self.cli_addr)
2231 self.assertEqual(ancdata, [])
2232 self.checkFlags(flags, eor=True)
2233
2234 def _testRecvmsg(self):
2235 self.sendToServer(MSG)
2236
2237 def testRecvmsgExplicitDefaults(self):
2238 # Test recvmsg[_into]() with default arguments provided explicitly.
2239 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2240 len(MSG), 0, 0)
2241 self.assertEqual(msg, MSG)
2242 self.checkRecvmsgAddress(addr, self.cli_addr)
2243 self.assertEqual(ancdata, [])
2244 self.checkFlags(flags, eor=True)
2245
2246 def _testRecvmsgExplicitDefaults(self):
2247 self.sendToServer(MSG)
2248
2249 def testRecvmsgShorter(self):
2250 # Receive a message smaller than buffer.
2251 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2252 len(MSG) + 42)
2253 self.assertEqual(msg, MSG)
2254 self.checkRecvmsgAddress(addr, self.cli_addr)
2255 self.assertEqual(ancdata, [])
2256 self.checkFlags(flags, eor=True)
2257
2258 def _testRecvmsgShorter(self):
2259 self.sendToServer(MSG)
2260
Charles-François Natali8619cd72011-10-03 19:43:15 +02002261 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2262 # datagram is received (issue #13001).
2263 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002264 def testRecvmsgTrunc(self):
2265 # Receive part of message, check for truncation indicators.
2266 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2267 len(MSG) - 3)
2268 self.assertEqual(msg, MSG[:-3])
2269 self.checkRecvmsgAddress(addr, self.cli_addr)
2270 self.assertEqual(ancdata, [])
2271 self.checkFlags(flags, eor=False)
2272
Charles-François Natali8619cd72011-10-03 19:43:15 +02002273 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002274 def _testRecvmsgTrunc(self):
2275 self.sendToServer(MSG)
2276
2277 def testRecvmsgShortAncillaryBuf(self):
2278 # Test ancillary data buffer too small to hold any ancillary data.
2279 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2280 len(MSG), 1)
2281 self.assertEqual(msg, MSG)
2282 self.checkRecvmsgAddress(addr, self.cli_addr)
2283 self.assertEqual(ancdata, [])
2284 self.checkFlags(flags, eor=True)
2285
2286 def _testRecvmsgShortAncillaryBuf(self):
2287 self.sendToServer(MSG)
2288
2289 def testRecvmsgLongAncillaryBuf(self):
2290 # Test large ancillary data buffer.
2291 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2292 len(MSG), 10240)
2293 self.assertEqual(msg, MSG)
2294 self.checkRecvmsgAddress(addr, self.cli_addr)
2295 self.assertEqual(ancdata, [])
2296 self.checkFlags(flags, eor=True)
2297
2298 def _testRecvmsgLongAncillaryBuf(self):
2299 self.sendToServer(MSG)
2300
2301 def testRecvmsgAfterClose(self):
2302 # Check that recvmsg[_into]() fails on a closed socket.
2303 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002304 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002305
2306 def _testRecvmsgAfterClose(self):
2307 pass
2308
2309 def testRecvmsgTimeout(self):
2310 # Check that timeout works.
2311 try:
2312 self.serv_sock.settimeout(0.03)
2313 self.assertRaises(socket.timeout,
2314 self.doRecvmsg, self.serv_sock, len(MSG))
2315 finally:
2316 self.misc_event.set()
2317
2318 def _testRecvmsgTimeout(self):
2319 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2320
2321 @requireAttrs(socket, "MSG_PEEK")
2322 def testRecvmsgPeek(self):
2323 # Check that MSG_PEEK in flags enables examination of pending
2324 # data without consuming it.
2325
2326 # Receive part of data with MSG_PEEK.
2327 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2328 len(MSG) - 3, 0,
2329 socket.MSG_PEEK)
2330 self.assertEqual(msg, MSG[:-3])
2331 self.checkRecvmsgAddress(addr, self.cli_addr)
2332 self.assertEqual(ancdata, [])
2333 # Ignoring MSG_TRUNC here (so this test is the same for stream
2334 # and datagram sockets). Some wording in POSIX seems to
2335 # suggest that it needn't be set when peeking, but that may
2336 # just be a slip.
2337 self.checkFlags(flags, eor=False,
2338 ignore=getattr(socket, "MSG_TRUNC", 0))
2339
2340 # Receive all data with MSG_PEEK.
2341 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2342 len(MSG), 0,
2343 socket.MSG_PEEK)
2344 self.assertEqual(msg, MSG)
2345 self.checkRecvmsgAddress(addr, self.cli_addr)
2346 self.assertEqual(ancdata, [])
2347 self.checkFlags(flags, eor=True)
2348
2349 # Check that the same data can still be received normally.
2350 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2351 self.assertEqual(msg, MSG)
2352 self.checkRecvmsgAddress(addr, self.cli_addr)
2353 self.assertEqual(ancdata, [])
2354 self.checkFlags(flags, eor=True)
2355
2356 @testRecvmsgPeek.client_skip
2357 def _testRecvmsgPeek(self):
2358 self.sendToServer(MSG)
2359
2360 @requireAttrs(socket.socket, "sendmsg")
2361 def testRecvmsgFromSendmsg(self):
2362 # Test receiving with recvmsg[_into]() when message is sent
2363 # using sendmsg().
2364 self.serv_sock.settimeout(self.fail_timeout)
2365 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2366 self.assertEqual(msg, MSG)
2367 self.checkRecvmsgAddress(addr, self.cli_addr)
2368 self.assertEqual(ancdata, [])
2369 self.checkFlags(flags, eor=True)
2370
2371 @testRecvmsgFromSendmsg.client_skip
2372 def _testRecvmsgFromSendmsg(self):
2373 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2374
2375
2376class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2377 # Tests which require a stream socket and can use either recvmsg()
2378 # or recvmsg_into().
2379
2380 def testRecvmsgEOF(self):
2381 # Receive end-of-stream indicator (b"", peer socket closed).
2382 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2383 self.assertEqual(msg, b"")
2384 self.checkRecvmsgAddress(addr, self.cli_addr)
2385 self.assertEqual(ancdata, [])
2386 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2387
2388 def _testRecvmsgEOF(self):
2389 self.cli_sock.close()
2390
2391 def testRecvmsgOverflow(self):
2392 # Receive a message in more than one chunk.
2393 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2394 len(MSG) - 3)
2395 self.checkRecvmsgAddress(addr, self.cli_addr)
2396 self.assertEqual(ancdata, [])
2397 self.checkFlags(flags, eor=False)
2398
2399 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2400 self.checkRecvmsgAddress(addr, self.cli_addr)
2401 self.assertEqual(ancdata, [])
2402 self.checkFlags(flags, eor=True)
2403
2404 msg = seg1 + seg2
2405 self.assertEqual(msg, MSG)
2406
2407 def _testRecvmsgOverflow(self):
2408 self.sendToServer(MSG)
2409
2410
2411class RecvmsgTests(RecvmsgGenericTests):
2412 # Tests for recvmsg() which can use any socket type.
2413
2414 def testRecvmsgBadArgs(self):
2415 # Check that recvmsg() rejects invalid arguments.
2416 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2417 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2418 -1, 0, 0)
2419 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2420 len(MSG), -1, 0)
2421 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2422 [bytearray(10)], 0, 0)
2423 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2424 object(), 0, 0)
2425 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2426 len(MSG), object(), 0)
2427 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2428 len(MSG), 0, object())
2429
2430 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2431 self.assertEqual(msg, MSG)
2432 self.checkRecvmsgAddress(addr, self.cli_addr)
2433 self.assertEqual(ancdata, [])
2434 self.checkFlags(flags, eor=True)
2435
2436 def _testRecvmsgBadArgs(self):
2437 self.sendToServer(MSG)
2438
2439
2440class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2441 # Tests for recvmsg_into() which can use any socket type.
2442
2443 def testRecvmsgIntoBadArgs(self):
2444 # Check that recvmsg_into() rejects invalid arguments.
2445 buf = bytearray(len(MSG))
2446 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2447 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2448 len(MSG), 0, 0)
2449 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2450 buf, 0, 0)
2451 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2452 [object()], 0, 0)
2453 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2454 [b"I'm not writable"], 0, 0)
2455 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2456 [buf, object()], 0, 0)
2457 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2458 [buf], -1, 0)
2459 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2460 [buf], object(), 0)
2461 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2462 [buf], 0, object())
2463
2464 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2465 self.assertEqual(nbytes, len(MSG))
2466 self.assertEqual(buf, bytearray(MSG))
2467 self.checkRecvmsgAddress(addr, self.cli_addr)
2468 self.assertEqual(ancdata, [])
2469 self.checkFlags(flags, eor=True)
2470
2471 def _testRecvmsgIntoBadArgs(self):
2472 self.sendToServer(MSG)
2473
2474 def testRecvmsgIntoGenerator(self):
2475 # Receive into buffer obtained from a generator (not a sequence).
2476 buf = bytearray(len(MSG))
2477 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2478 (o for o in [buf]))
2479 self.assertEqual(nbytes, len(MSG))
2480 self.assertEqual(buf, bytearray(MSG))
2481 self.checkRecvmsgAddress(addr, self.cli_addr)
2482 self.assertEqual(ancdata, [])
2483 self.checkFlags(flags, eor=True)
2484
2485 def _testRecvmsgIntoGenerator(self):
2486 self.sendToServer(MSG)
2487
2488 def testRecvmsgIntoArray(self):
2489 # Receive into an array rather than the usual bytearray.
2490 buf = array.array("B", [0] * len(MSG))
2491 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2492 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002493 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002494 self.checkRecvmsgAddress(addr, self.cli_addr)
2495 self.assertEqual(ancdata, [])
2496 self.checkFlags(flags, eor=True)
2497
2498 def _testRecvmsgIntoArray(self):
2499 self.sendToServer(MSG)
2500
2501 def testRecvmsgIntoScatter(self):
2502 # Receive into multiple buffers (scatter write).
2503 b1 = bytearray(b"----")
2504 b2 = bytearray(b"0123456789")
2505 b3 = bytearray(b"--------------")
2506 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2507 [b1, memoryview(b2)[2:9], b3])
2508 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2509 self.assertEqual(b1, bytearray(b"Mary"))
2510 self.assertEqual(b2, bytearray(b"01 had a 9"))
2511 self.assertEqual(b3, bytearray(b"little lamb---"))
2512 self.checkRecvmsgAddress(addr, self.cli_addr)
2513 self.assertEqual(ancdata, [])
2514 self.checkFlags(flags, eor=True)
2515
2516 def _testRecvmsgIntoScatter(self):
2517 self.sendToServer(b"Mary had a little lamb")
2518
2519
2520class CmsgMacroTests(unittest.TestCase):
2521 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2522 # assumptions used by sendmsg() and recvmsg[_into](), which share
2523 # code with these functions.
2524
2525 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002526 try:
2527 import _testcapi
2528 except ImportError:
2529 socklen_t_limit = 0x7fffffff
2530 else:
2531 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002532
2533 @requireAttrs(socket, "CMSG_LEN")
2534 def testCMSG_LEN(self):
2535 # Test CMSG_LEN() with various valid and invalid values,
2536 # checking the assumptions used by recvmsg() and sendmsg().
2537 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2538 values = list(range(257)) + list(range(toobig - 257, toobig))
2539
2540 # struct cmsghdr has at least three members, two of which are ints
2541 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2542 for n in values:
2543 ret = socket.CMSG_LEN(n)
2544 # This is how recvmsg() calculates the data size
2545 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2546 self.assertLessEqual(ret, self.socklen_t_limit)
2547
2548 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2549 # sendmsg() shares code with these functions, and requires
2550 # that it reject values over the limit.
2551 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2552 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2553
2554 @requireAttrs(socket, "CMSG_SPACE")
2555 def testCMSG_SPACE(self):
2556 # Test CMSG_SPACE() with various valid and invalid values,
2557 # checking the assumptions used by sendmsg().
2558 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2559 values = list(range(257)) + list(range(toobig - 257, toobig))
2560
2561 last = socket.CMSG_SPACE(0)
2562 # struct cmsghdr has at least three members, two of which are ints
2563 self.assertGreater(last, array.array("i").itemsize * 2)
2564 for n in values:
2565 ret = socket.CMSG_SPACE(n)
2566 self.assertGreaterEqual(ret, last)
2567 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2568 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2569 self.assertLessEqual(ret, self.socklen_t_limit)
2570 last = ret
2571
2572 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2573 # sendmsg() shares code with these functions, and requires
2574 # that it reject values over the limit.
2575 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2576 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2577
2578
2579class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2580 # Tests for file descriptor passing on Unix-domain sockets.
2581
2582 # Invalid file descriptor value that's unlikely to evaluate to a
2583 # real FD even if one of its bytes is replaced with a different
2584 # value (which shouldn't actually happen).
2585 badfd = -0x5555
2586
2587 def newFDs(self, n):
2588 # Return a list of n file descriptors for newly-created files
2589 # containing their list indices as ASCII numbers.
2590 fds = []
2591 for i in range(n):
2592 fd, path = tempfile.mkstemp()
2593 self.addCleanup(os.unlink, path)
2594 self.addCleanup(os.close, fd)
2595 os.write(fd, str(i).encode())
2596 fds.append(fd)
2597 return fds
2598
2599 def checkFDs(self, fds):
2600 # Check that the file descriptors in the given list contain
2601 # their correct list indices as ASCII numbers.
2602 for n, fd in enumerate(fds):
2603 os.lseek(fd, 0, os.SEEK_SET)
2604 self.assertEqual(os.read(fd, 1024), str(n).encode())
2605
2606 def registerRecvmsgResult(self, result):
2607 self.addCleanup(self.closeRecvmsgFDs, result)
2608
2609 def closeRecvmsgFDs(self, recvmsg_result):
2610 # Close all file descriptors specified in the ancillary data
2611 # of the given return value from recvmsg() or recvmsg_into().
2612 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2613 if (cmsg_level == socket.SOL_SOCKET and
2614 cmsg_type == socket.SCM_RIGHTS):
2615 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002616 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002617 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2618 for fd in fds:
2619 os.close(fd)
2620
2621 def createAndSendFDs(self, n):
2622 # Send n new file descriptors created by newFDs() to the
2623 # server, with the constant MSG as the non-ancillary data.
2624 self.assertEqual(
2625 self.sendmsgToServer([MSG],
2626 [(socket.SOL_SOCKET,
2627 socket.SCM_RIGHTS,
2628 array.array("i", self.newFDs(n)))]),
2629 len(MSG))
2630
2631 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2632 # Check that constant MSG was received with numfds file
2633 # descriptors in a maximum of maxcmsgs control messages (which
2634 # must contain only complete integers). By default, check
2635 # that MSG_CTRUNC is unset, but ignore any flags in
2636 # ignoreflags.
2637 msg, ancdata, flags, addr = result
2638 self.assertEqual(msg, MSG)
2639 self.checkRecvmsgAddress(addr, self.cli_addr)
2640 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2641 ignore=ignoreflags)
2642
2643 self.assertIsInstance(ancdata, list)
2644 self.assertLessEqual(len(ancdata), maxcmsgs)
2645 fds = array.array("i")
2646 for item in ancdata:
2647 self.assertIsInstance(item, tuple)
2648 cmsg_level, cmsg_type, cmsg_data = item
2649 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2650 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2651 self.assertIsInstance(cmsg_data, bytes)
2652 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002653 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002654
2655 self.assertEqual(len(fds), numfds)
2656 self.checkFDs(fds)
2657
2658 def testFDPassSimple(self):
2659 # Pass a single FD (array read from bytes object).
2660 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2661 len(MSG), 10240))
2662
2663 def _testFDPassSimple(self):
2664 self.assertEqual(
2665 self.sendmsgToServer(
2666 [MSG],
2667 [(socket.SOL_SOCKET,
2668 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002669 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002670 len(MSG))
2671
2672 def testMultipleFDPass(self):
2673 # Pass multiple FDs in a single array.
2674 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2675 len(MSG), 10240))
2676
2677 def _testMultipleFDPass(self):
2678 self.createAndSendFDs(4)
2679
2680 @requireAttrs(socket, "CMSG_SPACE")
2681 def testFDPassCMSG_SPACE(self):
2682 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2683 self.checkRecvmsgFDs(
2684 4, self.doRecvmsg(self.serv_sock, len(MSG),
2685 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2686
2687 @testFDPassCMSG_SPACE.client_skip
2688 def _testFDPassCMSG_SPACE(self):
2689 self.createAndSendFDs(4)
2690
2691 def testFDPassCMSG_LEN(self):
2692 # Test using CMSG_LEN() to calculate ancillary buffer size.
2693 self.checkRecvmsgFDs(1,
2694 self.doRecvmsg(self.serv_sock, len(MSG),
2695 socket.CMSG_LEN(4 * SIZEOF_INT)),
2696 # RFC 3542 says implementations may set
2697 # MSG_CTRUNC if there isn't enough space
2698 # for trailing padding.
2699 ignoreflags=socket.MSG_CTRUNC)
2700
2701 def _testFDPassCMSG_LEN(self):
2702 self.createAndSendFDs(1)
2703
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002704 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002705 @requireAttrs(socket, "CMSG_SPACE")
2706 def testFDPassSeparate(self):
2707 # Pass two FDs in two separate arrays. Arrays may be combined
2708 # into a single control message by the OS.
2709 self.checkRecvmsgFDs(2,
2710 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2711 maxcmsgs=2)
2712
2713 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002714 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002715 def _testFDPassSeparate(self):
2716 fd0, fd1 = self.newFDs(2)
2717 self.assertEqual(
2718 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2719 socket.SCM_RIGHTS,
2720 array.array("i", [fd0])),
2721 (socket.SOL_SOCKET,
2722 socket.SCM_RIGHTS,
2723 array.array("i", [fd1]))]),
2724 len(MSG))
2725
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002726 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002727 @requireAttrs(socket, "CMSG_SPACE")
2728 def testFDPassSeparateMinSpace(self):
2729 # Pass two FDs in two separate arrays, receiving them into the
2730 # minimum space for two arrays.
2731 self.checkRecvmsgFDs(2,
2732 self.doRecvmsg(self.serv_sock, len(MSG),
2733 socket.CMSG_SPACE(SIZEOF_INT) +
2734 socket.CMSG_LEN(SIZEOF_INT)),
2735 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2736
2737 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002738 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002739 def _testFDPassSeparateMinSpace(self):
2740 fd0, fd1 = self.newFDs(2)
2741 self.assertEqual(
2742 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2743 socket.SCM_RIGHTS,
2744 array.array("i", [fd0])),
2745 (socket.SOL_SOCKET,
2746 socket.SCM_RIGHTS,
2747 array.array("i", [fd1]))]),
2748 len(MSG))
2749
2750 def sendAncillaryIfPossible(self, msg, ancdata):
2751 # Try to send msg and ancdata to server, but if the system
2752 # call fails, just send msg with no ancillary data.
2753 try:
2754 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002755 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002756 # Check that it was the system call that failed
2757 self.assertIsInstance(e.errno, int)
2758 nbytes = self.sendmsgToServer([msg])
2759 self.assertEqual(nbytes, len(msg))
2760
2761 def testFDPassEmpty(self):
2762 # Try to pass an empty FD array. Can receive either no array
2763 # or an empty array.
2764 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2765 len(MSG), 10240),
2766 ignoreflags=socket.MSG_CTRUNC)
2767
2768 def _testFDPassEmpty(self):
2769 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2770 socket.SCM_RIGHTS,
2771 b"")])
2772
2773 def testFDPassPartialInt(self):
2774 # Try to pass a truncated FD array.
2775 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2776 len(MSG), 10240)
2777 self.assertEqual(msg, MSG)
2778 self.checkRecvmsgAddress(addr, self.cli_addr)
2779 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2780 self.assertLessEqual(len(ancdata), 1)
2781 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2782 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2783 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2784 self.assertLess(len(cmsg_data), SIZEOF_INT)
2785
2786 def _testFDPassPartialInt(self):
2787 self.sendAncillaryIfPossible(
2788 MSG,
2789 [(socket.SOL_SOCKET,
2790 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002791 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002792
2793 @requireAttrs(socket, "CMSG_SPACE")
2794 def testFDPassPartialIntInMiddle(self):
2795 # Try to pass two FD arrays, the first of which is truncated.
2796 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2797 len(MSG), 10240)
2798 self.assertEqual(msg, MSG)
2799 self.checkRecvmsgAddress(addr, self.cli_addr)
2800 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2801 self.assertLessEqual(len(ancdata), 2)
2802 fds = array.array("i")
2803 # Arrays may have been combined in a single control message
2804 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2805 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2806 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002807 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002808 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2809 self.assertLessEqual(len(fds), 2)
2810 self.checkFDs(fds)
2811
2812 @testFDPassPartialIntInMiddle.client_skip
2813 def _testFDPassPartialIntInMiddle(self):
2814 fd0, fd1 = self.newFDs(2)
2815 self.sendAncillaryIfPossible(
2816 MSG,
2817 [(socket.SOL_SOCKET,
2818 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002819 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002820 (socket.SOL_SOCKET,
2821 socket.SCM_RIGHTS,
2822 array.array("i", [fd1]))])
2823
2824 def checkTruncatedHeader(self, result, ignoreflags=0):
2825 # Check that no ancillary data items are returned when data is
2826 # truncated inside the cmsghdr structure.
2827 msg, ancdata, flags, addr = result
2828 self.assertEqual(msg, MSG)
2829 self.checkRecvmsgAddress(addr, self.cli_addr)
2830 self.assertEqual(ancdata, [])
2831 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2832 ignore=ignoreflags)
2833
2834 def testCmsgTruncNoBufSize(self):
2835 # Check that no ancillary data is received when no buffer size
2836 # is specified.
2837 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2838 # BSD seems to set MSG_CTRUNC only
2839 # if an item has been partially
2840 # received.
2841 ignoreflags=socket.MSG_CTRUNC)
2842
2843 def _testCmsgTruncNoBufSize(self):
2844 self.createAndSendFDs(1)
2845
2846 def testCmsgTrunc0(self):
2847 # Check that no ancillary data is received when buffer size is 0.
2848 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2849 ignoreflags=socket.MSG_CTRUNC)
2850
2851 def _testCmsgTrunc0(self):
2852 self.createAndSendFDs(1)
2853
2854 # Check that no ancillary data is returned for various non-zero
2855 # (but still too small) buffer sizes.
2856
2857 def testCmsgTrunc1(self):
2858 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2859
2860 def _testCmsgTrunc1(self):
2861 self.createAndSendFDs(1)
2862
2863 def testCmsgTrunc2Int(self):
2864 # The cmsghdr structure has at least three members, two of
2865 # which are ints, so we still shouldn't see any ancillary
2866 # data.
2867 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2868 SIZEOF_INT * 2))
2869
2870 def _testCmsgTrunc2Int(self):
2871 self.createAndSendFDs(1)
2872
2873 def testCmsgTruncLen0Minus1(self):
2874 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2875 socket.CMSG_LEN(0) - 1))
2876
2877 def _testCmsgTruncLen0Minus1(self):
2878 self.createAndSendFDs(1)
2879
2880 # The following tests try to truncate the control message in the
2881 # middle of the FD array.
2882
2883 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2884 # Check that file descriptor data is truncated to between
2885 # mindata and maxdata bytes when received with buffer size
2886 # ancbuf, and that any complete file descriptor numbers are
2887 # valid.
2888 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2889 len(MSG), ancbuf)
2890 self.assertEqual(msg, MSG)
2891 self.checkRecvmsgAddress(addr, self.cli_addr)
2892 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2893
2894 if mindata == 0 and ancdata == []:
2895 return
2896 self.assertEqual(len(ancdata), 1)
2897 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2898 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2899 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2900 self.assertGreaterEqual(len(cmsg_data), mindata)
2901 self.assertLessEqual(len(cmsg_data), maxdata)
2902 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002903 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002904 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2905 self.checkFDs(fds)
2906
2907 def testCmsgTruncLen0(self):
2908 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2909
2910 def _testCmsgTruncLen0(self):
2911 self.createAndSendFDs(1)
2912
2913 def testCmsgTruncLen0Plus1(self):
2914 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2915
2916 def _testCmsgTruncLen0Plus1(self):
2917 self.createAndSendFDs(2)
2918
2919 def testCmsgTruncLen1(self):
2920 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2921 maxdata=SIZEOF_INT)
2922
2923 def _testCmsgTruncLen1(self):
2924 self.createAndSendFDs(2)
2925
2926 def testCmsgTruncLen2Minus1(self):
2927 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2928 maxdata=(2 * SIZEOF_INT) - 1)
2929
2930 def _testCmsgTruncLen2Minus1(self):
2931 self.createAndSendFDs(2)
2932
2933
2934class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2935 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2936 # features of the RFC 3542 Advanced Sockets API for IPv6.
2937 # Currently we can only handle certain data items (e.g. traffic
2938 # class, hop limit, MTU discovery and fragmentation settings)
2939 # without resorting to unportable means such as the struct module,
2940 # but the tests here are aimed at testing the ancillary data
2941 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2942 # itself.
2943
2944 # Test value to use when setting hop limit of packet
2945 hop_limit = 2
2946
2947 # Test value to use when setting traffic class of packet.
2948 # -1 means "use kernel default".
2949 traffic_class = -1
2950
2951 def ancillaryMapping(self, ancdata):
2952 # Given ancillary data list ancdata, return a mapping from
2953 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2954 # Check that no (level, type) pair appears more than once.
2955 d = {}
2956 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2957 self.assertNotIn((cmsg_level, cmsg_type), d)
2958 d[(cmsg_level, cmsg_type)] = cmsg_data
2959 return d
2960
2961 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2962 # Receive hop limit into ancbufsize bytes of ancillary data
2963 # space. Check that data is MSG, ancillary data is not
2964 # truncated (but ignore any flags in ignoreflags), and hop
2965 # limit is between 0 and maxhop inclusive.
2966 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2967 socket.IPV6_RECVHOPLIMIT, 1)
2968 self.misc_event.set()
2969 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2970 len(MSG), ancbufsize)
2971
2972 self.assertEqual(msg, MSG)
2973 self.checkRecvmsgAddress(addr, self.cli_addr)
2974 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2975 ignore=ignoreflags)
2976
2977 self.assertEqual(len(ancdata), 1)
2978 self.assertIsInstance(ancdata[0], tuple)
2979 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2980 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2981 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2982 self.assertIsInstance(cmsg_data, bytes)
2983 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2984 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002985 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002986 self.assertGreaterEqual(a[0], 0)
2987 self.assertLessEqual(a[0], maxhop)
2988
2989 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2990 def testRecvHopLimit(self):
2991 # Test receiving the packet hop limit as ancillary data.
2992 self.checkHopLimit(ancbufsize=10240)
2993
2994 @testRecvHopLimit.client_skip
2995 def _testRecvHopLimit(self):
2996 # Need to wait until server has asked to receive ancillary
2997 # data, as implementations are not required to buffer it
2998 # otherwise.
2999 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3000 self.sendToServer(MSG)
3001
3002 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3003 def testRecvHopLimitCMSG_SPACE(self):
3004 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3005 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3006
3007 @testRecvHopLimitCMSG_SPACE.client_skip
3008 def _testRecvHopLimitCMSG_SPACE(self):
3009 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3010 self.sendToServer(MSG)
3011
3012 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3013 # 3542 says portable applications must provide space for trailing
3014 # padding. Implementations may set MSG_CTRUNC if there isn't
3015 # enough space for the padding.
3016
3017 @requireAttrs(socket.socket, "sendmsg")
3018 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3019 def testSetHopLimit(self):
3020 # Test setting hop limit on outgoing packet and receiving it
3021 # at the other end.
3022 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3023
3024 @testSetHopLimit.client_skip
3025 def _testSetHopLimit(self):
3026 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3027 self.assertEqual(
3028 self.sendmsgToServer([MSG],
3029 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3030 array.array("i", [self.hop_limit]))]),
3031 len(MSG))
3032
3033 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3034 ignoreflags=0):
3035 # Receive traffic class and hop limit into ancbufsize bytes of
3036 # ancillary data space. Check that data is MSG, ancillary
3037 # data is not truncated (but ignore any flags in ignoreflags),
3038 # and traffic class and hop limit are in range (hop limit no
3039 # more than maxhop).
3040 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3041 socket.IPV6_RECVHOPLIMIT, 1)
3042 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3043 socket.IPV6_RECVTCLASS, 1)
3044 self.misc_event.set()
3045 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3046 len(MSG), ancbufsize)
3047
3048 self.assertEqual(msg, MSG)
3049 self.checkRecvmsgAddress(addr, self.cli_addr)
3050 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3051 ignore=ignoreflags)
3052 self.assertEqual(len(ancdata), 2)
3053 ancmap = self.ancillaryMapping(ancdata)
3054
3055 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3056 self.assertEqual(len(tcdata), SIZEOF_INT)
3057 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003058 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003059 self.assertGreaterEqual(a[0], 0)
3060 self.assertLessEqual(a[0], 255)
3061
3062 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3063 self.assertEqual(len(hldata), SIZEOF_INT)
3064 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003065 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003066 self.assertGreaterEqual(a[0], 0)
3067 self.assertLessEqual(a[0], maxhop)
3068
3069 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3070 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3071 def testRecvTrafficClassAndHopLimit(self):
3072 # Test receiving traffic class and hop limit as ancillary data.
3073 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3074
3075 @testRecvTrafficClassAndHopLimit.client_skip
3076 def _testRecvTrafficClassAndHopLimit(self):
3077 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3078 self.sendToServer(MSG)
3079
3080 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3081 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3082 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3083 # Test receiving traffic class and hop limit, using
3084 # CMSG_SPACE() to calculate buffer size.
3085 self.checkTrafficClassAndHopLimit(
3086 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3087
3088 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3089 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3090 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3091 self.sendToServer(MSG)
3092
3093 @requireAttrs(socket.socket, "sendmsg")
3094 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3095 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3096 def testSetTrafficClassAndHopLimit(self):
3097 # Test setting traffic class and hop limit on outgoing packet,
3098 # and receiving them at the other end.
3099 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3100 maxhop=self.hop_limit)
3101
3102 @testSetTrafficClassAndHopLimit.client_skip
3103 def _testSetTrafficClassAndHopLimit(self):
3104 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3105 self.assertEqual(
3106 self.sendmsgToServer([MSG],
3107 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3108 array.array("i", [self.traffic_class])),
3109 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3110 array.array("i", [self.hop_limit]))]),
3111 len(MSG))
3112
3113 @requireAttrs(socket.socket, "sendmsg")
3114 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3115 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3116 def testOddCmsgSize(self):
3117 # Try to send ancillary data with first item one byte too
3118 # long. Fall back to sending with correct size if this fails,
3119 # and check that second item was handled correctly.
3120 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3121 maxhop=self.hop_limit)
3122
3123 @testOddCmsgSize.client_skip
3124 def _testOddCmsgSize(self):
3125 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3126 try:
3127 nbytes = self.sendmsgToServer(
3128 [MSG],
3129 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003130 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003131 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3132 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003133 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003134 self.assertIsInstance(e.errno, int)
3135 nbytes = self.sendmsgToServer(
3136 [MSG],
3137 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3138 array.array("i", [self.traffic_class])),
3139 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3140 array.array("i", [self.hop_limit]))])
3141 self.assertEqual(nbytes, len(MSG))
3142
3143 # Tests for proper handling of truncated ancillary data
3144
3145 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3146 # Receive hop limit into ancbufsize bytes of ancillary data
3147 # space, which should be too small to contain the ancillary
3148 # data header (if ancbufsize is None, pass no second argument
3149 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3150 # (unless included in ignoreflags), and no ancillary data is
3151 # returned.
3152 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3153 socket.IPV6_RECVHOPLIMIT, 1)
3154 self.misc_event.set()
3155 args = () if ancbufsize is None else (ancbufsize,)
3156 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3157 len(MSG), *args)
3158
3159 self.assertEqual(msg, MSG)
3160 self.checkRecvmsgAddress(addr, self.cli_addr)
3161 self.assertEqual(ancdata, [])
3162 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3163 ignore=ignoreflags)
3164
3165 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3166 def testCmsgTruncNoBufSize(self):
3167 # Check that no ancillary data is received when no ancillary
3168 # buffer size is provided.
3169 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3170 # BSD seems to set
3171 # MSG_CTRUNC only if an item
3172 # has been partially
3173 # received.
3174 ignoreflags=socket.MSG_CTRUNC)
3175
3176 @testCmsgTruncNoBufSize.client_skip
3177 def _testCmsgTruncNoBufSize(self):
3178 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3179 self.sendToServer(MSG)
3180
3181 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3182 def testSingleCmsgTrunc0(self):
3183 # Check that no ancillary data is received when ancillary
3184 # buffer size is zero.
3185 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3186 ignoreflags=socket.MSG_CTRUNC)
3187
3188 @testSingleCmsgTrunc0.client_skip
3189 def _testSingleCmsgTrunc0(self):
3190 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3191 self.sendToServer(MSG)
3192
3193 # Check that no ancillary data is returned for various non-zero
3194 # (but still too small) buffer sizes.
3195
3196 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3197 def testSingleCmsgTrunc1(self):
3198 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3199
3200 @testSingleCmsgTrunc1.client_skip
3201 def _testSingleCmsgTrunc1(self):
3202 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3203 self.sendToServer(MSG)
3204
3205 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3206 def testSingleCmsgTrunc2Int(self):
3207 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3208
3209 @testSingleCmsgTrunc2Int.client_skip
3210 def _testSingleCmsgTrunc2Int(self):
3211 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3212 self.sendToServer(MSG)
3213
3214 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3215 def testSingleCmsgTruncLen0Minus1(self):
3216 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3217
3218 @testSingleCmsgTruncLen0Minus1.client_skip
3219 def _testSingleCmsgTruncLen0Minus1(self):
3220 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3221 self.sendToServer(MSG)
3222
3223 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3224 def testSingleCmsgTruncInData(self):
3225 # Test truncation of a control message inside its associated
3226 # data. The message may be returned with its data truncated,
3227 # or not returned at all.
3228 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3229 socket.IPV6_RECVHOPLIMIT, 1)
3230 self.misc_event.set()
3231 msg, ancdata, flags, addr = self.doRecvmsg(
3232 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3233
3234 self.assertEqual(msg, MSG)
3235 self.checkRecvmsgAddress(addr, self.cli_addr)
3236 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3237
3238 self.assertLessEqual(len(ancdata), 1)
3239 if ancdata:
3240 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3241 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3242 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3243 self.assertLess(len(cmsg_data), SIZEOF_INT)
3244
3245 @testSingleCmsgTruncInData.client_skip
3246 def _testSingleCmsgTruncInData(self):
3247 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3248 self.sendToServer(MSG)
3249
3250 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3251 # Receive traffic class and hop limit into ancbufsize bytes of
3252 # ancillary data space, which should be large enough to
3253 # contain the first item, but too small to contain the header
3254 # of the second. Check that data is MSG, MSG_CTRUNC is set
3255 # (unless included in ignoreflags), and only one ancillary
3256 # data item is returned.
3257 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3258 socket.IPV6_RECVHOPLIMIT, 1)
3259 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3260 socket.IPV6_RECVTCLASS, 1)
3261 self.misc_event.set()
3262 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3263 len(MSG), ancbufsize)
3264
3265 self.assertEqual(msg, MSG)
3266 self.checkRecvmsgAddress(addr, self.cli_addr)
3267 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3268 ignore=ignoreflags)
3269
3270 self.assertEqual(len(ancdata), 1)
3271 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3272 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3273 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3274 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3275 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003276 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003277 self.assertGreaterEqual(a[0], 0)
3278 self.assertLessEqual(a[0], 255)
3279
3280 # Try the above test with various buffer sizes.
3281
3282 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3283 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3284 def testSecondCmsgTrunc0(self):
3285 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3286 ignoreflags=socket.MSG_CTRUNC)
3287
3288 @testSecondCmsgTrunc0.client_skip
3289 def _testSecondCmsgTrunc0(self):
3290 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3291 self.sendToServer(MSG)
3292
3293 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3294 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3295 def testSecondCmsgTrunc1(self):
3296 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3297
3298 @testSecondCmsgTrunc1.client_skip
3299 def _testSecondCmsgTrunc1(self):
3300 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3301 self.sendToServer(MSG)
3302
3303 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3304 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3305 def testSecondCmsgTrunc2Int(self):
3306 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3307 2 * SIZEOF_INT)
3308
3309 @testSecondCmsgTrunc2Int.client_skip
3310 def _testSecondCmsgTrunc2Int(self):
3311 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3312 self.sendToServer(MSG)
3313
3314 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3315 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3316 def testSecondCmsgTruncLen0Minus1(self):
3317 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3318 socket.CMSG_LEN(0) - 1)
3319
3320 @testSecondCmsgTruncLen0Minus1.client_skip
3321 def _testSecondCmsgTruncLen0Minus1(self):
3322 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3323 self.sendToServer(MSG)
3324
3325 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3326 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3327 def testSecomdCmsgTruncInData(self):
3328 # Test truncation of the second of two control messages inside
3329 # its associated data.
3330 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3331 socket.IPV6_RECVHOPLIMIT, 1)
3332 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3333 socket.IPV6_RECVTCLASS, 1)
3334 self.misc_event.set()
3335 msg, ancdata, flags, addr = self.doRecvmsg(
3336 self.serv_sock, len(MSG),
3337 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3338
3339 self.assertEqual(msg, MSG)
3340 self.checkRecvmsgAddress(addr, self.cli_addr)
3341 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3342
3343 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3344
3345 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3346 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3347 cmsg_types.remove(cmsg_type)
3348 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3349 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003350 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003351 self.assertGreaterEqual(a[0], 0)
3352 self.assertLessEqual(a[0], 255)
3353
3354 if ancdata:
3355 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3356 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3357 cmsg_types.remove(cmsg_type)
3358 self.assertLess(len(cmsg_data), SIZEOF_INT)
3359
3360 self.assertEqual(ancdata, [])
3361
3362 @testSecomdCmsgTruncInData.client_skip
3363 def _testSecomdCmsgTruncInData(self):
3364 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3365 self.sendToServer(MSG)
3366
3367
3368# Derive concrete test classes for different socket types.
3369
3370class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3371 SendrecvmsgConnectionlessBase,
3372 ThreadedSocketTestMixin, UDPTestBase):
3373 pass
3374
3375@requireAttrs(socket.socket, "sendmsg")
3376@unittest.skipUnless(thread, 'Threading required for this test.')
3377class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3378 pass
3379
3380@requireAttrs(socket.socket, "recvmsg")
3381@unittest.skipUnless(thread, 'Threading required for this test.')
3382class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3383 pass
3384
3385@requireAttrs(socket.socket, "recvmsg_into")
3386@unittest.skipUnless(thread, 'Threading required for this test.')
3387class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3388 pass
3389
3390
3391class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3392 SendrecvmsgConnectionlessBase,
3393 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003394
3395 def checkRecvmsgAddress(self, addr1, addr2):
3396 # Called to compare the received address with the address of
3397 # the peer, ignoring scope ID
3398 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003399
3400@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003401@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003402@requireSocket("AF_INET6", "SOCK_DGRAM")
3403@unittest.skipUnless(thread, 'Threading required for this test.')
3404class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3405 pass
3406
3407@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003408@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003409@requireSocket("AF_INET6", "SOCK_DGRAM")
3410@unittest.skipUnless(thread, 'Threading required for this test.')
3411class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3412 pass
3413
3414@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003415@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003416@requireSocket("AF_INET6", "SOCK_DGRAM")
3417@unittest.skipUnless(thread, 'Threading required for this test.')
3418class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3419 pass
3420
3421@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003422@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003423@requireAttrs(socket, "IPPROTO_IPV6")
3424@requireSocket("AF_INET6", "SOCK_DGRAM")
3425@unittest.skipUnless(thread, 'Threading required for this test.')
3426class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3427 SendrecvmsgUDP6TestBase):
3428 pass
3429
3430@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003431@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003432@requireAttrs(socket, "IPPROTO_IPV6")
3433@requireSocket("AF_INET6", "SOCK_DGRAM")
3434@unittest.skipUnless(thread, 'Threading required for this test.')
3435class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3436 RFC3542AncillaryTest,
3437 SendrecvmsgUDP6TestBase):
3438 pass
3439
3440
3441class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3442 ConnectedStreamTestMixin, TCPTestBase):
3443 pass
3444
3445@requireAttrs(socket.socket, "sendmsg")
3446@unittest.skipUnless(thread, 'Threading required for this test.')
3447class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3448 pass
3449
3450@requireAttrs(socket.socket, "recvmsg")
3451@unittest.skipUnless(thread, 'Threading required for this test.')
3452class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3453 SendrecvmsgTCPTestBase):
3454 pass
3455
3456@requireAttrs(socket.socket, "recvmsg_into")
3457@unittest.skipUnless(thread, 'Threading required for this test.')
3458class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3459 SendrecvmsgTCPTestBase):
3460 pass
3461
3462
3463class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3464 SendrecvmsgConnectedBase,
3465 ConnectedStreamTestMixin, SCTPStreamBase):
3466 pass
3467
3468@requireAttrs(socket.socket, "sendmsg")
3469@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3470@unittest.skipUnless(thread, 'Threading required for this test.')
3471class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3472 pass
3473
3474@requireAttrs(socket.socket, "recvmsg")
3475@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3476@unittest.skipUnless(thread, 'Threading required for this test.')
3477class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3478 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003479
3480 def testRecvmsgEOF(self):
3481 try:
3482 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3483 except OSError as e:
3484 if e.errno != errno.ENOTCONN:
3485 raise
3486 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003487
3488@requireAttrs(socket.socket, "recvmsg_into")
3489@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3490@unittest.skipUnless(thread, 'Threading required for this test.')
3491class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3492 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003493
3494 def testRecvmsgEOF(self):
3495 try:
3496 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3497 except OSError as e:
3498 if e.errno != errno.ENOTCONN:
3499 raise
3500 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003501
3502
3503class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3504 ConnectedStreamTestMixin, UnixStreamBase):
3505 pass
3506
3507@requireAttrs(socket.socket, "sendmsg")
3508@requireAttrs(socket, "AF_UNIX")
3509@unittest.skipUnless(thread, 'Threading required for this test.')
3510class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3511 pass
3512
3513@requireAttrs(socket.socket, "recvmsg")
3514@requireAttrs(socket, "AF_UNIX")
3515@unittest.skipUnless(thread, 'Threading required for this test.')
3516class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3517 SendrecvmsgUnixStreamTestBase):
3518 pass
3519
3520@requireAttrs(socket.socket, "recvmsg_into")
3521@requireAttrs(socket, "AF_UNIX")
3522@unittest.skipUnless(thread, 'Threading required for this test.')
3523class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3524 SendrecvmsgUnixStreamTestBase):
3525 pass
3526
3527@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3528@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3529@unittest.skipUnless(thread, 'Threading required for this test.')
3530class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3531 pass
3532
3533@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3534@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3535@unittest.skipUnless(thread, 'Threading required for this test.')
3536class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3537 SendrecvmsgUnixStreamTestBase):
3538 pass
3539
3540
3541# Test interrupting the interruptible send/receive methods with a
3542# signal when a timeout is set. These tests avoid having multiple
3543# threads alive during the test so that the OS cannot deliver the
3544# signal to the wrong one.
3545
3546class InterruptedTimeoutBase(unittest.TestCase):
3547 # Base class for interrupted send/receive tests. Installs an
3548 # empty handler for SIGALRM and removes it on teardown, along with
3549 # any scheduled alarms.
3550
3551 def setUp(self):
3552 super().setUp()
3553 orig_alrm_handler = signal.signal(signal.SIGALRM,
3554 lambda signum, frame: None)
3555 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3556 self.addCleanup(self.setAlarm, 0)
3557
3558 # Timeout for socket operations
3559 timeout = 4.0
3560
3561 # Provide setAlarm() method to schedule delivery of SIGALRM after
3562 # given number of seconds, or cancel it if zero, and an
3563 # appropriate time value to use. Use setitimer() if available.
3564 if hasattr(signal, "setitimer"):
3565 alarm_time = 0.05
3566
3567 def setAlarm(self, seconds):
3568 signal.setitimer(signal.ITIMER_REAL, seconds)
3569 else:
3570 # Old systems may deliver the alarm up to one second early
3571 alarm_time = 2
3572
3573 def setAlarm(self, seconds):
3574 signal.alarm(seconds)
3575
3576
3577# Require siginterrupt() in order to ensure that system calls are
3578# interrupted by default.
3579@requireAttrs(signal, "siginterrupt")
3580@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3581 "Don't have signal.alarm or signal.setitimer")
3582class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3583 # Test interrupting the recv*() methods with signals when a
3584 # timeout is set.
3585
3586 def setUp(self):
3587 super().setUp()
3588 self.serv.settimeout(self.timeout)
3589
3590 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003591 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003592 # errno of EINTR when interrupted by a signal.
3593 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003594 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003595 func(*args, **kwargs)
3596 self.assertNotIsInstance(cm.exception, socket.timeout)
3597 self.assertEqual(cm.exception.errno, errno.EINTR)
3598
3599 def testInterruptedRecvTimeout(self):
3600 self.checkInterruptedRecv(self.serv.recv, 1024)
3601
3602 def testInterruptedRecvIntoTimeout(self):
3603 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3604
3605 def testInterruptedRecvfromTimeout(self):
3606 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3607
3608 def testInterruptedRecvfromIntoTimeout(self):
3609 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3610
3611 @requireAttrs(socket.socket, "recvmsg")
3612 def testInterruptedRecvmsgTimeout(self):
3613 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3614
3615 @requireAttrs(socket.socket, "recvmsg_into")
3616 def testInterruptedRecvmsgIntoTimeout(self):
3617 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3618
3619
3620# Require siginterrupt() in order to ensure that system calls are
3621# interrupted by default.
3622@requireAttrs(signal, "siginterrupt")
3623@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3624 "Don't have signal.alarm or signal.setitimer")
3625@unittest.skipUnless(thread, 'Threading required for this test.')
3626class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3627 ThreadSafeCleanupTestCase,
3628 SocketListeningTestMixin, TCPTestBase):
3629 # Test interrupting the interruptible send*() methods with signals
3630 # when a timeout is set.
3631
3632 def setUp(self):
3633 super().setUp()
3634 self.serv_conn = self.newSocket()
3635 self.addCleanup(self.serv_conn.close)
3636 # Use a thread to complete the connection, but wait for it to
3637 # terminate before running the test, so that there is only one
3638 # thread to accept the signal.
3639 cli_thread = threading.Thread(target=self.doConnect)
3640 cli_thread.start()
3641 self.cli_conn, addr = self.serv.accept()
3642 self.addCleanup(self.cli_conn.close)
3643 cli_thread.join()
3644 self.serv_conn.settimeout(self.timeout)
3645
3646 def doConnect(self):
3647 self.serv_conn.connect(self.serv_addr)
3648
3649 def checkInterruptedSend(self, func, *args, **kwargs):
3650 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003651 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003652 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003653 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003654 while True:
3655 self.setAlarm(self.alarm_time)
3656 func(*args, **kwargs)
3657 self.assertNotIsInstance(cm.exception, socket.timeout)
3658 self.assertEqual(cm.exception.errno, errno.EINTR)
3659
Ned Deilyc5640382014-02-03 13:58:31 -08003660 # Issue #12958: The following tests have problems on OS X prior to 10.7
3661 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003662 def testInterruptedSendTimeout(self):
3663 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3664
Ned Deilyc5640382014-02-03 13:58:31 -08003665 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003666 def testInterruptedSendtoTimeout(self):
3667 # Passing an actual address here as Python's wrapper for
3668 # sendto() doesn't allow passing a zero-length one; POSIX
3669 # requires that the address is ignored since the socket is
3670 # connection-mode, however.
3671 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3672 self.serv_addr)
3673
Ned Deilyc5640382014-02-03 13:58:31 -08003674 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003675 @requireAttrs(socket.socket, "sendmsg")
3676 def testInterruptedSendmsgTimeout(self):
3677 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3678
3679
Victor Stinner45df8202010-04-28 22:31:17 +00003680@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003681class TCPCloserTest(ThreadedTCPSocketTest):
3682
3683 def testClose(self):
3684 conn, addr = self.serv.accept()
3685 conn.close()
3686
3687 sd = self.cli
3688 read, write, err = select.select([sd], [], [], 1.0)
3689 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003690 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003691
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003692 # Calling close() many times should be safe.
3693 conn.close()
3694 conn.close()
3695
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003696 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003697 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003698 time.sleep(1.0)
3699
Serhiy Storchaka43767632013-11-03 21:31:38 +02003700@unittest.skipUnless(hasattr(socket, 'socketpair'),
3701 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003702@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003703class BasicSocketPairTest(SocketPairTest):
3704
3705 def __init__(self, methodName='runTest'):
3706 SocketPairTest.__init__(self, methodName=methodName)
3707
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003708 def _check_defaults(self, sock):
3709 self.assertIsInstance(sock, socket.socket)
3710 if hasattr(socket, 'AF_UNIX'):
3711 self.assertEqual(sock.family, socket.AF_UNIX)
3712 else:
3713 self.assertEqual(sock.family, socket.AF_INET)
3714 self.assertEqual(sock.type, socket.SOCK_STREAM)
3715 self.assertEqual(sock.proto, 0)
3716
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003717 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003718 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003719
3720 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003721 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003722
Dave Cole331708b2004-08-09 04:51:41 +00003723 def testRecv(self):
3724 msg = self.serv.recv(1024)
3725 self.assertEqual(msg, MSG)
3726
3727 def _testRecv(self):
3728 self.cli.send(MSG)
3729
3730 def testSend(self):
3731 self.serv.send(MSG)
3732
3733 def _testSend(self):
3734 msg = self.cli.recv(1024)
3735 self.assertEqual(msg, MSG)
3736
Victor Stinner45df8202010-04-28 22:31:17 +00003737@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003738class NonBlockingTCPTests(ThreadedTCPSocketTest):
3739
3740 def __init__(self, methodName='runTest'):
3741 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3742
3743 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003744 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003745 self.serv.setblocking(True)
3746 self.assertIsNone(self.serv.gettimeout())
3747 self.serv.setblocking(False)
3748 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003749 start = time.time()
3750 try:
3751 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003752 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003753 pass
3754 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003755 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003756
3757 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003758 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003759
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003760 @support.cpython_only
3761 def testSetBlocking_overflow(self):
3762 # Issue 15989
3763 import _testcapi
3764 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3765 self.skipTest('needs UINT_MAX < ULONG_MAX')
3766 self.serv.setblocking(False)
3767 self.assertEqual(self.serv.gettimeout(), 0.0)
3768 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3769 self.assertIsNone(self.serv.gettimeout())
3770
3771 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3772
Serhiy Storchaka43767632013-11-03 21:31:38 +02003773 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3774 'test needs socket.SOCK_NONBLOCK')
3775 @support.requires_linux_version(2, 6, 28)
3776 def testInitNonBlocking(self):
3777 # reinit server socket
3778 self.serv.close()
3779 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3780 socket.SOCK_NONBLOCK)
3781 self.port = support.bind_port(self.serv)
3782 self.serv.listen(1)
3783 # actual testing
3784 start = time.time()
3785 try:
3786 self.serv.accept()
3787 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003788 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003789 end = time.time()
3790 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3791
3792 def _testInitNonBlocking(self):
3793 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003794
Antoine Pitrou600232b2011-01-05 21:03:42 +00003795 def testInheritFlags(self):
3796 # Issue #7995: when calling accept() on a listening socket with a
3797 # timeout, the resulting socket should not be non-blocking.
3798 self.serv.settimeout(10)
3799 try:
3800 conn, addr = self.serv.accept()
3801 message = conn.recv(len(MSG))
3802 finally:
3803 conn.close()
3804 self.serv.settimeout(None)
3805
3806 def _testInheritFlags(self):
3807 time.sleep(0.1)
3808 self.cli.connect((HOST, self.port))
3809 time.sleep(0.5)
3810 self.cli.send(MSG)
3811
Guido van Rossum24e4af82002-06-12 19:18:08 +00003812 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003813 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003814 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003815 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003816 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003817 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003818 pass
3819 else:
3820 self.fail("Error trying to do non-blocking accept.")
3821 read, write, err = select.select([self.serv], [], [])
3822 if self.serv in read:
3823 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003824 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003825 else:
3826 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003827
Guido van Rossum24e4af82002-06-12 19:18:08 +00003828 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003829 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003830 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003831
3832 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003833 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003834 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003835 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003836
3837 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003838 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003839 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003840
3841 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003842 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003843 conn, addr = self.serv.accept()
3844 conn.setblocking(0)
3845 try:
3846 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003847 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003848 pass
3849 else:
3850 self.fail("Error trying to do non-blocking recv.")
3851 read, write, err = select.select([conn], [], [])
3852 if conn in read:
3853 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003854 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003855 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003856 else:
3857 self.fail("Error during select call to non-blocking socket.")
3858
3859 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003860 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003861 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003862 self.cli.send(MSG)
3863
Victor Stinner45df8202010-04-28 22:31:17 +00003864@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003865class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003866 """Unit tests for the object returned by socket.makefile()
3867
Antoine Pitrou834bd812010-10-13 16:17:14 +00003868 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003869 the client connection. You can read from this file to
3870 get output from the server.
3871
Antoine Pitrou834bd812010-10-13 16:17:14 +00003872 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003873 server connection. You can write to this file to send output
3874 to the client.
3875 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003876
Guido van Rossume9f66142002-08-07 15:46:19 +00003877 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003878 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003879 errors = 'strict'
3880 newline = None
3881
3882 read_mode = 'rb'
3883 read_msg = MSG
3884 write_mode = 'wb'
3885 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003886
Guido van Rossum24e4af82002-06-12 19:18:08 +00003887 def __init__(self, methodName='runTest'):
3888 SocketConnectedTest.__init__(self, methodName=methodName)
3889
3890 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003891 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3892 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003893 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003894 self.read_file = self.cli_conn.makefile(
3895 self.read_mode, self.bufsize,
3896 encoding = self.encoding,
3897 errors = self.errors,
3898 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003899
3900 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003901 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003902 self.read_file.close()
3903 self.assertTrue(self.read_file.closed)
3904 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003905 SocketConnectedTest.tearDown(self)
3906
3907 def clientSetUp(self):
3908 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003909 self.write_file = self.serv_conn.makefile(
3910 self.write_mode, self.bufsize,
3911 encoding = self.encoding,
3912 errors = self.errors,
3913 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003914
3915 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003916 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003917 self.write_file.close()
3918 self.assertTrue(self.write_file.closed)
3919 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003920 SocketConnectedTest.clientTearDown(self)
3921
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003922 def testReadAfterTimeout(self):
3923 # Issue #7322: A file object must disallow further reads
3924 # after a timeout has occurred.
3925 self.cli_conn.settimeout(1)
3926 self.read_file.read(3)
3927 # First read raises a timeout
3928 self.assertRaises(socket.timeout, self.read_file.read, 1)
3929 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003930 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003931 self.read_file.read(1)
3932 self.assertIn("cannot read from timed out object", str(ctx.exception))
3933
3934 def _testReadAfterTimeout(self):
3935 self.write_file.write(self.write_msg[0:3])
3936 self.write_file.flush()
3937 self.serv_finished.wait()
3938
Guido van Rossum24e4af82002-06-12 19:18:08 +00003939 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003940 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003941 first_seg = self.read_file.read(len(self.read_msg)-3)
3942 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003943 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003944 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003945
3946 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003947 self.write_file.write(self.write_msg)
3948 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003949
Guido van Rossum8c943832002-08-08 01:00:28 +00003950 def testFullRead(self):
3951 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003952 msg = self.read_file.read()
3953 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003954
3955 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003956 self.write_file.write(self.write_msg)
3957 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003958
Guido van Rossum24e4af82002-06-12 19:18:08 +00003959 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003960 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003961 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003962 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003963 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003964 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003965 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003966 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003967 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003968
3969 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003970 self.write_file.write(self.write_msg)
3971 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003972
3973 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003974 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003975 line = self.read_file.readline()
3976 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003977
3978 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003979 self.write_file.write(self.write_msg)
3980 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003981
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003982 def testCloseAfterMakefile(self):
3983 # The file returned by makefile should keep the socket open.
3984 self.cli_conn.close()
3985 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003986 msg = self.read_file.read()
3987 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003988
3989 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003990 self.write_file.write(self.write_msg)
3991 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003992
3993 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003994 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003995 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003996 if isinstance(self.read_msg, str):
3997 msg = msg.decode()
3998 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003999
4000 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004001 self.write_file.write(self.write_msg)
4002 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004003
Tim Peters116d83c2004-03-28 02:20:45 +00004004 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004005 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004006
4007 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004008 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004009
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004010 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004011 self.assertEqual(self.read_file.mode, self.read_mode)
4012 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004013
4014 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004015 self.assertEqual(self.write_file.mode, self.write_mode)
4016 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004017
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004018 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004019 self.read_file.close()
4020 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004021 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004022 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004023
4024 def _testRealClose(self):
4025 pass
4026
4027
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004028class FileObjectInterruptedTestCase(unittest.TestCase):
4029 """Test that the file object correctly handles EINTR internally."""
4030
4031 class MockSocket(object):
4032 def __init__(self, recv_funcs=()):
4033 # A generator that returns callables that we'll call for each
4034 # call to recv().
4035 self._recv_step = iter(recv_funcs)
4036
4037 def recv_into(self, buffer):
4038 data = next(self._recv_step)()
4039 assert len(buffer) >= len(data)
4040 buffer[:len(data)] = data
4041 return len(data)
4042
4043 def _decref_socketios(self):
4044 pass
4045
4046 def _textiowrap_for_test(self, buffering=-1):
4047 raw = socket.SocketIO(self, "r")
4048 if buffering < 0:
4049 buffering = io.DEFAULT_BUFFER_SIZE
4050 if buffering == 0:
4051 return raw
4052 buffer = io.BufferedReader(raw, buffering)
4053 text = io.TextIOWrapper(buffer, None, None)
4054 text.mode = "rb"
4055 return text
4056
4057 @staticmethod
4058 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004059 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004060
4061 def _textiowrap_mock_socket(self, mock, buffering=-1):
4062 raw = socket.SocketIO(mock, "r")
4063 if buffering < 0:
4064 buffering = io.DEFAULT_BUFFER_SIZE
4065 if buffering == 0:
4066 return raw
4067 buffer = io.BufferedReader(raw, buffering)
4068 text = io.TextIOWrapper(buffer, None, None)
4069 text.mode = "rb"
4070 return text
4071
4072 def _test_readline(self, size=-1, buffering=-1):
4073 mock_sock = self.MockSocket(recv_funcs=[
4074 lambda : b"This is the first line\nAnd the sec",
4075 self._raise_eintr,
4076 lambda : b"ond line is here\n",
4077 lambda : b"",
4078 lambda : b"", # XXX(gps): io library does an extra EOF read
4079 ])
4080 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004081 self.assertEqual(fo.readline(size), "This is the first line\n")
4082 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004083
4084 def _test_read(self, size=-1, buffering=-1):
4085 mock_sock = self.MockSocket(recv_funcs=[
4086 lambda : b"This is the first line\nAnd the sec",
4087 self._raise_eintr,
4088 lambda : b"ond line is here\n",
4089 lambda : b"",
4090 lambda : b"", # XXX(gps): io library does an extra EOF read
4091 ])
4092 expecting = (b"This is the first line\n"
4093 b"And the second line is here\n")
4094 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4095 if buffering == 0:
4096 data = b''
4097 else:
4098 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004099 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004100 while len(data) != len(expecting):
4101 part = fo.read(size)
4102 if not part:
4103 break
4104 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004105 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004106
4107 def test_default(self):
4108 self._test_readline()
4109 self._test_readline(size=100)
4110 self._test_read()
4111 self._test_read(size=100)
4112
4113 def test_with_1k_buffer(self):
4114 self._test_readline(buffering=1024)
4115 self._test_readline(size=100, buffering=1024)
4116 self._test_read(buffering=1024)
4117 self._test_read(size=100, buffering=1024)
4118
4119 def _test_readline_no_buffer(self, size=-1):
4120 mock_sock = self.MockSocket(recv_funcs=[
4121 lambda : b"a",
4122 lambda : b"\n",
4123 lambda : b"B",
4124 self._raise_eintr,
4125 lambda : b"b",
4126 lambda : b"",
4127 ])
4128 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004129 self.assertEqual(fo.readline(size), b"a\n")
4130 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004131
4132 def test_no_buffer(self):
4133 self._test_readline_no_buffer()
4134 self._test_readline_no_buffer(size=4)
4135 self._test_read(buffering=0)
4136 self._test_read(size=100, buffering=0)
4137
4138
Guido van Rossume9f66142002-08-07 15:46:19 +00004139class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4140
4141 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004142
Guido van Rossume9f66142002-08-07 15:46:19 +00004143 In this case (and in this case only), it should be possible to
4144 create a file object, read a line from it, create another file
4145 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004146 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004147 when reading multiple requests from the same socket."""
4148
4149 bufsize = 0 # Use unbuffered mode
4150
4151 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004152 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004153 line = self.read_file.readline() # first line
4154 self.assertEqual(line, b"A. " + self.write_msg) # first line
4155 self.read_file = self.cli_conn.makefile('rb', 0)
4156 line = self.read_file.readline() # second line
4157 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004158
4159 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004160 self.write_file.write(b"A. " + self.write_msg)
4161 self.write_file.write(b"B. " + self.write_msg)
4162 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004163
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004164 def testMakefileClose(self):
4165 # The file returned by makefile should keep the socket open...
4166 self.cli_conn.close()
4167 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004168 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004169 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004170 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004171 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004172
4173 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004174 self.write_file.write(self.write_msg)
4175 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004176
4177 def testMakefileCloseSocketDestroy(self):
4178 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004179 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004180 refcount_after = sys.getrefcount(self.cli_conn)
4181 self.assertEqual(refcount_before - 1, refcount_after)
4182
4183 def _testMakefileCloseSocketDestroy(self):
4184 pass
4185
Antoine Pitrou98b46702010-09-18 22:59:00 +00004186 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004187 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004188 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4189
4190 def testSmallReadNonBlocking(self):
4191 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004192 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4193 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004194 self.evt1.set()
4195 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004196 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004197 if first_seg is None:
4198 # Data not arrived (can happen under Windows), wait a bit
4199 time.sleep(0.5)
4200 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004201 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004202 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004203 self.assertEqual(n, 3)
4204 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004205 self.assertEqual(msg, self.read_msg)
4206 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4207 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004208
4209 def _testSmallReadNonBlocking(self):
4210 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004211 self.write_file.write(self.write_msg)
4212 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004213 self.evt2.set()
4214 # Avoid cloding the socket before the server test has finished,
4215 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4216 self.serv_finished.wait(5.0)
4217
4218 def testWriteNonBlocking(self):
4219 self.cli_finished.wait(5.0)
4220 # The client thread can't skip directly - the SkipTest exception
4221 # would appear as a failure.
4222 if self.serv_skipped:
4223 self.skipTest(self.serv_skipped)
4224
4225 def _testWriteNonBlocking(self):
4226 self.serv_skipped = None
4227 self.serv_conn.setblocking(False)
4228 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004229 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004230 LIMIT = 10
4231 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004232 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004233 self.assertGreater(n, 0)
4234 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004235 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004236 if n is None:
4237 # Succeeded
4238 break
4239 self.assertGreater(n, 0)
4240 else:
4241 # Let us know that this test didn't manage to establish
4242 # the expected conditions. This is not a failure in itself but,
4243 # if it happens repeatedly, the test should be fixed.
4244 self.serv_skipped = "failed to saturate the socket buffer"
4245
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004246
Guido van Rossum8c943832002-08-08 01:00:28 +00004247class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4248
4249 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4250
4251
4252class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4253
4254 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004255
Thomas Woutersb2137042007-02-01 18:02:27 +00004256
Antoine Pitrou834bd812010-10-13 16:17:14 +00004257class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4258 """Tests for socket.makefile() in text mode (rather than binary)"""
4259
4260 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004261 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004262 write_mode = 'wb'
4263 write_msg = MSG
4264 newline = ''
4265
4266
4267class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4268 """Tests for socket.makefile() in text mode (rather than binary)"""
4269
4270 read_mode = 'rb'
4271 read_msg = MSG
4272 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004273 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004274 newline = ''
4275
4276
4277class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4278 """Tests for socket.makefile() in text mode (rather than binary)"""
4279
4280 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004281 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004282 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004283 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004284 newline = ''
4285
4286
Guido van Rossumd8faa362007-04-27 19:54:29 +00004287class NetworkConnectionTest(object):
4288 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004289
Guido van Rossumd8faa362007-04-27 19:54:29 +00004290 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004291 # We're inherited below by BasicTCPTest2, which also inherits
4292 # BasicTCPTest, which defines self.port referenced below.
4293 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004294 self.serv_conn = self.cli
4295
4296class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4297 """Tests that NetworkConnection does not break existing TCP functionality.
4298 """
4299
4300class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004301
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004302 class MockSocket(socket.socket):
4303 def connect(self, *args):
4304 raise socket.timeout('timed out')
4305
4306 @contextlib.contextmanager
4307 def mocked_socket_module(self):
4308 """Return a socket which times out on connect"""
4309 old_socket = socket.socket
4310 socket.socket = self.MockSocket
4311 try:
4312 yield
4313 finally:
4314 socket.socket = old_socket
4315
4316 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004317 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004318 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004319 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004320 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004321 cli.connect((HOST, port))
4322 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4323
4324 def test_create_connection(self):
4325 # Issue #9792: errors raised by create_connection() should have
4326 # a proper errno attribute.
4327 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004328 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004329 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004330
4331 # Issue #16257: create_connection() calls getaddrinfo() against
4332 # 'localhost'. This may result in an IPV6 addr being returned
4333 # as well as an IPV4 one:
4334 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4335 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4336 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4337 #
4338 # create_connection() enumerates through all the addresses returned
4339 # and if it doesn't successfully bind to any of them, it propagates
4340 # the last exception it encountered.
4341 #
4342 # On Solaris, ENETUNREACH is returned in this circumstance instead
4343 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4344 # expected errnos.
4345 expected_errnos = [ errno.ECONNREFUSED, ]
4346 if hasattr(errno, 'ENETUNREACH'):
4347 expected_errnos.append(errno.ENETUNREACH)
4348
4349 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004350
4351 def test_create_connection_timeout(self):
4352 # Issue #9792: create_connection() should not recast timeout errors
4353 # as generic socket errors.
4354 with self.mocked_socket_module():
4355 with self.assertRaises(socket.timeout):
4356 socket.create_connection((HOST, 1234))
4357
Guido van Rossumd8faa362007-04-27 19:54:29 +00004358
Victor Stinner45df8202010-04-28 22:31:17 +00004359@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004360class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4361
4362 def __init__(self, methodName='runTest'):
4363 SocketTCPTest.__init__(self, methodName=methodName)
4364 ThreadableTest.__init__(self)
4365
4366 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004367 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004368
4369 def clientTearDown(self):
4370 self.cli.close()
4371 self.cli = None
4372 ThreadableTest.clientTearDown(self)
4373
4374 def _justAccept(self):
4375 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004376 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004377
4378 testFamily = _justAccept
4379 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004380 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004381 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004382 self.assertEqual(self.cli.family, 2)
4383
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004384 testSourceAddress = _justAccept
4385 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004386 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4387 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004388 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004389 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004390 # The port number being used is sufficient to show that the bind()
4391 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004392
Guido van Rossumd8faa362007-04-27 19:54:29 +00004393 testTimeoutDefault = _justAccept
4394 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004395 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004396 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004397 socket.setdefaulttimeout(42)
4398 try:
4399 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004400 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004401 finally:
4402 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004403 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004404
4405 testTimeoutNone = _justAccept
4406 def _testTimeoutNone(self):
4407 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004408 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004409 socket.setdefaulttimeout(30)
4410 try:
4411 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004412 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004413 finally:
4414 socket.setdefaulttimeout(None)
4415 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004416
4417 testTimeoutValueNamed = _justAccept
4418 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004419 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004420 self.assertEqual(self.cli.gettimeout(), 30)
4421
4422 testTimeoutValueNonamed = _justAccept
4423 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004424 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004425 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004426 self.assertEqual(self.cli.gettimeout(), 30)
4427
Victor Stinner45df8202010-04-28 22:31:17 +00004428@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004429class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4430
4431 def __init__(self, methodName='runTest'):
4432 SocketTCPTest.__init__(self, methodName=methodName)
4433 ThreadableTest.__init__(self)
4434
4435 def clientSetUp(self):
4436 pass
4437
4438 def clientTearDown(self):
4439 self.cli.close()
4440 self.cli = None
4441 ThreadableTest.clientTearDown(self)
4442
4443 def testInsideTimeout(self):
4444 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004445 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004446 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004447 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004448 testOutsideTimeout = testInsideTimeout
4449
4450 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004451 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004452 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004453 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004454
4455 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004456 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004457 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004458
4459
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004460class TCPTimeoutTest(SocketTCPTest):
4461
4462 def testTCPTimeout(self):
4463 def raise_timeout(*args, **kwargs):
4464 self.serv.settimeout(1.0)
4465 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004466 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004467 "Error generating a timeout exception (TCP)")
4468
4469 def testTimeoutZero(self):
4470 ok = False
4471 try:
4472 self.serv.settimeout(0.0)
4473 foo = self.serv.accept()
4474 except socket.timeout:
4475 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004476 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004477 ok = True
4478 except:
4479 self.fail("caught unexpected exception (TCP)")
4480 if not ok:
4481 self.fail("accept() returned success when we did not expect it")
4482
Serhiy Storchaka43767632013-11-03 21:31:38 +02004483 @unittest.skipUnless(hasattr(signal, 'alarm'),
4484 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004485 def testInterruptedTimeout(self):
4486 # XXX I don't know how to do this test on MSWindows or any other
4487 # plaform that doesn't support signal.alarm() or os.kill(), though
4488 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004489 self.serv.settimeout(5.0) # must be longer than alarm
4490 class Alarm(Exception):
4491 pass
4492 def alarm_handler(signal, frame):
4493 raise Alarm
4494 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4495 try:
4496 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4497 try:
4498 foo = self.serv.accept()
4499 except socket.timeout:
4500 self.fail("caught timeout instead of Alarm")
4501 except Alarm:
4502 pass
4503 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004504 self.fail("caught other exception instead of Alarm:"
4505 " %s(%s):\n%s" %
4506 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004507 else:
4508 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004509 finally:
4510 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004511 except Alarm:
4512 self.fail("got Alarm in wrong place")
4513 finally:
4514 # no alarm can be pending. Safe to restore old handler.
4515 signal.signal(signal.SIGALRM, old_alarm)
4516
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004517class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004518
4519 def testUDPTimeout(self):
4520 def raise_timeout(*args, **kwargs):
4521 self.serv.settimeout(1.0)
4522 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004523 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004524 "Error generating a timeout exception (UDP)")
4525
4526 def testTimeoutZero(self):
4527 ok = False
4528 try:
4529 self.serv.settimeout(0.0)
4530 foo = self.serv.recv(1024)
4531 except socket.timeout:
4532 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004533 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004534 ok = True
4535 except:
4536 self.fail("caught unexpected exception (UDP)")
4537 if not ok:
4538 self.fail("recv() returned success when we did not expect it")
4539
4540class TestExceptions(unittest.TestCase):
4541
4542 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004543 self.assertTrue(issubclass(OSError, Exception))
4544 self.assertTrue(issubclass(socket.herror, OSError))
4545 self.assertTrue(issubclass(socket.gaierror, OSError))
4546 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004547
Serhiy Storchaka43767632013-11-03 21:31:38 +02004548@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004549class TestLinuxAbstractNamespace(unittest.TestCase):
4550
4551 UNIX_PATH_MAX = 108
4552
4553 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004554 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004555 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4556 s1.bind(address)
4557 s1.listen(1)
4558 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4559 s2.connect(s1.getsockname())
4560 with s1.accept()[0] as s3:
4561 self.assertEqual(s1.getsockname(), address)
4562 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004563
4564 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004565 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004566 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4567 s.bind(address)
4568 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004569
4570 def testNameOverflow(self):
4571 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004572 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004573 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004574
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004575 def testStrName(self):
4576 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004577 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4578 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004579 s.bind("\x00python\x00test\x00")
4580 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004581 finally:
4582 s.close()
4583
Serhiy Storchaka43767632013-11-03 21:31:38 +02004584@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004585class TestUnixDomain(unittest.TestCase):
4586
4587 def setUp(self):
4588 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4589
4590 def tearDown(self):
4591 self.sock.close()
4592
4593 def encoded(self, path):
4594 # Return the given path encoded in the file system encoding,
4595 # or skip the test if this is not possible.
4596 try:
4597 return os.fsencode(path)
4598 except UnicodeEncodeError:
4599 self.skipTest(
4600 "Pathname {0!a} cannot be represented in file "
4601 "system encoding {1!r}".format(
4602 path, sys.getfilesystemencoding()))
4603
Antoine Pitrou16374872011-12-16 15:04:12 +01004604 def bind(self, sock, path):
4605 # Bind the socket
4606 try:
4607 sock.bind(path)
4608 except OSError as e:
4609 if str(e) == "AF_UNIX path too long":
4610 self.skipTest(
4611 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4612 .format(path))
4613 else:
4614 raise
4615
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004616 def testStrAddr(self):
4617 # Test binding to and retrieving a normal string pathname.
4618 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004619 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004620 self.addCleanup(support.unlink, path)
4621 self.assertEqual(self.sock.getsockname(), path)
4622
4623 def testBytesAddr(self):
4624 # Test binding to a bytes pathname.
4625 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004626 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004627 self.addCleanup(support.unlink, path)
4628 self.assertEqual(self.sock.getsockname(), path)
4629
4630 def testSurrogateescapeBind(self):
4631 # Test binding to a valid non-ASCII pathname, with the
4632 # non-ASCII bytes supplied using surrogateescape encoding.
4633 path = os.path.abspath(support.TESTFN_UNICODE)
4634 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004635 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004636 self.addCleanup(support.unlink, path)
4637 self.assertEqual(self.sock.getsockname(), path)
4638
4639 def testUnencodableAddr(self):
4640 # Test binding to a pathname that cannot be encoded in the
4641 # file system encoding.
4642 if support.TESTFN_UNENCODABLE is None:
4643 self.skipTest("No unencodable filename available")
4644 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004645 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004646 self.addCleanup(support.unlink, path)
4647 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004648
Victor Stinner45df8202010-04-28 22:31:17 +00004649@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004650class BufferIOTest(SocketConnectedTest):
4651 """
4652 Test the buffer versions of socket.recv() and socket.send().
4653 """
4654 def __init__(self, methodName='runTest'):
4655 SocketConnectedTest.__init__(self, methodName=methodName)
4656
Antoine Pitrou25480782010-03-17 22:50:28 +00004657 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004658 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004659 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004660 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004661 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004662 self.assertEqual(msg, MSG)
4663
Antoine Pitrou25480782010-03-17 22:50:28 +00004664 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004665 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004666 self.serv_conn.send(buf)
4667
Antoine Pitrou25480782010-03-17 22:50:28 +00004668 def testRecvIntoBytearray(self):
4669 buf = bytearray(1024)
4670 nbytes = self.cli_conn.recv_into(buf)
4671 self.assertEqual(nbytes, len(MSG))
4672 msg = buf[:len(MSG)]
4673 self.assertEqual(msg, MSG)
4674
4675 _testRecvIntoBytearray = _testRecvIntoArray
4676
4677 def testRecvIntoMemoryview(self):
4678 buf = bytearray(1024)
4679 nbytes = self.cli_conn.recv_into(memoryview(buf))
4680 self.assertEqual(nbytes, len(MSG))
4681 msg = buf[:len(MSG)]
4682 self.assertEqual(msg, MSG)
4683
4684 _testRecvIntoMemoryview = _testRecvIntoArray
4685
4686 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004687 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004688 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004689 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004690 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004691 self.assertEqual(msg, MSG)
4692
Antoine Pitrou25480782010-03-17 22:50:28 +00004693 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004694 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004695 self.serv_conn.send(buf)
4696
Antoine Pitrou25480782010-03-17 22:50:28 +00004697 def testRecvFromIntoBytearray(self):
4698 buf = bytearray(1024)
4699 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4700 self.assertEqual(nbytes, len(MSG))
4701 msg = buf[:len(MSG)]
4702 self.assertEqual(msg, MSG)
4703
4704 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4705
4706 def testRecvFromIntoMemoryview(self):
4707 buf = bytearray(1024)
4708 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4709 self.assertEqual(nbytes, len(MSG))
4710 msg = buf[:len(MSG)]
4711 self.assertEqual(msg, MSG)
4712
4713 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4714
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004715 def testRecvFromIntoSmallBuffer(self):
4716 # See issue #20246.
4717 buf = bytearray(8)
4718 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4719
4720 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004721 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004722
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004723 def testRecvFromIntoEmptyBuffer(self):
4724 buf = bytearray()
4725 self.cli_conn.recvfrom_into(buf)
4726 self.cli_conn.recvfrom_into(buf, 0)
4727
4728 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4729
Christian Heimes043d6f62008-01-07 17:19:16 +00004730
4731TIPC_STYPE = 2000
4732TIPC_LOWER = 200
4733TIPC_UPPER = 210
4734
4735def isTipcAvailable():
4736 """Check if the TIPC module is loaded
4737
4738 The TIPC module is not loaded automatically on Ubuntu and probably
4739 other Linux distros.
4740 """
4741 if not hasattr(socket, "AF_TIPC"):
4742 return False
4743 if not os.path.isfile("/proc/modules"):
4744 return False
4745 with open("/proc/modules") as f:
4746 for line in f:
4747 if line.startswith("tipc "):
4748 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004749 return False
4750
Serhiy Storchaka43767632013-11-03 21:31:38 +02004751@unittest.skipUnless(isTipcAvailable(),
4752 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004753class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004754 def testRDM(self):
4755 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4756 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004757 self.addCleanup(srv.close)
4758 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004759
4760 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4761 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4762 TIPC_LOWER, TIPC_UPPER)
4763 srv.bind(srvaddr)
4764
4765 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4766 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4767 cli.sendto(MSG, sendaddr)
4768
4769 msg, recvaddr = srv.recvfrom(1024)
4770
4771 self.assertEqual(cli.getsockname(), recvaddr)
4772 self.assertEqual(msg, MSG)
4773
4774
Serhiy Storchaka43767632013-11-03 21:31:38 +02004775@unittest.skipUnless(isTipcAvailable(),
4776 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004777class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004778 def __init__(self, methodName = 'runTest'):
4779 unittest.TestCase.__init__(self, methodName = methodName)
4780 ThreadableTest.__init__(self)
4781
4782 def setUp(self):
4783 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004784 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004785 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4786 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4787 TIPC_LOWER, TIPC_UPPER)
4788 self.srv.bind(srvaddr)
4789 self.srv.listen(5)
4790 self.serverExplicitReady()
4791 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004792 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004793
4794 def clientSetUp(self):
4795 # The is a hittable race between serverExplicitReady() and the
4796 # accept() call; sleep a little while to avoid it, otherwise
4797 # we could get an exception
4798 time.sleep(0.1)
4799 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004800 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004801 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4802 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4803 self.cli.connect(addr)
4804 self.cliaddr = self.cli.getsockname()
4805
4806 def testStream(self):
4807 msg = self.conn.recv(1024)
4808 self.assertEqual(msg, MSG)
4809 self.assertEqual(self.cliaddr, self.connaddr)
4810
4811 def _testStream(self):
4812 self.cli.send(MSG)
4813 self.cli.close()
4814
4815
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004816@unittest.skipUnless(thread, 'Threading required for this test.')
4817class ContextManagersTest(ThreadedTCPSocketTest):
4818
4819 def _testSocketClass(self):
4820 # base test
4821 with socket.socket() as sock:
4822 self.assertFalse(sock._closed)
4823 self.assertTrue(sock._closed)
4824 # close inside with block
4825 with socket.socket() as sock:
4826 sock.close()
4827 self.assertTrue(sock._closed)
4828 # exception inside with block
4829 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004830 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004831 self.assertTrue(sock._closed)
4832
4833 def testCreateConnectionBase(self):
4834 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004835 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004836 data = conn.recv(1024)
4837 conn.sendall(data)
4838
4839 def _testCreateConnectionBase(self):
4840 address = self.serv.getsockname()
4841 with socket.create_connection(address) as sock:
4842 self.assertFalse(sock._closed)
4843 sock.sendall(b'foo')
4844 self.assertEqual(sock.recv(1024), b'foo')
4845 self.assertTrue(sock._closed)
4846
4847 def testCreateConnectionClose(self):
4848 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004849 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004850 data = conn.recv(1024)
4851 conn.sendall(data)
4852
4853 def _testCreateConnectionClose(self):
4854 address = self.serv.getsockname()
4855 with socket.create_connection(address) as sock:
4856 sock.close()
4857 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004858 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004859
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004860
Victor Stinnerdaf45552013-08-28 00:53:59 +02004861class InheritanceTest(unittest.TestCase):
4862 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4863 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004864 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004865 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004866 with socket.socket(socket.AF_INET,
4867 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4868 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004869 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004870
4871 def test_default_inheritable(self):
4872 sock = socket.socket()
4873 with sock:
4874 self.assertEqual(sock.get_inheritable(), False)
4875
4876 def test_dup(self):
4877 sock = socket.socket()
4878 with sock:
4879 newsock = sock.dup()
4880 sock.close()
4881 with newsock:
4882 self.assertEqual(newsock.get_inheritable(), False)
4883
4884 def test_set_inheritable(self):
4885 sock = socket.socket()
4886 with sock:
4887 sock.set_inheritable(True)
4888 self.assertEqual(sock.get_inheritable(), True)
4889
4890 sock.set_inheritable(False)
4891 self.assertEqual(sock.get_inheritable(), False)
4892
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004893 @unittest.skipIf(fcntl is None, "need fcntl")
4894 def test_get_inheritable_cloexec(self):
4895 sock = socket.socket()
4896 with sock:
4897 fd = sock.fileno()
4898 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004899
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004900 # clear FD_CLOEXEC flag
4901 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4902 flags &= ~fcntl.FD_CLOEXEC
4903 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004904
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004905 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004906
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004907 @unittest.skipIf(fcntl is None, "need fcntl")
4908 def test_set_inheritable_cloexec(self):
4909 sock = socket.socket()
4910 with sock:
4911 fd = sock.fileno()
4912 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4913 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004914
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004915 sock.set_inheritable(True)
4916 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4917 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004918
4919
Victor Stinnerdaf45552013-08-28 00:53:59 +02004920 @unittest.skipUnless(hasattr(socket, "socketpair"),
4921 "need socket.socketpair()")
4922 def test_socketpair(self):
4923 s1, s2 = socket.socketpair()
4924 self.addCleanup(s1.close)
4925 self.addCleanup(s2.close)
4926 self.assertEqual(s1.get_inheritable(), False)
4927 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004928
4929
4930@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4931 "SOCK_NONBLOCK not defined")
4932class NonblockConstantTest(unittest.TestCase):
4933 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4934 if nonblock:
4935 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4936 self.assertEqual(s.gettimeout(), timeout)
4937 else:
4938 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4939 self.assertEqual(s.gettimeout(), None)
4940
Charles-François Natali239bb962011-06-03 12:55:15 +02004941 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004942 def test_SOCK_NONBLOCK(self):
4943 # a lot of it seems silly and redundant, but I wanted to test that
4944 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004945 with socket.socket(socket.AF_INET,
4946 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4947 self.checkNonblock(s)
4948 s.setblocking(1)
4949 self.checkNonblock(s, False)
4950 s.setblocking(0)
4951 self.checkNonblock(s)
4952 s.settimeout(None)
4953 self.checkNonblock(s, False)
4954 s.settimeout(2.0)
4955 self.checkNonblock(s, timeout=2.0)
4956 s.setblocking(1)
4957 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004958 # defaulttimeout
4959 t = socket.getdefaulttimeout()
4960 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004961 with socket.socket() as s:
4962 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004963 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004964 with socket.socket() as s:
4965 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004966 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004967 with socket.socket() as s:
4968 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004969 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004970 with socket.socket() as s:
4971 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004972 socket.setdefaulttimeout(t)
4973
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004974
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004975@unittest.skipUnless(os.name == "nt", "Windows specific")
4976@unittest.skipUnless(multiprocessing, "need multiprocessing")
4977class TestSocketSharing(SocketTCPTest):
4978 # This must be classmethod and not staticmethod or multiprocessing
4979 # won't be able to bootstrap it.
4980 @classmethod
4981 def remoteProcessServer(cls, q):
4982 # Recreate socket from shared data
4983 sdata = q.get()
4984 message = q.get()
4985
4986 s = socket.fromshare(sdata)
4987 s2, c = s.accept()
4988
4989 # Send the message
4990 s2.sendall(message)
4991 s2.close()
4992 s.close()
4993
4994 def testShare(self):
4995 # Transfer the listening server socket to another process
4996 # and service it from there.
4997
4998 # Create process:
4999 q = multiprocessing.Queue()
5000 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5001 p.start()
5002
5003 # Get the shared socket data
5004 data = self.serv.share(p.pid)
5005
5006 # Pass the shared socket to the other process
5007 addr = self.serv.getsockname()
5008 self.serv.close()
5009 q.put(data)
5010
5011 # The data that the server will send us
5012 message = b"slapmahfro"
5013 q.put(message)
5014
5015 # Connect
5016 s = socket.create_connection(addr)
5017 # listen for the data
5018 m = []
5019 while True:
5020 data = s.recv(100)
5021 if not data:
5022 break
5023 m.append(data)
5024 s.close()
5025 received = b"".join(m)
5026 self.assertEqual(received, message)
5027 p.join()
5028
5029 def testShareLength(self):
5030 data = self.serv.share(os.getpid())
5031 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5032 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5033
5034 def compareSockets(self, org, other):
5035 # socket sharing is expected to work only for blocking socket
5036 # since the internal python timout value isn't transfered.
5037 self.assertEqual(org.gettimeout(), None)
5038 self.assertEqual(org.gettimeout(), other.gettimeout())
5039
5040 self.assertEqual(org.family, other.family)
5041 self.assertEqual(org.type, other.type)
5042 # If the user specified "0" for proto, then
5043 # internally windows will have picked the correct value.
5044 # Python introspection on the socket however will still return
5045 # 0. For the shared socket, the python value is recreated
5046 # from the actual value, so it may not compare correctly.
5047 if org.proto != 0:
5048 self.assertEqual(org.proto, other.proto)
5049
5050 def testShareLocal(self):
5051 data = self.serv.share(os.getpid())
5052 s = socket.fromshare(data)
5053 try:
5054 self.compareSockets(self.serv, s)
5055 finally:
5056 s.close()
5057
5058 def testTypes(self):
5059 families = [socket.AF_INET, socket.AF_INET6]
5060 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5061 for f in families:
5062 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005063 try:
5064 source = socket.socket(f, t)
5065 except OSError:
5066 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005067 try:
5068 data = source.share(os.getpid())
5069 shared = socket.fromshare(data)
5070 try:
5071 self.compareSockets(source, shared)
5072 finally:
5073 shared.close()
5074 finally:
5075 source.close()
5076
5077
Guido van Rossumb995eb72002-07-31 16:08:40 +00005078def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005079 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005080 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005081
5082 tests.extend([
5083 NonBlockingTCPTests,
5084 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005085 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005086 UnbufferedFileObjectClassTestCase,
5087 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005088 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005089 UnicodeReadFileObjectClassTestCase,
5090 UnicodeWriteFileObjectClassTestCase,
5091 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005092 NetworkConnectionNoServer,
5093 NetworkConnectionAttributesTest,
5094 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005095 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005096 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005097 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005098 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005099 tests.append(BasicSocketPairTest)
5100 tests.append(TestUnixDomain)
5101 tests.append(TestLinuxAbstractNamespace)
5102 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005103 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005104 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005105 tests.extend([
5106 CmsgMacroTests,
5107 SendmsgUDPTest,
5108 RecvmsgUDPTest,
5109 RecvmsgIntoUDPTest,
5110 SendmsgUDP6Test,
5111 RecvmsgUDP6Test,
5112 RecvmsgRFC3542AncillaryUDP6Test,
5113 RecvmsgIntoRFC3542AncillaryUDP6Test,
5114 RecvmsgIntoUDP6Test,
5115 SendmsgTCPTest,
5116 RecvmsgTCPTest,
5117 RecvmsgIntoTCPTest,
5118 SendmsgSCTPStreamTest,
5119 RecvmsgSCTPStreamTest,
5120 RecvmsgIntoSCTPStreamTest,
5121 SendmsgUnixStreamTest,
5122 RecvmsgUnixStreamTest,
5123 RecvmsgIntoUnixStreamTest,
5124 RecvmsgSCMRightsStreamTest,
5125 RecvmsgIntoSCMRightsStreamTest,
5126 # These are slow when setitimer() is not available
5127 InterruptedRecvTimeoutTest,
5128 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005129 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005130 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005131
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005132 thread_info = support.threading_setup()
5133 support.run_unittest(*tests)
5134 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005135
5136if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005137 test_main()