blob: 86cbec7c37e8847a7503fd914554efbc40fc8812 [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:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001347 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1348 srv.bind((HOST, 0))
1349 srv.listen(backlog)
1350
1351 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001352 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001353 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001354
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001355 @support.cpython_only
1356 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001357 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001358 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001359 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1360 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001361 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001362 srv.close()
1363
Charles-François Natali42663332012-01-02 15:57:30 +01001364 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001365 def test_flowinfo(self):
1366 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001367 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001368 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001369 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001370
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001371 def test_str_for_enums(self):
1372 # Make sure that the AF_* and SOCK_* constants have enum-like string
1373 # reprs.
1374 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1375 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
1376 self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM')
1377
1378 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1379 def test_uknown_socket_family_repr(self):
1380 # Test that when created with a family that's not one of the known
1381 # AF_*/SOCK_* constants, socket.family just returns the number.
1382 #
1383 # To do this we fool socket.socket into believing it already has an
1384 # open fd because on this path it doesn't actually verify the family and
1385 # type and populates the socket object.
1386 #
1387 # On Windows this trick won't work, so the test is skipped.
1388 fd, _ = tempfile.mkstemp()
1389 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1390 self.assertEqual(s.family, 42424)
1391 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001392
Charles-François Natali47413c12011-10-06 19:47:44 +02001393@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1394class BasicCANTest(unittest.TestCase):
1395
1396 def testCrucialConstants(self):
1397 socket.AF_CAN
1398 socket.PF_CAN
1399 socket.CAN_RAW
1400
Charles-François Natali773e42d2013-02-05 19:42:01 +01001401 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1402 'socket.CAN_BCM required for this test.')
1403 def testBCMConstants(self):
1404 socket.CAN_BCM
1405
1406 # opcodes
1407 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1408 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1409 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1410 socket.CAN_BCM_TX_SEND # send one CAN frame
1411 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1412 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1413 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1414 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1415 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1416 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1417 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1418 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1419
Charles-François Natali47413c12011-10-06 19:47:44 +02001420 def testCreateSocket(self):
1421 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1422 pass
1423
Charles-François Natali773e42d2013-02-05 19:42:01 +01001424 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1425 'socket.CAN_BCM required for this test.')
1426 def testCreateBCMSocket(self):
1427 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1428 pass
1429
Charles-François Natali47413c12011-10-06 19:47:44 +02001430 def testBindAny(self):
1431 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1432 s.bind(('', ))
1433
1434 def testTooLongInterfaceName(self):
1435 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1436 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001437 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001438 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001439
1440 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1441 'socket.CAN_RAW_LOOPBACK required for this test.')
1442 def testLoopback(self):
1443 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1444 for loopback in (0, 1):
1445 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1446 loopback)
1447 self.assertEqual(loopback,
1448 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1449
1450 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1451 'socket.CAN_RAW_FILTER required for this test.')
1452 def testFilter(self):
1453 can_id, can_mask = 0x200, 0x700
1454 can_filter = struct.pack("=II", can_id, can_mask)
1455 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1456 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1457 self.assertEqual(can_filter,
1458 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1459
1460
1461@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001462class CANTest(ThreadedCANSocketTest):
1463
Charles-François Natali47413c12011-10-06 19:47:44 +02001464 def __init__(self, methodName='runTest'):
1465 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1466
1467 @classmethod
1468 def build_can_frame(cls, can_id, data):
1469 """Build a CAN frame."""
1470 can_dlc = len(data)
1471 data = data.ljust(8, b'\x00')
1472 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1473
1474 @classmethod
1475 def dissect_can_frame(cls, frame):
1476 """Dissect a CAN frame."""
1477 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1478 return (can_id, can_dlc, data[:can_dlc])
1479
1480 def testSendFrame(self):
1481 cf, addr = self.s.recvfrom(self.bufsize)
1482 self.assertEqual(self.cf, cf)
1483 self.assertEqual(addr[0], self.interface)
1484 self.assertEqual(addr[1], socket.AF_CAN)
1485
1486 def _testSendFrame(self):
1487 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1488 self.cli.send(self.cf)
1489
1490 def testSendMaxFrame(self):
1491 cf, addr = self.s.recvfrom(self.bufsize)
1492 self.assertEqual(self.cf, cf)
1493
1494 def _testSendMaxFrame(self):
1495 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1496 self.cli.send(self.cf)
1497
1498 def testSendMultiFrames(self):
1499 cf, addr = self.s.recvfrom(self.bufsize)
1500 self.assertEqual(self.cf1, cf)
1501
1502 cf, addr = self.s.recvfrom(self.bufsize)
1503 self.assertEqual(self.cf2, cf)
1504
1505 def _testSendMultiFrames(self):
1506 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1507 self.cli.send(self.cf1)
1508
1509 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1510 self.cli.send(self.cf2)
1511
Charles-François Natali773e42d2013-02-05 19:42:01 +01001512 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1513 'socket.CAN_BCM required for this test.')
1514 def _testBCM(self):
1515 cf, addr = self.cli.recvfrom(self.bufsize)
1516 self.assertEqual(self.cf, cf)
1517 can_id, can_dlc, data = self.dissect_can_frame(cf)
1518 self.assertEqual(self.can_id, can_id)
1519 self.assertEqual(self.data, data)
1520
1521 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1522 'socket.CAN_BCM required for this test.')
1523 def testBCM(self):
1524 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1525 self.addCleanup(bcm.close)
1526 bcm.connect((self.interface,))
1527 self.can_id = 0x123
1528 self.data = bytes([0xc0, 0xff, 0xee])
1529 self.cf = self.build_can_frame(self.can_id, self.data)
1530 opcode = socket.CAN_BCM_TX_SEND
1531 flags = 0
1532 count = 0
1533 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1534 bcm_can_id = 0x0222
1535 nframes = 1
1536 assert len(self.cf) == 16
1537 header = struct.pack(self.bcm_cmd_msg_fmt,
1538 opcode,
1539 flags,
1540 count,
1541 ival1_seconds,
1542 ival1_usec,
1543 ival2_seconds,
1544 ival2_usec,
1545 bcm_can_id,
1546 nframes,
1547 )
1548 header_plus_frame = header + self.cf
1549 bytes_sent = bcm.send(header_plus_frame)
1550 self.assertEqual(bytes_sent, len(header_plus_frame))
1551
Charles-François Natali47413c12011-10-06 19:47:44 +02001552
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001553@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1554class BasicRDSTest(unittest.TestCase):
1555
1556 def testCrucialConstants(self):
1557 socket.AF_RDS
1558 socket.PF_RDS
1559
1560 def testCreateSocket(self):
1561 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1562 pass
1563
1564 def testSocketBufferSize(self):
1565 bufsize = 16384
1566 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1567 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1568 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1569
1570
1571@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1572@unittest.skipUnless(thread, 'Threading required for this test.')
1573class RDSTest(ThreadedRDSSocketTest):
1574
1575 def __init__(self, methodName='runTest'):
1576 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1577
Charles-François Natali240c55f2011-11-10 20:33:36 +01001578 def setUp(self):
1579 super().setUp()
1580 self.evt = threading.Event()
1581
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001582 def testSendAndRecv(self):
1583 data, addr = self.serv.recvfrom(self.bufsize)
1584 self.assertEqual(self.data, data)
1585 self.assertEqual(self.cli_addr, addr)
1586
1587 def _testSendAndRecv(self):
1588 self.data = b'spam'
1589 self.cli.sendto(self.data, 0, (HOST, self.port))
1590
1591 def testPeek(self):
1592 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1593 self.assertEqual(self.data, data)
1594 data, addr = self.serv.recvfrom(self.bufsize)
1595 self.assertEqual(self.data, data)
1596
1597 def _testPeek(self):
1598 self.data = b'spam'
1599 self.cli.sendto(self.data, 0, (HOST, self.port))
1600
1601 @requireAttrs(socket.socket, 'recvmsg')
1602 def testSendAndRecvMsg(self):
1603 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1604 self.assertEqual(self.data, data)
1605
1606 @requireAttrs(socket.socket, 'sendmsg')
1607 def _testSendAndRecvMsg(self):
1608 self.data = b'hello ' * 10
1609 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1610
1611 def testSendAndRecvMulti(self):
1612 data, addr = self.serv.recvfrom(self.bufsize)
1613 self.assertEqual(self.data1, data)
1614
1615 data, addr = self.serv.recvfrom(self.bufsize)
1616 self.assertEqual(self.data2, data)
1617
1618 def _testSendAndRecvMulti(self):
1619 self.data1 = b'bacon'
1620 self.cli.sendto(self.data1, 0, (HOST, self.port))
1621
1622 self.data2 = b'egg'
1623 self.cli.sendto(self.data2, 0, (HOST, self.port))
1624
1625 def testSelect(self):
1626 r, w, x = select.select([self.serv], [], [], 3.0)
1627 self.assertIn(self.serv, r)
1628 data, addr = self.serv.recvfrom(self.bufsize)
1629 self.assertEqual(self.data, data)
1630
1631 def _testSelect(self):
1632 self.data = b'select'
1633 self.cli.sendto(self.data, 0, (HOST, self.port))
1634
1635 def testCongestion(self):
1636 # wait until the sender is done
1637 self.evt.wait()
1638
1639 def _testCongestion(self):
1640 # test the behavior in case of congestion
1641 self.data = b'fill'
1642 self.cli.setblocking(False)
1643 try:
1644 # try to lower the receiver's socket buffer size
1645 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1646 except OSError:
1647 pass
1648 with self.assertRaises(OSError) as cm:
1649 try:
1650 # fill the receiver's socket buffer
1651 while True:
1652 self.cli.sendto(self.data, 0, (HOST, self.port))
1653 finally:
1654 # signal the receiver we're done
1655 self.evt.set()
1656 # sendto() should have failed with ENOBUFS
1657 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1658 # and we should have received a congestion notification through poll
1659 r, w, x = select.select([self.serv], [], [], 3.0)
1660 self.assertIn(self.serv, r)
1661
1662
Victor Stinner45df8202010-04-28 22:31:17 +00001663@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001664class BasicTCPTest(SocketConnectedTest):
1665
1666 def __init__(self, methodName='runTest'):
1667 SocketConnectedTest.__init__(self, methodName=methodName)
1668
1669 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001670 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001671 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001672 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001673
1674 def _testRecv(self):
1675 self.serv_conn.send(MSG)
1676
1677 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001678 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001679 seg1 = self.cli_conn.recv(len(MSG) - 3)
1680 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001681 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001682 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001683
1684 def _testOverFlowRecv(self):
1685 self.serv_conn.send(MSG)
1686
1687 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001688 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001689 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001690 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001691
1692 def _testRecvFrom(self):
1693 self.serv_conn.send(MSG)
1694
1695 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001696 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001697 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1698 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001699 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001700 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001701
1702 def _testOverFlowRecvFrom(self):
1703 self.serv_conn.send(MSG)
1704
1705 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001706 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001707 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001708 while 1:
1709 read = self.cli_conn.recv(1024)
1710 if not read:
1711 break
Guido van Rossume531e292002-08-08 20:28:34 +00001712 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001713 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001714
1715 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001716 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001717 self.serv_conn.sendall(big_chunk)
1718
1719 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001720 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001721 fd = self.cli_conn.fileno()
1722 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001723 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001724 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001725 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001726 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001727
1728 def _testFromFd(self):
1729 self.serv_conn.send(MSG)
1730
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001731 def testDup(self):
1732 # Testing dup()
1733 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001734 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001735 msg = sock.recv(1024)
1736 self.assertEqual(msg, MSG)
1737
1738 def _testDup(self):
1739 self.serv_conn.send(MSG)
1740
Guido van Rossum24e4af82002-06-12 19:18:08 +00001741 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001742 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001743 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001744 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001745 # wait for _testShutdown to finish: on OS X, when the server
1746 # closes the connection the client also becomes disconnected,
1747 # and the client's shutdown call will fail. (Issue #4397.)
1748 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001749
1750 def _testShutdown(self):
1751 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001752 self.serv_conn.shutdown(2)
1753
1754 testShutdown_overflow = support.cpython_only(testShutdown)
1755
1756 @support.cpython_only
1757 def _testShutdown_overflow(self):
1758 import _testcapi
1759 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001760 # Issue 15989
1761 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1762 _testcapi.INT_MAX + 1)
1763 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1764 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001765 self.serv_conn.shutdown(2)
1766
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001767 def testDetach(self):
1768 # Testing detach()
1769 fileno = self.cli_conn.fileno()
1770 f = self.cli_conn.detach()
1771 self.assertEqual(f, fileno)
1772 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001773 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001774 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001775 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001776 # ...but we can create another socket using the (still open)
1777 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001778 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001779 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001780 msg = sock.recv(1024)
1781 self.assertEqual(msg, MSG)
1782
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001783 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001784 self.serv_conn.send(MSG)
1785
Victor Stinner45df8202010-04-28 22:31:17 +00001786@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001787class BasicUDPTest(ThreadedUDPSocketTest):
1788
1789 def __init__(self, methodName='runTest'):
1790 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1791
1792 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001793 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001794 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001795 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001796
1797 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001798 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001799
Guido van Rossum1c938012002-06-12 21:17:20 +00001800 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001801 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001802 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001803 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001804
Guido van Rossum1c938012002-06-12 21:17:20 +00001805 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001806 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001807
Guido van Rossumd8faa362007-04-27 19:54:29 +00001808 def testRecvFromNegative(self):
1809 # Negative lengths passed to recvfrom should give ValueError.
1810 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1811
1812 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001813 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001814
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001815# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1816# same test code is used with different families and types of socket
1817# (e.g. stream, datagram), and tests using recvmsg() are repeated
1818# using recvmsg_into().
1819#
1820# The generic test classes such as SendmsgTests and
1821# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1822# supplied with sockets cli_sock and serv_sock representing the
1823# client's and the server's end of the connection respectively, and
1824# attributes cli_addr and serv_addr holding their (numeric where
1825# appropriate) addresses.
1826#
1827# The final concrete test classes combine these with subclasses of
1828# SocketTestBase which set up client and server sockets of a specific
1829# type, and with subclasses of SendrecvmsgBase such as
1830# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1831# sockets to cli_sock and serv_sock and override the methods and
1832# attributes of SendrecvmsgBase to fill in destination addresses if
1833# needed when sending, check for specific flags in msg_flags, etc.
1834#
1835# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1836# recvmsg_into().
1837
1838# XXX: like the other datagram (UDP) tests in this module, the code
1839# here assumes that datagram delivery on the local machine will be
1840# reliable.
1841
1842class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1843 # Base class for sendmsg()/recvmsg() tests.
1844
1845 # Time in seconds to wait before considering a test failed, or
1846 # None for no timeout. Not all tests actually set a timeout.
1847 fail_timeout = 3.0
1848
1849 def setUp(self):
1850 self.misc_event = threading.Event()
1851 super().setUp()
1852
1853 def sendToServer(self, msg):
1854 # Send msg to the server.
1855 return self.cli_sock.send(msg)
1856
1857 # Tuple of alternative default arguments for sendmsg() when called
1858 # via sendmsgToServer() (e.g. to include a destination address).
1859 sendmsg_to_server_defaults = ()
1860
1861 def sendmsgToServer(self, *args):
1862 # Call sendmsg() on self.cli_sock with the given arguments,
1863 # filling in any arguments which are not supplied with the
1864 # corresponding items of self.sendmsg_to_server_defaults, if
1865 # any.
1866 return self.cli_sock.sendmsg(
1867 *(args + self.sendmsg_to_server_defaults[len(args):]))
1868
1869 def doRecvmsg(self, sock, bufsize, *args):
1870 # Call recvmsg() on sock with given arguments and return its
1871 # result. Should be used for tests which can use either
1872 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1873 # this method with one which emulates it using recvmsg_into(),
1874 # thus allowing the same test to be used for both methods.
1875 result = sock.recvmsg(bufsize, *args)
1876 self.registerRecvmsgResult(result)
1877 return result
1878
1879 def registerRecvmsgResult(self, result):
1880 # Called by doRecvmsg() with the return value of recvmsg() or
1881 # recvmsg_into(). Can be overridden to arrange cleanup based
1882 # on the returned ancillary data, for instance.
1883 pass
1884
1885 def checkRecvmsgAddress(self, addr1, addr2):
1886 # Called to compare the received address with the address of
1887 # the peer.
1888 self.assertEqual(addr1, addr2)
1889
1890 # Flags that are normally unset in msg_flags
1891 msg_flags_common_unset = 0
1892 for name in ("MSG_CTRUNC", "MSG_OOB"):
1893 msg_flags_common_unset |= getattr(socket, name, 0)
1894
1895 # Flags that are normally set
1896 msg_flags_common_set = 0
1897
1898 # Flags set when a complete record has been received (e.g. MSG_EOR
1899 # for SCTP)
1900 msg_flags_eor_indicator = 0
1901
1902 # Flags set when a complete record has not been received
1903 # (e.g. MSG_TRUNC for datagram sockets)
1904 msg_flags_non_eor_indicator = 0
1905
1906 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1907 # Method to check the value of msg_flags returned by recvmsg[_into]().
1908 #
1909 # Checks that all bits in msg_flags_common_set attribute are
1910 # set in "flags" and all bits in msg_flags_common_unset are
1911 # unset.
1912 #
1913 # The "eor" argument specifies whether the flags should
1914 # indicate that a full record (or datagram) has been received.
1915 # If "eor" is None, no checks are done; otherwise, checks
1916 # that:
1917 #
1918 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1919 # set and all bits in msg_flags_non_eor_indicator are unset
1920 #
1921 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1922 # are set and all bits in msg_flags_eor_indicator are unset
1923 #
1924 # If "checkset" and/or "checkunset" are supplied, they require
1925 # the given bits to be set or unset respectively, overriding
1926 # what the attributes require for those bits.
1927 #
1928 # If any bits are set in "ignore", they will not be checked,
1929 # regardless of the other inputs.
1930 #
1931 # Will raise Exception if the inputs require a bit to be both
1932 # set and unset, and it is not ignored.
1933
1934 defaultset = self.msg_flags_common_set
1935 defaultunset = self.msg_flags_common_unset
1936
1937 if eor:
1938 defaultset |= self.msg_flags_eor_indicator
1939 defaultunset |= self.msg_flags_non_eor_indicator
1940 elif eor is not None:
1941 defaultset |= self.msg_flags_non_eor_indicator
1942 defaultunset |= self.msg_flags_eor_indicator
1943
1944 # Function arguments override defaults
1945 defaultset &= ~checkunset
1946 defaultunset &= ~checkset
1947
1948 # Merge arguments with remaining defaults, and check for conflicts
1949 checkset |= defaultset
1950 checkunset |= defaultunset
1951 inboth = checkset & checkunset & ~ignore
1952 if inboth:
1953 raise Exception("contradictory set, unset requirements for flags "
1954 "{0:#x}".format(inboth))
1955
1956 # Compare with given msg_flags value
1957 mask = (checkset | checkunset) & ~ignore
1958 self.assertEqual(flags & mask, checkset & mask)
1959
1960
1961class RecvmsgIntoMixin(SendrecvmsgBase):
1962 # Mixin to implement doRecvmsg() using recvmsg_into().
1963
1964 def doRecvmsg(self, sock, bufsize, *args):
1965 buf = bytearray(bufsize)
1966 result = sock.recvmsg_into([buf], *args)
1967 self.registerRecvmsgResult(result)
1968 self.assertGreaterEqual(result[0], 0)
1969 self.assertLessEqual(result[0], bufsize)
1970 return (bytes(buf[:result[0]]),) + result[1:]
1971
1972
1973class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1974 # Defines flags to be checked in msg_flags for datagram sockets.
1975
1976 @property
1977 def msg_flags_non_eor_indicator(self):
1978 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1979
1980
1981class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1982 # Defines flags to be checked in msg_flags for SCTP sockets.
1983
1984 @property
1985 def msg_flags_eor_indicator(self):
1986 return super().msg_flags_eor_indicator | socket.MSG_EOR
1987
1988
1989class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1990 # Base class for tests on connectionless-mode sockets. Users must
1991 # supply sockets on attributes cli and serv to be mapped to
1992 # cli_sock and serv_sock respectively.
1993
1994 @property
1995 def serv_sock(self):
1996 return self.serv
1997
1998 @property
1999 def cli_sock(self):
2000 return self.cli
2001
2002 @property
2003 def sendmsg_to_server_defaults(self):
2004 return ([], [], 0, self.serv_addr)
2005
2006 def sendToServer(self, msg):
2007 return self.cli_sock.sendto(msg, self.serv_addr)
2008
2009
2010class SendrecvmsgConnectedBase(SendrecvmsgBase):
2011 # Base class for tests on connected sockets. Users must supply
2012 # sockets on attributes serv_conn and cli_conn (representing the
2013 # connections *to* the server and the client), to be mapped to
2014 # cli_sock and serv_sock respectively.
2015
2016 @property
2017 def serv_sock(self):
2018 return self.cli_conn
2019
2020 @property
2021 def cli_sock(self):
2022 return self.serv_conn
2023
2024 def checkRecvmsgAddress(self, addr1, addr2):
2025 # Address is currently "unspecified" for a connected socket,
2026 # so we don't examine it
2027 pass
2028
2029
2030class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2031 # Base class to set a timeout on server's socket.
2032
2033 def setUp(self):
2034 super().setUp()
2035 self.serv_sock.settimeout(self.fail_timeout)
2036
2037
2038class SendmsgTests(SendrecvmsgServerTimeoutBase):
2039 # Tests for sendmsg() which can use any socket type and do not
2040 # involve recvmsg() or recvmsg_into().
2041
2042 def testSendmsg(self):
2043 # Send a simple message with sendmsg().
2044 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2045
2046 def _testSendmsg(self):
2047 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2048
2049 def testSendmsgDataGenerator(self):
2050 # Send from buffer obtained from a generator (not a sequence).
2051 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2052
2053 def _testSendmsgDataGenerator(self):
2054 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2055 len(MSG))
2056
2057 def testSendmsgAncillaryGenerator(self):
2058 # Gather (empty) ancillary data from a generator.
2059 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2060
2061 def _testSendmsgAncillaryGenerator(self):
2062 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2063 len(MSG))
2064
2065 def testSendmsgArray(self):
2066 # Send data from an array instead of the usual bytes object.
2067 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2068
2069 def _testSendmsgArray(self):
2070 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2071 len(MSG))
2072
2073 def testSendmsgGather(self):
2074 # Send message data from more than one buffer (gather write).
2075 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2076
2077 def _testSendmsgGather(self):
2078 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2079
2080 def testSendmsgBadArgs(self):
2081 # Check that sendmsg() rejects invalid arguments.
2082 self.assertEqual(self.serv_sock.recv(1000), b"done")
2083
2084 def _testSendmsgBadArgs(self):
2085 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2086 self.assertRaises(TypeError, self.sendmsgToServer,
2087 b"not in an iterable")
2088 self.assertRaises(TypeError, self.sendmsgToServer,
2089 object())
2090 self.assertRaises(TypeError, self.sendmsgToServer,
2091 [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], [], object())
2098 self.assertRaises(TypeError, self.sendmsgToServer,
2099 [MSG], [], 0, object())
2100 self.sendToServer(b"done")
2101
2102 def testSendmsgBadCmsg(self):
2103 # Check that invalid ancillary data items are rejected.
2104 self.assertEqual(self.serv_sock.recv(1000), b"done")
2105
2106 def _testSendmsgBadCmsg(self):
2107 self.assertRaises(TypeError, self.sendmsgToServer,
2108 [MSG], [object()])
2109 self.assertRaises(TypeError, self.sendmsgToServer,
2110 [MSG], [(object(), 0, b"data")])
2111 self.assertRaises(TypeError, self.sendmsgToServer,
2112 [MSG], [(0, object(), b"data")])
2113 self.assertRaises(TypeError, self.sendmsgToServer,
2114 [MSG], [(0, 0, object())])
2115 self.assertRaises(TypeError, self.sendmsgToServer,
2116 [MSG], [(0, 0)])
2117 self.assertRaises(TypeError, self.sendmsgToServer,
2118 [MSG], [(0, 0, b"data", 42)])
2119 self.sendToServer(b"done")
2120
2121 @requireAttrs(socket, "CMSG_SPACE")
2122 def testSendmsgBadMultiCmsg(self):
2123 # Check that invalid ancillary data items are rejected when
2124 # more than one item is present.
2125 self.assertEqual(self.serv_sock.recv(1000), b"done")
2126
2127 @testSendmsgBadMultiCmsg.client_skip
2128 def _testSendmsgBadMultiCmsg(self):
2129 self.assertRaises(TypeError, self.sendmsgToServer,
2130 [MSG], [0, 0, b""])
2131 self.assertRaises(TypeError, self.sendmsgToServer,
2132 [MSG], [(0, 0, b""), object()])
2133 self.sendToServer(b"done")
2134
2135 def testSendmsgExcessCmsgReject(self):
2136 # Check that sendmsg() rejects excess ancillary data items
2137 # when the number that can be sent is limited.
2138 self.assertEqual(self.serv_sock.recv(1000), b"done")
2139
2140 def _testSendmsgExcessCmsgReject(self):
2141 if not hasattr(socket, "CMSG_SPACE"):
2142 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002143 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002144 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2145 self.assertIsNone(cm.exception.errno)
2146 self.sendToServer(b"done")
2147
2148 def testSendmsgAfterClose(self):
2149 # Check that sendmsg() fails on a closed socket.
2150 pass
2151
2152 def _testSendmsgAfterClose(self):
2153 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002154 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002155
2156
2157class SendmsgStreamTests(SendmsgTests):
2158 # Tests for sendmsg() which require a stream socket and do not
2159 # involve recvmsg() or recvmsg_into().
2160
2161 def testSendmsgExplicitNoneAddr(self):
2162 # Check that peer address can be specified as None.
2163 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2164
2165 def _testSendmsgExplicitNoneAddr(self):
2166 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2167
2168 def testSendmsgTimeout(self):
2169 # Check that timeout works with sendmsg().
2170 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2171 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2172
2173 def _testSendmsgTimeout(self):
2174 try:
2175 self.cli_sock.settimeout(0.03)
2176 with self.assertRaises(socket.timeout):
2177 while True:
2178 self.sendmsgToServer([b"a"*512])
2179 finally:
2180 self.misc_event.set()
2181
2182 # XXX: would be nice to have more tests for sendmsg flags argument.
2183
2184 # Linux supports MSG_DONTWAIT when sending, but in general, it
2185 # only works when receiving. Could add other platforms if they
2186 # support it too.
2187 @skipWithClientIf(sys.platform not in {"linux2"},
2188 "MSG_DONTWAIT not known to work on this platform when "
2189 "sending")
2190 def testSendmsgDontWait(self):
2191 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2192 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2193 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2194
2195 @testSendmsgDontWait.client_skip
2196 def _testSendmsgDontWait(self):
2197 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002198 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002199 while True:
2200 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2201 self.assertIn(cm.exception.errno,
2202 (errno.EAGAIN, errno.EWOULDBLOCK))
2203 finally:
2204 self.misc_event.set()
2205
2206
2207class SendmsgConnectionlessTests(SendmsgTests):
2208 # Tests for sendmsg() which require a connectionless-mode
2209 # (e.g. datagram) socket, and do not involve recvmsg() or
2210 # recvmsg_into().
2211
2212 def testSendmsgNoDestAddr(self):
2213 # Check that sendmsg() fails when no destination address is
2214 # given for unconnected socket.
2215 pass
2216
2217 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002218 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002219 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002220 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002221 [MSG], [], 0, None)
2222
2223
2224class RecvmsgGenericTests(SendrecvmsgBase):
2225 # Tests for recvmsg() which can also be emulated using
2226 # recvmsg_into(), and can use any socket type.
2227
2228 def testRecvmsg(self):
2229 # Receive a simple message with recvmsg[_into]().
2230 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2231 self.assertEqual(msg, MSG)
2232 self.checkRecvmsgAddress(addr, self.cli_addr)
2233 self.assertEqual(ancdata, [])
2234 self.checkFlags(flags, eor=True)
2235
2236 def _testRecvmsg(self):
2237 self.sendToServer(MSG)
2238
2239 def testRecvmsgExplicitDefaults(self):
2240 # Test recvmsg[_into]() with default arguments provided explicitly.
2241 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2242 len(MSG), 0, 0)
2243 self.assertEqual(msg, MSG)
2244 self.checkRecvmsgAddress(addr, self.cli_addr)
2245 self.assertEqual(ancdata, [])
2246 self.checkFlags(flags, eor=True)
2247
2248 def _testRecvmsgExplicitDefaults(self):
2249 self.sendToServer(MSG)
2250
2251 def testRecvmsgShorter(self):
2252 # Receive a message smaller than buffer.
2253 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2254 len(MSG) + 42)
2255 self.assertEqual(msg, MSG)
2256 self.checkRecvmsgAddress(addr, self.cli_addr)
2257 self.assertEqual(ancdata, [])
2258 self.checkFlags(flags, eor=True)
2259
2260 def _testRecvmsgShorter(self):
2261 self.sendToServer(MSG)
2262
Charles-François Natali8619cd72011-10-03 19:43:15 +02002263 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2264 # datagram is received (issue #13001).
2265 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002266 def testRecvmsgTrunc(self):
2267 # Receive part of message, check for truncation indicators.
2268 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2269 len(MSG) - 3)
2270 self.assertEqual(msg, MSG[:-3])
2271 self.checkRecvmsgAddress(addr, self.cli_addr)
2272 self.assertEqual(ancdata, [])
2273 self.checkFlags(flags, eor=False)
2274
Charles-François Natali8619cd72011-10-03 19:43:15 +02002275 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002276 def _testRecvmsgTrunc(self):
2277 self.sendToServer(MSG)
2278
2279 def testRecvmsgShortAncillaryBuf(self):
2280 # Test ancillary data buffer too small to hold any ancillary data.
2281 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2282 len(MSG), 1)
2283 self.assertEqual(msg, MSG)
2284 self.checkRecvmsgAddress(addr, self.cli_addr)
2285 self.assertEqual(ancdata, [])
2286 self.checkFlags(flags, eor=True)
2287
2288 def _testRecvmsgShortAncillaryBuf(self):
2289 self.sendToServer(MSG)
2290
2291 def testRecvmsgLongAncillaryBuf(self):
2292 # Test large ancillary data buffer.
2293 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2294 len(MSG), 10240)
2295 self.assertEqual(msg, MSG)
2296 self.checkRecvmsgAddress(addr, self.cli_addr)
2297 self.assertEqual(ancdata, [])
2298 self.checkFlags(flags, eor=True)
2299
2300 def _testRecvmsgLongAncillaryBuf(self):
2301 self.sendToServer(MSG)
2302
2303 def testRecvmsgAfterClose(self):
2304 # Check that recvmsg[_into]() fails on a closed socket.
2305 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002306 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002307
2308 def _testRecvmsgAfterClose(self):
2309 pass
2310
2311 def testRecvmsgTimeout(self):
2312 # Check that timeout works.
2313 try:
2314 self.serv_sock.settimeout(0.03)
2315 self.assertRaises(socket.timeout,
2316 self.doRecvmsg, self.serv_sock, len(MSG))
2317 finally:
2318 self.misc_event.set()
2319
2320 def _testRecvmsgTimeout(self):
2321 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2322
2323 @requireAttrs(socket, "MSG_PEEK")
2324 def testRecvmsgPeek(self):
2325 # Check that MSG_PEEK in flags enables examination of pending
2326 # data without consuming it.
2327
2328 # Receive part of data with MSG_PEEK.
2329 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2330 len(MSG) - 3, 0,
2331 socket.MSG_PEEK)
2332 self.assertEqual(msg, MSG[:-3])
2333 self.checkRecvmsgAddress(addr, self.cli_addr)
2334 self.assertEqual(ancdata, [])
2335 # Ignoring MSG_TRUNC here (so this test is the same for stream
2336 # and datagram sockets). Some wording in POSIX seems to
2337 # suggest that it needn't be set when peeking, but that may
2338 # just be a slip.
2339 self.checkFlags(flags, eor=False,
2340 ignore=getattr(socket, "MSG_TRUNC", 0))
2341
2342 # Receive all data with MSG_PEEK.
2343 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2344 len(MSG), 0,
2345 socket.MSG_PEEK)
2346 self.assertEqual(msg, MSG)
2347 self.checkRecvmsgAddress(addr, self.cli_addr)
2348 self.assertEqual(ancdata, [])
2349 self.checkFlags(flags, eor=True)
2350
2351 # Check that the same data can still be received normally.
2352 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2353 self.assertEqual(msg, MSG)
2354 self.checkRecvmsgAddress(addr, self.cli_addr)
2355 self.assertEqual(ancdata, [])
2356 self.checkFlags(flags, eor=True)
2357
2358 @testRecvmsgPeek.client_skip
2359 def _testRecvmsgPeek(self):
2360 self.sendToServer(MSG)
2361
2362 @requireAttrs(socket.socket, "sendmsg")
2363 def testRecvmsgFromSendmsg(self):
2364 # Test receiving with recvmsg[_into]() when message is sent
2365 # using sendmsg().
2366 self.serv_sock.settimeout(self.fail_timeout)
2367 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2368 self.assertEqual(msg, MSG)
2369 self.checkRecvmsgAddress(addr, self.cli_addr)
2370 self.assertEqual(ancdata, [])
2371 self.checkFlags(flags, eor=True)
2372
2373 @testRecvmsgFromSendmsg.client_skip
2374 def _testRecvmsgFromSendmsg(self):
2375 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2376
2377
2378class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2379 # Tests which require a stream socket and can use either recvmsg()
2380 # or recvmsg_into().
2381
2382 def testRecvmsgEOF(self):
2383 # Receive end-of-stream indicator (b"", peer socket closed).
2384 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2385 self.assertEqual(msg, b"")
2386 self.checkRecvmsgAddress(addr, self.cli_addr)
2387 self.assertEqual(ancdata, [])
2388 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2389
2390 def _testRecvmsgEOF(self):
2391 self.cli_sock.close()
2392
2393 def testRecvmsgOverflow(self):
2394 # Receive a message in more than one chunk.
2395 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2396 len(MSG) - 3)
2397 self.checkRecvmsgAddress(addr, self.cli_addr)
2398 self.assertEqual(ancdata, [])
2399 self.checkFlags(flags, eor=False)
2400
2401 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2402 self.checkRecvmsgAddress(addr, self.cli_addr)
2403 self.assertEqual(ancdata, [])
2404 self.checkFlags(flags, eor=True)
2405
2406 msg = seg1 + seg2
2407 self.assertEqual(msg, MSG)
2408
2409 def _testRecvmsgOverflow(self):
2410 self.sendToServer(MSG)
2411
2412
2413class RecvmsgTests(RecvmsgGenericTests):
2414 # Tests for recvmsg() which can use any socket type.
2415
2416 def testRecvmsgBadArgs(self):
2417 # Check that recvmsg() rejects invalid arguments.
2418 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2419 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2420 -1, 0, 0)
2421 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2422 len(MSG), -1, 0)
2423 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2424 [bytearray(10)], 0, 0)
2425 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2426 object(), 0, 0)
2427 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2428 len(MSG), object(), 0)
2429 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2430 len(MSG), 0, object())
2431
2432 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2433 self.assertEqual(msg, MSG)
2434 self.checkRecvmsgAddress(addr, self.cli_addr)
2435 self.assertEqual(ancdata, [])
2436 self.checkFlags(flags, eor=True)
2437
2438 def _testRecvmsgBadArgs(self):
2439 self.sendToServer(MSG)
2440
2441
2442class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2443 # Tests for recvmsg_into() which can use any socket type.
2444
2445 def testRecvmsgIntoBadArgs(self):
2446 # Check that recvmsg_into() rejects invalid arguments.
2447 buf = bytearray(len(MSG))
2448 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2449 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2450 len(MSG), 0, 0)
2451 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2452 buf, 0, 0)
2453 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2454 [object()], 0, 0)
2455 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2456 [b"I'm not writable"], 0, 0)
2457 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2458 [buf, object()], 0, 0)
2459 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2460 [buf], -1, 0)
2461 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2462 [buf], object(), 0)
2463 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2464 [buf], 0, object())
2465
2466 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2467 self.assertEqual(nbytes, len(MSG))
2468 self.assertEqual(buf, bytearray(MSG))
2469 self.checkRecvmsgAddress(addr, self.cli_addr)
2470 self.assertEqual(ancdata, [])
2471 self.checkFlags(flags, eor=True)
2472
2473 def _testRecvmsgIntoBadArgs(self):
2474 self.sendToServer(MSG)
2475
2476 def testRecvmsgIntoGenerator(self):
2477 # Receive into buffer obtained from a generator (not a sequence).
2478 buf = bytearray(len(MSG))
2479 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2480 (o for o in [buf]))
2481 self.assertEqual(nbytes, len(MSG))
2482 self.assertEqual(buf, bytearray(MSG))
2483 self.checkRecvmsgAddress(addr, self.cli_addr)
2484 self.assertEqual(ancdata, [])
2485 self.checkFlags(flags, eor=True)
2486
2487 def _testRecvmsgIntoGenerator(self):
2488 self.sendToServer(MSG)
2489
2490 def testRecvmsgIntoArray(self):
2491 # Receive into an array rather than the usual bytearray.
2492 buf = array.array("B", [0] * len(MSG))
2493 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2494 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002495 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002496 self.checkRecvmsgAddress(addr, self.cli_addr)
2497 self.assertEqual(ancdata, [])
2498 self.checkFlags(flags, eor=True)
2499
2500 def _testRecvmsgIntoArray(self):
2501 self.sendToServer(MSG)
2502
2503 def testRecvmsgIntoScatter(self):
2504 # Receive into multiple buffers (scatter write).
2505 b1 = bytearray(b"----")
2506 b2 = bytearray(b"0123456789")
2507 b3 = bytearray(b"--------------")
2508 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2509 [b1, memoryview(b2)[2:9], b3])
2510 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2511 self.assertEqual(b1, bytearray(b"Mary"))
2512 self.assertEqual(b2, bytearray(b"01 had a 9"))
2513 self.assertEqual(b3, bytearray(b"little lamb---"))
2514 self.checkRecvmsgAddress(addr, self.cli_addr)
2515 self.assertEqual(ancdata, [])
2516 self.checkFlags(flags, eor=True)
2517
2518 def _testRecvmsgIntoScatter(self):
2519 self.sendToServer(b"Mary had a little lamb")
2520
2521
2522class CmsgMacroTests(unittest.TestCase):
2523 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2524 # assumptions used by sendmsg() and recvmsg[_into](), which share
2525 # code with these functions.
2526
2527 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002528 try:
2529 import _testcapi
2530 except ImportError:
2531 socklen_t_limit = 0x7fffffff
2532 else:
2533 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002534
2535 @requireAttrs(socket, "CMSG_LEN")
2536 def testCMSG_LEN(self):
2537 # Test CMSG_LEN() with various valid and invalid values,
2538 # checking the assumptions used by recvmsg() and sendmsg().
2539 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2540 values = list(range(257)) + list(range(toobig - 257, toobig))
2541
2542 # struct cmsghdr has at least three members, two of which are ints
2543 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2544 for n in values:
2545 ret = socket.CMSG_LEN(n)
2546 # This is how recvmsg() calculates the data size
2547 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2548 self.assertLessEqual(ret, self.socklen_t_limit)
2549
2550 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2551 # sendmsg() shares code with these functions, and requires
2552 # that it reject values over the limit.
2553 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2554 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2555
2556 @requireAttrs(socket, "CMSG_SPACE")
2557 def testCMSG_SPACE(self):
2558 # Test CMSG_SPACE() with various valid and invalid values,
2559 # checking the assumptions used by sendmsg().
2560 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2561 values = list(range(257)) + list(range(toobig - 257, toobig))
2562
2563 last = socket.CMSG_SPACE(0)
2564 # struct cmsghdr has at least three members, two of which are ints
2565 self.assertGreater(last, array.array("i").itemsize * 2)
2566 for n in values:
2567 ret = socket.CMSG_SPACE(n)
2568 self.assertGreaterEqual(ret, last)
2569 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2570 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2571 self.assertLessEqual(ret, self.socklen_t_limit)
2572 last = ret
2573
2574 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2575 # sendmsg() shares code with these functions, and requires
2576 # that it reject values over the limit.
2577 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2578 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2579
2580
2581class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2582 # Tests for file descriptor passing on Unix-domain sockets.
2583
2584 # Invalid file descriptor value that's unlikely to evaluate to a
2585 # real FD even if one of its bytes is replaced with a different
2586 # value (which shouldn't actually happen).
2587 badfd = -0x5555
2588
2589 def newFDs(self, n):
2590 # Return a list of n file descriptors for newly-created files
2591 # containing their list indices as ASCII numbers.
2592 fds = []
2593 for i in range(n):
2594 fd, path = tempfile.mkstemp()
2595 self.addCleanup(os.unlink, path)
2596 self.addCleanup(os.close, fd)
2597 os.write(fd, str(i).encode())
2598 fds.append(fd)
2599 return fds
2600
2601 def checkFDs(self, fds):
2602 # Check that the file descriptors in the given list contain
2603 # their correct list indices as ASCII numbers.
2604 for n, fd in enumerate(fds):
2605 os.lseek(fd, 0, os.SEEK_SET)
2606 self.assertEqual(os.read(fd, 1024), str(n).encode())
2607
2608 def registerRecvmsgResult(self, result):
2609 self.addCleanup(self.closeRecvmsgFDs, result)
2610
2611 def closeRecvmsgFDs(self, recvmsg_result):
2612 # Close all file descriptors specified in the ancillary data
2613 # of the given return value from recvmsg() or recvmsg_into().
2614 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2615 if (cmsg_level == socket.SOL_SOCKET and
2616 cmsg_type == socket.SCM_RIGHTS):
2617 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002618 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002619 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2620 for fd in fds:
2621 os.close(fd)
2622
2623 def createAndSendFDs(self, n):
2624 # Send n new file descriptors created by newFDs() to the
2625 # server, with the constant MSG as the non-ancillary data.
2626 self.assertEqual(
2627 self.sendmsgToServer([MSG],
2628 [(socket.SOL_SOCKET,
2629 socket.SCM_RIGHTS,
2630 array.array("i", self.newFDs(n)))]),
2631 len(MSG))
2632
2633 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2634 # Check that constant MSG was received with numfds file
2635 # descriptors in a maximum of maxcmsgs control messages (which
2636 # must contain only complete integers). By default, check
2637 # that MSG_CTRUNC is unset, but ignore any flags in
2638 # ignoreflags.
2639 msg, ancdata, flags, addr = result
2640 self.assertEqual(msg, MSG)
2641 self.checkRecvmsgAddress(addr, self.cli_addr)
2642 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2643 ignore=ignoreflags)
2644
2645 self.assertIsInstance(ancdata, list)
2646 self.assertLessEqual(len(ancdata), maxcmsgs)
2647 fds = array.array("i")
2648 for item in ancdata:
2649 self.assertIsInstance(item, tuple)
2650 cmsg_level, cmsg_type, cmsg_data = item
2651 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2652 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2653 self.assertIsInstance(cmsg_data, bytes)
2654 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002655 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002656
2657 self.assertEqual(len(fds), numfds)
2658 self.checkFDs(fds)
2659
2660 def testFDPassSimple(self):
2661 # Pass a single FD (array read from bytes object).
2662 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2663 len(MSG), 10240))
2664
2665 def _testFDPassSimple(self):
2666 self.assertEqual(
2667 self.sendmsgToServer(
2668 [MSG],
2669 [(socket.SOL_SOCKET,
2670 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002671 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002672 len(MSG))
2673
2674 def testMultipleFDPass(self):
2675 # Pass multiple FDs in a single array.
2676 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2677 len(MSG), 10240))
2678
2679 def _testMultipleFDPass(self):
2680 self.createAndSendFDs(4)
2681
2682 @requireAttrs(socket, "CMSG_SPACE")
2683 def testFDPassCMSG_SPACE(self):
2684 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2685 self.checkRecvmsgFDs(
2686 4, self.doRecvmsg(self.serv_sock, len(MSG),
2687 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2688
2689 @testFDPassCMSG_SPACE.client_skip
2690 def _testFDPassCMSG_SPACE(self):
2691 self.createAndSendFDs(4)
2692
2693 def testFDPassCMSG_LEN(self):
2694 # Test using CMSG_LEN() to calculate ancillary buffer size.
2695 self.checkRecvmsgFDs(1,
2696 self.doRecvmsg(self.serv_sock, len(MSG),
2697 socket.CMSG_LEN(4 * SIZEOF_INT)),
2698 # RFC 3542 says implementations may set
2699 # MSG_CTRUNC if there isn't enough space
2700 # for trailing padding.
2701 ignoreflags=socket.MSG_CTRUNC)
2702
2703 def _testFDPassCMSG_LEN(self):
2704 self.createAndSendFDs(1)
2705
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002706 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002707 @requireAttrs(socket, "CMSG_SPACE")
2708 def testFDPassSeparate(self):
2709 # Pass two FDs in two separate arrays. Arrays may be combined
2710 # into a single control message by the OS.
2711 self.checkRecvmsgFDs(2,
2712 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2713 maxcmsgs=2)
2714
2715 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002716 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002717 def _testFDPassSeparate(self):
2718 fd0, fd1 = self.newFDs(2)
2719 self.assertEqual(
2720 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2721 socket.SCM_RIGHTS,
2722 array.array("i", [fd0])),
2723 (socket.SOL_SOCKET,
2724 socket.SCM_RIGHTS,
2725 array.array("i", [fd1]))]),
2726 len(MSG))
2727
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002728 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002729 @requireAttrs(socket, "CMSG_SPACE")
2730 def testFDPassSeparateMinSpace(self):
2731 # Pass two FDs in two separate arrays, receiving them into the
2732 # minimum space for two arrays.
2733 self.checkRecvmsgFDs(2,
2734 self.doRecvmsg(self.serv_sock, len(MSG),
2735 socket.CMSG_SPACE(SIZEOF_INT) +
2736 socket.CMSG_LEN(SIZEOF_INT)),
2737 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2738
2739 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002740 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002741 def _testFDPassSeparateMinSpace(self):
2742 fd0, fd1 = self.newFDs(2)
2743 self.assertEqual(
2744 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2745 socket.SCM_RIGHTS,
2746 array.array("i", [fd0])),
2747 (socket.SOL_SOCKET,
2748 socket.SCM_RIGHTS,
2749 array.array("i", [fd1]))]),
2750 len(MSG))
2751
2752 def sendAncillaryIfPossible(self, msg, ancdata):
2753 # Try to send msg and ancdata to server, but if the system
2754 # call fails, just send msg with no ancillary data.
2755 try:
2756 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002757 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002758 # Check that it was the system call that failed
2759 self.assertIsInstance(e.errno, int)
2760 nbytes = self.sendmsgToServer([msg])
2761 self.assertEqual(nbytes, len(msg))
2762
2763 def testFDPassEmpty(self):
2764 # Try to pass an empty FD array. Can receive either no array
2765 # or an empty array.
2766 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2767 len(MSG), 10240),
2768 ignoreflags=socket.MSG_CTRUNC)
2769
2770 def _testFDPassEmpty(self):
2771 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2772 socket.SCM_RIGHTS,
2773 b"")])
2774
2775 def testFDPassPartialInt(self):
2776 # Try to pass a truncated FD array.
2777 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2778 len(MSG), 10240)
2779 self.assertEqual(msg, MSG)
2780 self.checkRecvmsgAddress(addr, self.cli_addr)
2781 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2782 self.assertLessEqual(len(ancdata), 1)
2783 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2784 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2785 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2786 self.assertLess(len(cmsg_data), SIZEOF_INT)
2787
2788 def _testFDPassPartialInt(self):
2789 self.sendAncillaryIfPossible(
2790 MSG,
2791 [(socket.SOL_SOCKET,
2792 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002793 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002794
2795 @requireAttrs(socket, "CMSG_SPACE")
2796 def testFDPassPartialIntInMiddle(self):
2797 # Try to pass two FD arrays, the first of which is truncated.
2798 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2799 len(MSG), 10240)
2800 self.assertEqual(msg, MSG)
2801 self.checkRecvmsgAddress(addr, self.cli_addr)
2802 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2803 self.assertLessEqual(len(ancdata), 2)
2804 fds = array.array("i")
2805 # Arrays may have been combined in a single control message
2806 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2807 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2808 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002809 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002810 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2811 self.assertLessEqual(len(fds), 2)
2812 self.checkFDs(fds)
2813
2814 @testFDPassPartialIntInMiddle.client_skip
2815 def _testFDPassPartialIntInMiddle(self):
2816 fd0, fd1 = self.newFDs(2)
2817 self.sendAncillaryIfPossible(
2818 MSG,
2819 [(socket.SOL_SOCKET,
2820 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002821 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002822 (socket.SOL_SOCKET,
2823 socket.SCM_RIGHTS,
2824 array.array("i", [fd1]))])
2825
2826 def checkTruncatedHeader(self, result, ignoreflags=0):
2827 # Check that no ancillary data items are returned when data is
2828 # truncated inside the cmsghdr structure.
2829 msg, ancdata, flags, addr = result
2830 self.assertEqual(msg, MSG)
2831 self.checkRecvmsgAddress(addr, self.cli_addr)
2832 self.assertEqual(ancdata, [])
2833 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2834 ignore=ignoreflags)
2835
2836 def testCmsgTruncNoBufSize(self):
2837 # Check that no ancillary data is received when no buffer size
2838 # is specified.
2839 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2840 # BSD seems to set MSG_CTRUNC only
2841 # if an item has been partially
2842 # received.
2843 ignoreflags=socket.MSG_CTRUNC)
2844
2845 def _testCmsgTruncNoBufSize(self):
2846 self.createAndSendFDs(1)
2847
2848 def testCmsgTrunc0(self):
2849 # Check that no ancillary data is received when buffer size is 0.
2850 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2851 ignoreflags=socket.MSG_CTRUNC)
2852
2853 def _testCmsgTrunc0(self):
2854 self.createAndSendFDs(1)
2855
2856 # Check that no ancillary data is returned for various non-zero
2857 # (but still too small) buffer sizes.
2858
2859 def testCmsgTrunc1(self):
2860 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2861
2862 def _testCmsgTrunc1(self):
2863 self.createAndSendFDs(1)
2864
2865 def testCmsgTrunc2Int(self):
2866 # The cmsghdr structure has at least three members, two of
2867 # which are ints, so we still shouldn't see any ancillary
2868 # data.
2869 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2870 SIZEOF_INT * 2))
2871
2872 def _testCmsgTrunc2Int(self):
2873 self.createAndSendFDs(1)
2874
2875 def testCmsgTruncLen0Minus1(self):
2876 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2877 socket.CMSG_LEN(0) - 1))
2878
2879 def _testCmsgTruncLen0Minus1(self):
2880 self.createAndSendFDs(1)
2881
2882 # The following tests try to truncate the control message in the
2883 # middle of the FD array.
2884
2885 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2886 # Check that file descriptor data is truncated to between
2887 # mindata and maxdata bytes when received with buffer size
2888 # ancbuf, and that any complete file descriptor numbers are
2889 # valid.
2890 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2891 len(MSG), ancbuf)
2892 self.assertEqual(msg, MSG)
2893 self.checkRecvmsgAddress(addr, self.cli_addr)
2894 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2895
2896 if mindata == 0 and ancdata == []:
2897 return
2898 self.assertEqual(len(ancdata), 1)
2899 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2900 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2901 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2902 self.assertGreaterEqual(len(cmsg_data), mindata)
2903 self.assertLessEqual(len(cmsg_data), maxdata)
2904 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002905 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002906 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2907 self.checkFDs(fds)
2908
2909 def testCmsgTruncLen0(self):
2910 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2911
2912 def _testCmsgTruncLen0(self):
2913 self.createAndSendFDs(1)
2914
2915 def testCmsgTruncLen0Plus1(self):
2916 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2917
2918 def _testCmsgTruncLen0Plus1(self):
2919 self.createAndSendFDs(2)
2920
2921 def testCmsgTruncLen1(self):
2922 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2923 maxdata=SIZEOF_INT)
2924
2925 def _testCmsgTruncLen1(self):
2926 self.createAndSendFDs(2)
2927
2928 def testCmsgTruncLen2Minus1(self):
2929 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2930 maxdata=(2 * SIZEOF_INT) - 1)
2931
2932 def _testCmsgTruncLen2Minus1(self):
2933 self.createAndSendFDs(2)
2934
2935
2936class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2937 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2938 # features of the RFC 3542 Advanced Sockets API for IPv6.
2939 # Currently we can only handle certain data items (e.g. traffic
2940 # class, hop limit, MTU discovery and fragmentation settings)
2941 # without resorting to unportable means such as the struct module,
2942 # but the tests here are aimed at testing the ancillary data
2943 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2944 # itself.
2945
2946 # Test value to use when setting hop limit of packet
2947 hop_limit = 2
2948
2949 # Test value to use when setting traffic class of packet.
2950 # -1 means "use kernel default".
2951 traffic_class = -1
2952
2953 def ancillaryMapping(self, ancdata):
2954 # Given ancillary data list ancdata, return a mapping from
2955 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2956 # Check that no (level, type) pair appears more than once.
2957 d = {}
2958 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2959 self.assertNotIn((cmsg_level, cmsg_type), d)
2960 d[(cmsg_level, cmsg_type)] = cmsg_data
2961 return d
2962
2963 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2964 # Receive hop limit into ancbufsize bytes of ancillary data
2965 # space. Check that data is MSG, ancillary data is not
2966 # truncated (but ignore any flags in ignoreflags), and hop
2967 # limit is between 0 and maxhop inclusive.
2968 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2969 socket.IPV6_RECVHOPLIMIT, 1)
2970 self.misc_event.set()
2971 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2972 len(MSG), ancbufsize)
2973
2974 self.assertEqual(msg, MSG)
2975 self.checkRecvmsgAddress(addr, self.cli_addr)
2976 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2977 ignore=ignoreflags)
2978
2979 self.assertEqual(len(ancdata), 1)
2980 self.assertIsInstance(ancdata[0], tuple)
2981 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2982 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2983 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2984 self.assertIsInstance(cmsg_data, bytes)
2985 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2986 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002987 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002988 self.assertGreaterEqual(a[0], 0)
2989 self.assertLessEqual(a[0], maxhop)
2990
2991 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2992 def testRecvHopLimit(self):
2993 # Test receiving the packet hop limit as ancillary data.
2994 self.checkHopLimit(ancbufsize=10240)
2995
2996 @testRecvHopLimit.client_skip
2997 def _testRecvHopLimit(self):
2998 # Need to wait until server has asked to receive ancillary
2999 # data, as implementations are not required to buffer it
3000 # otherwise.
3001 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3002 self.sendToServer(MSG)
3003
3004 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3005 def testRecvHopLimitCMSG_SPACE(self):
3006 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3007 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3008
3009 @testRecvHopLimitCMSG_SPACE.client_skip
3010 def _testRecvHopLimitCMSG_SPACE(self):
3011 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3012 self.sendToServer(MSG)
3013
3014 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3015 # 3542 says portable applications must provide space for trailing
3016 # padding. Implementations may set MSG_CTRUNC if there isn't
3017 # enough space for the padding.
3018
3019 @requireAttrs(socket.socket, "sendmsg")
3020 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3021 def testSetHopLimit(self):
3022 # Test setting hop limit on outgoing packet and receiving it
3023 # at the other end.
3024 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3025
3026 @testSetHopLimit.client_skip
3027 def _testSetHopLimit(self):
3028 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3029 self.assertEqual(
3030 self.sendmsgToServer([MSG],
3031 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3032 array.array("i", [self.hop_limit]))]),
3033 len(MSG))
3034
3035 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3036 ignoreflags=0):
3037 # Receive traffic class and hop limit into ancbufsize bytes of
3038 # ancillary data space. Check that data is MSG, ancillary
3039 # data is not truncated (but ignore any flags in ignoreflags),
3040 # and traffic class and hop limit are in range (hop limit no
3041 # more than maxhop).
3042 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3043 socket.IPV6_RECVHOPLIMIT, 1)
3044 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3045 socket.IPV6_RECVTCLASS, 1)
3046 self.misc_event.set()
3047 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3048 len(MSG), ancbufsize)
3049
3050 self.assertEqual(msg, MSG)
3051 self.checkRecvmsgAddress(addr, self.cli_addr)
3052 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3053 ignore=ignoreflags)
3054 self.assertEqual(len(ancdata), 2)
3055 ancmap = self.ancillaryMapping(ancdata)
3056
3057 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3058 self.assertEqual(len(tcdata), SIZEOF_INT)
3059 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003060 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003061 self.assertGreaterEqual(a[0], 0)
3062 self.assertLessEqual(a[0], 255)
3063
3064 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3065 self.assertEqual(len(hldata), SIZEOF_INT)
3066 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003067 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003068 self.assertGreaterEqual(a[0], 0)
3069 self.assertLessEqual(a[0], maxhop)
3070
3071 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3072 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3073 def testRecvTrafficClassAndHopLimit(self):
3074 # Test receiving traffic class and hop limit as ancillary data.
3075 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3076
3077 @testRecvTrafficClassAndHopLimit.client_skip
3078 def _testRecvTrafficClassAndHopLimit(self):
3079 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3080 self.sendToServer(MSG)
3081
3082 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3083 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3084 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3085 # Test receiving traffic class and hop limit, using
3086 # CMSG_SPACE() to calculate buffer size.
3087 self.checkTrafficClassAndHopLimit(
3088 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3089
3090 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3091 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3092 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3093 self.sendToServer(MSG)
3094
3095 @requireAttrs(socket.socket, "sendmsg")
3096 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3097 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3098 def testSetTrafficClassAndHopLimit(self):
3099 # Test setting traffic class and hop limit on outgoing packet,
3100 # and receiving them at the other end.
3101 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3102 maxhop=self.hop_limit)
3103
3104 @testSetTrafficClassAndHopLimit.client_skip
3105 def _testSetTrafficClassAndHopLimit(self):
3106 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3107 self.assertEqual(
3108 self.sendmsgToServer([MSG],
3109 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3110 array.array("i", [self.traffic_class])),
3111 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3112 array.array("i", [self.hop_limit]))]),
3113 len(MSG))
3114
3115 @requireAttrs(socket.socket, "sendmsg")
3116 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3117 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3118 def testOddCmsgSize(self):
3119 # Try to send ancillary data with first item one byte too
3120 # long. Fall back to sending with correct size if this fails,
3121 # and check that second item was handled correctly.
3122 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3123 maxhop=self.hop_limit)
3124
3125 @testOddCmsgSize.client_skip
3126 def _testOddCmsgSize(self):
3127 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3128 try:
3129 nbytes = self.sendmsgToServer(
3130 [MSG],
3131 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003132 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003133 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3134 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003135 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003136 self.assertIsInstance(e.errno, int)
3137 nbytes = self.sendmsgToServer(
3138 [MSG],
3139 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3140 array.array("i", [self.traffic_class])),
3141 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3142 array.array("i", [self.hop_limit]))])
3143 self.assertEqual(nbytes, len(MSG))
3144
3145 # Tests for proper handling of truncated ancillary data
3146
3147 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3148 # Receive hop limit into ancbufsize bytes of ancillary data
3149 # space, which should be too small to contain the ancillary
3150 # data header (if ancbufsize is None, pass no second argument
3151 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3152 # (unless included in ignoreflags), and no ancillary data is
3153 # returned.
3154 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3155 socket.IPV6_RECVHOPLIMIT, 1)
3156 self.misc_event.set()
3157 args = () if ancbufsize is None else (ancbufsize,)
3158 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3159 len(MSG), *args)
3160
3161 self.assertEqual(msg, MSG)
3162 self.checkRecvmsgAddress(addr, self.cli_addr)
3163 self.assertEqual(ancdata, [])
3164 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3165 ignore=ignoreflags)
3166
3167 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3168 def testCmsgTruncNoBufSize(self):
3169 # Check that no ancillary data is received when no ancillary
3170 # buffer size is provided.
3171 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3172 # BSD seems to set
3173 # MSG_CTRUNC only if an item
3174 # has been partially
3175 # received.
3176 ignoreflags=socket.MSG_CTRUNC)
3177
3178 @testCmsgTruncNoBufSize.client_skip
3179 def _testCmsgTruncNoBufSize(self):
3180 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3181 self.sendToServer(MSG)
3182
3183 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3184 def testSingleCmsgTrunc0(self):
3185 # Check that no ancillary data is received when ancillary
3186 # buffer size is zero.
3187 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3188 ignoreflags=socket.MSG_CTRUNC)
3189
3190 @testSingleCmsgTrunc0.client_skip
3191 def _testSingleCmsgTrunc0(self):
3192 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3193 self.sendToServer(MSG)
3194
3195 # Check that no ancillary data is returned for various non-zero
3196 # (but still too small) buffer sizes.
3197
3198 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3199 def testSingleCmsgTrunc1(self):
3200 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3201
3202 @testSingleCmsgTrunc1.client_skip
3203 def _testSingleCmsgTrunc1(self):
3204 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3205 self.sendToServer(MSG)
3206
3207 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3208 def testSingleCmsgTrunc2Int(self):
3209 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3210
3211 @testSingleCmsgTrunc2Int.client_skip
3212 def _testSingleCmsgTrunc2Int(self):
3213 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3214 self.sendToServer(MSG)
3215
3216 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3217 def testSingleCmsgTruncLen0Minus1(self):
3218 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3219
3220 @testSingleCmsgTruncLen0Minus1.client_skip
3221 def _testSingleCmsgTruncLen0Minus1(self):
3222 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3223 self.sendToServer(MSG)
3224
3225 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3226 def testSingleCmsgTruncInData(self):
3227 # Test truncation of a control message inside its associated
3228 # data. The message may be returned with its data truncated,
3229 # or not returned at all.
3230 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3231 socket.IPV6_RECVHOPLIMIT, 1)
3232 self.misc_event.set()
3233 msg, ancdata, flags, addr = self.doRecvmsg(
3234 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3235
3236 self.assertEqual(msg, MSG)
3237 self.checkRecvmsgAddress(addr, self.cli_addr)
3238 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3239
3240 self.assertLessEqual(len(ancdata), 1)
3241 if ancdata:
3242 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3243 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3244 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3245 self.assertLess(len(cmsg_data), SIZEOF_INT)
3246
3247 @testSingleCmsgTruncInData.client_skip
3248 def _testSingleCmsgTruncInData(self):
3249 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3250 self.sendToServer(MSG)
3251
3252 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3253 # Receive traffic class and hop limit into ancbufsize bytes of
3254 # ancillary data space, which should be large enough to
3255 # contain the first item, but too small to contain the header
3256 # of the second. Check that data is MSG, MSG_CTRUNC is set
3257 # (unless included in ignoreflags), and only one ancillary
3258 # data item is returned.
3259 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3260 socket.IPV6_RECVHOPLIMIT, 1)
3261 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3262 socket.IPV6_RECVTCLASS, 1)
3263 self.misc_event.set()
3264 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3265 len(MSG), ancbufsize)
3266
3267 self.assertEqual(msg, MSG)
3268 self.checkRecvmsgAddress(addr, self.cli_addr)
3269 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3270 ignore=ignoreflags)
3271
3272 self.assertEqual(len(ancdata), 1)
3273 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3274 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3275 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3276 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3277 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003278 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003279 self.assertGreaterEqual(a[0], 0)
3280 self.assertLessEqual(a[0], 255)
3281
3282 # Try the above test with various buffer sizes.
3283
3284 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3285 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3286 def testSecondCmsgTrunc0(self):
3287 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3288 ignoreflags=socket.MSG_CTRUNC)
3289
3290 @testSecondCmsgTrunc0.client_skip
3291 def _testSecondCmsgTrunc0(self):
3292 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3293 self.sendToServer(MSG)
3294
3295 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3296 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3297 def testSecondCmsgTrunc1(self):
3298 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3299
3300 @testSecondCmsgTrunc1.client_skip
3301 def _testSecondCmsgTrunc1(self):
3302 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3303 self.sendToServer(MSG)
3304
3305 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3306 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3307 def testSecondCmsgTrunc2Int(self):
3308 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3309 2 * SIZEOF_INT)
3310
3311 @testSecondCmsgTrunc2Int.client_skip
3312 def _testSecondCmsgTrunc2Int(self):
3313 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3314 self.sendToServer(MSG)
3315
3316 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3317 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3318 def testSecondCmsgTruncLen0Minus1(self):
3319 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3320 socket.CMSG_LEN(0) - 1)
3321
3322 @testSecondCmsgTruncLen0Minus1.client_skip
3323 def _testSecondCmsgTruncLen0Minus1(self):
3324 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3325 self.sendToServer(MSG)
3326
3327 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3328 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3329 def testSecomdCmsgTruncInData(self):
3330 # Test truncation of the second of two control messages inside
3331 # its associated data.
3332 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3333 socket.IPV6_RECVHOPLIMIT, 1)
3334 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3335 socket.IPV6_RECVTCLASS, 1)
3336 self.misc_event.set()
3337 msg, ancdata, flags, addr = self.doRecvmsg(
3338 self.serv_sock, len(MSG),
3339 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3340
3341 self.assertEqual(msg, MSG)
3342 self.checkRecvmsgAddress(addr, self.cli_addr)
3343 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3344
3345 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3346
3347 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3348 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3349 cmsg_types.remove(cmsg_type)
3350 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3351 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003352 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003353 self.assertGreaterEqual(a[0], 0)
3354 self.assertLessEqual(a[0], 255)
3355
3356 if ancdata:
3357 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3358 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3359 cmsg_types.remove(cmsg_type)
3360 self.assertLess(len(cmsg_data), SIZEOF_INT)
3361
3362 self.assertEqual(ancdata, [])
3363
3364 @testSecomdCmsgTruncInData.client_skip
3365 def _testSecomdCmsgTruncInData(self):
3366 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3367 self.sendToServer(MSG)
3368
3369
3370# Derive concrete test classes for different socket types.
3371
3372class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3373 SendrecvmsgConnectionlessBase,
3374 ThreadedSocketTestMixin, UDPTestBase):
3375 pass
3376
3377@requireAttrs(socket.socket, "sendmsg")
3378@unittest.skipUnless(thread, 'Threading required for this test.')
3379class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3380 pass
3381
3382@requireAttrs(socket.socket, "recvmsg")
3383@unittest.skipUnless(thread, 'Threading required for this test.')
3384class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3385 pass
3386
3387@requireAttrs(socket.socket, "recvmsg_into")
3388@unittest.skipUnless(thread, 'Threading required for this test.')
3389class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3390 pass
3391
3392
3393class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3394 SendrecvmsgConnectionlessBase,
3395 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003396
3397 def checkRecvmsgAddress(self, addr1, addr2):
3398 # Called to compare the received address with the address of
3399 # the peer, ignoring scope ID
3400 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003401
3402@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003403@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003404@requireSocket("AF_INET6", "SOCK_DGRAM")
3405@unittest.skipUnless(thread, 'Threading required for this test.')
3406class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3407 pass
3408
3409@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003410@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003411@requireSocket("AF_INET6", "SOCK_DGRAM")
3412@unittest.skipUnless(thread, 'Threading required for this test.')
3413class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3414 pass
3415
3416@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003417@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003418@requireSocket("AF_INET6", "SOCK_DGRAM")
3419@unittest.skipUnless(thread, 'Threading required for this test.')
3420class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3421 pass
3422
3423@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003424@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003425@requireAttrs(socket, "IPPROTO_IPV6")
3426@requireSocket("AF_INET6", "SOCK_DGRAM")
3427@unittest.skipUnless(thread, 'Threading required for this test.')
3428class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3429 SendrecvmsgUDP6TestBase):
3430 pass
3431
3432@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003433@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003434@requireAttrs(socket, "IPPROTO_IPV6")
3435@requireSocket("AF_INET6", "SOCK_DGRAM")
3436@unittest.skipUnless(thread, 'Threading required for this test.')
3437class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3438 RFC3542AncillaryTest,
3439 SendrecvmsgUDP6TestBase):
3440 pass
3441
3442
3443class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3444 ConnectedStreamTestMixin, TCPTestBase):
3445 pass
3446
3447@requireAttrs(socket.socket, "sendmsg")
3448@unittest.skipUnless(thread, 'Threading required for this test.')
3449class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3450 pass
3451
3452@requireAttrs(socket.socket, "recvmsg")
3453@unittest.skipUnless(thread, 'Threading required for this test.')
3454class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3455 SendrecvmsgTCPTestBase):
3456 pass
3457
3458@requireAttrs(socket.socket, "recvmsg_into")
3459@unittest.skipUnless(thread, 'Threading required for this test.')
3460class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3461 SendrecvmsgTCPTestBase):
3462 pass
3463
3464
3465class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3466 SendrecvmsgConnectedBase,
3467 ConnectedStreamTestMixin, SCTPStreamBase):
3468 pass
3469
3470@requireAttrs(socket.socket, "sendmsg")
3471@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3472@unittest.skipUnless(thread, 'Threading required for this test.')
3473class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3474 pass
3475
3476@requireAttrs(socket.socket, "recvmsg")
3477@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3478@unittest.skipUnless(thread, 'Threading required for this test.')
3479class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3480 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003481
3482 def testRecvmsgEOF(self):
3483 try:
3484 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3485 except OSError as e:
3486 if e.errno != errno.ENOTCONN:
3487 raise
3488 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003489
3490@requireAttrs(socket.socket, "recvmsg_into")
3491@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3492@unittest.skipUnless(thread, 'Threading required for this test.')
3493class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3494 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003495
3496 def testRecvmsgEOF(self):
3497 try:
3498 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3499 except OSError as e:
3500 if e.errno != errno.ENOTCONN:
3501 raise
3502 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003503
3504
3505class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3506 ConnectedStreamTestMixin, UnixStreamBase):
3507 pass
3508
3509@requireAttrs(socket.socket, "sendmsg")
3510@requireAttrs(socket, "AF_UNIX")
3511@unittest.skipUnless(thread, 'Threading required for this test.')
3512class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3513 pass
3514
3515@requireAttrs(socket.socket, "recvmsg")
3516@requireAttrs(socket, "AF_UNIX")
3517@unittest.skipUnless(thread, 'Threading required for this test.')
3518class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3519 SendrecvmsgUnixStreamTestBase):
3520 pass
3521
3522@requireAttrs(socket.socket, "recvmsg_into")
3523@requireAttrs(socket, "AF_UNIX")
3524@unittest.skipUnless(thread, 'Threading required for this test.')
3525class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3526 SendrecvmsgUnixStreamTestBase):
3527 pass
3528
3529@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3530@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3531@unittest.skipUnless(thread, 'Threading required for this test.')
3532class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3533 pass
3534
3535@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3536@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3537@unittest.skipUnless(thread, 'Threading required for this test.')
3538class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3539 SendrecvmsgUnixStreamTestBase):
3540 pass
3541
3542
3543# Test interrupting the interruptible send/receive methods with a
3544# signal when a timeout is set. These tests avoid having multiple
3545# threads alive during the test so that the OS cannot deliver the
3546# signal to the wrong one.
3547
3548class InterruptedTimeoutBase(unittest.TestCase):
3549 # Base class for interrupted send/receive tests. Installs an
3550 # empty handler for SIGALRM and removes it on teardown, along with
3551 # any scheduled alarms.
3552
3553 def setUp(self):
3554 super().setUp()
3555 orig_alrm_handler = signal.signal(signal.SIGALRM,
3556 lambda signum, frame: None)
3557 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3558 self.addCleanup(self.setAlarm, 0)
3559
3560 # Timeout for socket operations
3561 timeout = 4.0
3562
3563 # Provide setAlarm() method to schedule delivery of SIGALRM after
3564 # given number of seconds, or cancel it if zero, and an
3565 # appropriate time value to use. Use setitimer() if available.
3566 if hasattr(signal, "setitimer"):
3567 alarm_time = 0.05
3568
3569 def setAlarm(self, seconds):
3570 signal.setitimer(signal.ITIMER_REAL, seconds)
3571 else:
3572 # Old systems may deliver the alarm up to one second early
3573 alarm_time = 2
3574
3575 def setAlarm(self, seconds):
3576 signal.alarm(seconds)
3577
3578
3579# Require siginterrupt() in order to ensure that system calls are
3580# interrupted by default.
3581@requireAttrs(signal, "siginterrupt")
3582@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3583 "Don't have signal.alarm or signal.setitimer")
3584class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3585 # Test interrupting the recv*() methods with signals when a
3586 # timeout is set.
3587
3588 def setUp(self):
3589 super().setUp()
3590 self.serv.settimeout(self.timeout)
3591
3592 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003593 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003594 # errno of EINTR when interrupted by a signal.
3595 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003596 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003597 func(*args, **kwargs)
3598 self.assertNotIsInstance(cm.exception, socket.timeout)
3599 self.assertEqual(cm.exception.errno, errno.EINTR)
3600
3601 def testInterruptedRecvTimeout(self):
3602 self.checkInterruptedRecv(self.serv.recv, 1024)
3603
3604 def testInterruptedRecvIntoTimeout(self):
3605 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3606
3607 def testInterruptedRecvfromTimeout(self):
3608 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3609
3610 def testInterruptedRecvfromIntoTimeout(self):
3611 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3612
3613 @requireAttrs(socket.socket, "recvmsg")
3614 def testInterruptedRecvmsgTimeout(self):
3615 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3616
3617 @requireAttrs(socket.socket, "recvmsg_into")
3618 def testInterruptedRecvmsgIntoTimeout(self):
3619 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3620
3621
3622# Require siginterrupt() in order to ensure that system calls are
3623# interrupted by default.
3624@requireAttrs(signal, "siginterrupt")
3625@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3626 "Don't have signal.alarm or signal.setitimer")
3627@unittest.skipUnless(thread, 'Threading required for this test.')
3628class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3629 ThreadSafeCleanupTestCase,
3630 SocketListeningTestMixin, TCPTestBase):
3631 # Test interrupting the interruptible send*() methods with signals
3632 # when a timeout is set.
3633
3634 def setUp(self):
3635 super().setUp()
3636 self.serv_conn = self.newSocket()
3637 self.addCleanup(self.serv_conn.close)
3638 # Use a thread to complete the connection, but wait for it to
3639 # terminate before running the test, so that there is only one
3640 # thread to accept the signal.
3641 cli_thread = threading.Thread(target=self.doConnect)
3642 cli_thread.start()
3643 self.cli_conn, addr = self.serv.accept()
3644 self.addCleanup(self.cli_conn.close)
3645 cli_thread.join()
3646 self.serv_conn.settimeout(self.timeout)
3647
3648 def doConnect(self):
3649 self.serv_conn.connect(self.serv_addr)
3650
3651 def checkInterruptedSend(self, func, *args, **kwargs):
3652 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003653 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003654 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003655 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003656 while True:
3657 self.setAlarm(self.alarm_time)
3658 func(*args, **kwargs)
3659 self.assertNotIsInstance(cm.exception, socket.timeout)
3660 self.assertEqual(cm.exception.errno, errno.EINTR)
3661
Ned Deilyc5640382014-02-03 13:58:31 -08003662 # Issue #12958: The following tests have problems on OS X prior to 10.7
3663 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003664 def testInterruptedSendTimeout(self):
3665 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3666
Ned Deilyc5640382014-02-03 13:58:31 -08003667 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003668 def testInterruptedSendtoTimeout(self):
3669 # Passing an actual address here as Python's wrapper for
3670 # sendto() doesn't allow passing a zero-length one; POSIX
3671 # requires that the address is ignored since the socket is
3672 # connection-mode, however.
3673 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3674 self.serv_addr)
3675
Ned Deilyc5640382014-02-03 13:58:31 -08003676 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003677 @requireAttrs(socket.socket, "sendmsg")
3678 def testInterruptedSendmsgTimeout(self):
3679 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3680
3681
Victor Stinner45df8202010-04-28 22:31:17 +00003682@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003683class TCPCloserTest(ThreadedTCPSocketTest):
3684
3685 def testClose(self):
3686 conn, addr = self.serv.accept()
3687 conn.close()
3688
3689 sd = self.cli
3690 read, write, err = select.select([sd], [], [], 1.0)
3691 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003692 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003693
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003694 # Calling close() many times should be safe.
3695 conn.close()
3696 conn.close()
3697
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003698 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003699 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003700 time.sleep(1.0)
3701
Serhiy Storchaka43767632013-11-03 21:31:38 +02003702@unittest.skipUnless(hasattr(socket, 'socketpair'),
3703 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003704@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003705class BasicSocketPairTest(SocketPairTest):
3706
3707 def __init__(self, methodName='runTest'):
3708 SocketPairTest.__init__(self, methodName=methodName)
3709
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003710 def _check_defaults(self, sock):
3711 self.assertIsInstance(sock, socket.socket)
3712 if hasattr(socket, 'AF_UNIX'):
3713 self.assertEqual(sock.family, socket.AF_UNIX)
3714 else:
3715 self.assertEqual(sock.family, socket.AF_INET)
3716 self.assertEqual(sock.type, socket.SOCK_STREAM)
3717 self.assertEqual(sock.proto, 0)
3718
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003719 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003720 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003721
3722 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003723 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003724
Dave Cole331708b2004-08-09 04:51:41 +00003725 def testRecv(self):
3726 msg = self.serv.recv(1024)
3727 self.assertEqual(msg, MSG)
3728
3729 def _testRecv(self):
3730 self.cli.send(MSG)
3731
3732 def testSend(self):
3733 self.serv.send(MSG)
3734
3735 def _testSend(self):
3736 msg = self.cli.recv(1024)
3737 self.assertEqual(msg, MSG)
3738
Victor Stinner45df8202010-04-28 22:31:17 +00003739@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003740class NonBlockingTCPTests(ThreadedTCPSocketTest):
3741
3742 def __init__(self, methodName='runTest'):
3743 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3744
3745 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003746 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003747 self.serv.setblocking(True)
3748 self.assertIsNone(self.serv.gettimeout())
3749 self.serv.setblocking(False)
3750 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003751 start = time.time()
3752 try:
3753 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003754 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003755 pass
3756 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003757 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003758
3759 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003760 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003761
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003762 @support.cpython_only
3763 def testSetBlocking_overflow(self):
3764 # Issue 15989
3765 import _testcapi
3766 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3767 self.skipTest('needs UINT_MAX < ULONG_MAX')
3768 self.serv.setblocking(False)
3769 self.assertEqual(self.serv.gettimeout(), 0.0)
3770 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3771 self.assertIsNone(self.serv.gettimeout())
3772
3773 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3774
Serhiy Storchaka43767632013-11-03 21:31:38 +02003775 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3776 'test needs socket.SOCK_NONBLOCK')
3777 @support.requires_linux_version(2, 6, 28)
3778 def testInitNonBlocking(self):
3779 # reinit server socket
3780 self.serv.close()
3781 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3782 socket.SOCK_NONBLOCK)
3783 self.port = support.bind_port(self.serv)
3784 self.serv.listen(1)
3785 # actual testing
3786 start = time.time()
3787 try:
3788 self.serv.accept()
3789 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003790 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003791 end = time.time()
3792 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3793
3794 def _testInitNonBlocking(self):
3795 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003796
Antoine Pitrou600232b2011-01-05 21:03:42 +00003797 def testInheritFlags(self):
3798 # Issue #7995: when calling accept() on a listening socket with a
3799 # timeout, the resulting socket should not be non-blocking.
3800 self.serv.settimeout(10)
3801 try:
3802 conn, addr = self.serv.accept()
3803 message = conn.recv(len(MSG))
3804 finally:
3805 conn.close()
3806 self.serv.settimeout(None)
3807
3808 def _testInheritFlags(self):
3809 time.sleep(0.1)
3810 self.cli.connect((HOST, self.port))
3811 time.sleep(0.5)
3812 self.cli.send(MSG)
3813
Guido van Rossum24e4af82002-06-12 19:18:08 +00003814 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003815 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003816 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003817 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003818 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003819 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003820 pass
3821 else:
3822 self.fail("Error trying to do non-blocking accept.")
3823 read, write, err = select.select([self.serv], [], [])
3824 if self.serv in read:
3825 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003826 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003827 else:
3828 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003829
Guido van Rossum24e4af82002-06-12 19:18:08 +00003830 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003831 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003832 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003833
3834 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003835 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003836 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003837 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003838
3839 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003840 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003841 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003842
3843 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003844 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003845 conn, addr = self.serv.accept()
3846 conn.setblocking(0)
3847 try:
3848 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003849 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003850 pass
3851 else:
3852 self.fail("Error trying to do non-blocking recv.")
3853 read, write, err = select.select([conn], [], [])
3854 if conn in read:
3855 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003856 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003857 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003858 else:
3859 self.fail("Error during select call to non-blocking socket.")
3860
3861 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003862 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003863 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003864 self.cli.send(MSG)
3865
Victor Stinner45df8202010-04-28 22:31:17 +00003866@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003867class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003868 """Unit tests for the object returned by socket.makefile()
3869
Antoine Pitrou834bd812010-10-13 16:17:14 +00003870 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003871 the client connection. You can read from this file to
3872 get output from the server.
3873
Antoine Pitrou834bd812010-10-13 16:17:14 +00003874 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003875 server connection. You can write to this file to send output
3876 to the client.
3877 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003878
Guido van Rossume9f66142002-08-07 15:46:19 +00003879 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003880 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003881 errors = 'strict'
3882 newline = None
3883
3884 read_mode = 'rb'
3885 read_msg = MSG
3886 write_mode = 'wb'
3887 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003888
Guido van Rossum24e4af82002-06-12 19:18:08 +00003889 def __init__(self, methodName='runTest'):
3890 SocketConnectedTest.__init__(self, methodName=methodName)
3891
3892 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003893 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3894 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003895 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003896 self.read_file = self.cli_conn.makefile(
3897 self.read_mode, self.bufsize,
3898 encoding = self.encoding,
3899 errors = self.errors,
3900 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003901
3902 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003903 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003904 self.read_file.close()
3905 self.assertTrue(self.read_file.closed)
3906 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003907 SocketConnectedTest.tearDown(self)
3908
3909 def clientSetUp(self):
3910 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003911 self.write_file = self.serv_conn.makefile(
3912 self.write_mode, self.bufsize,
3913 encoding = self.encoding,
3914 errors = self.errors,
3915 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003916
3917 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003918 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003919 self.write_file.close()
3920 self.assertTrue(self.write_file.closed)
3921 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003922 SocketConnectedTest.clientTearDown(self)
3923
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003924 def testReadAfterTimeout(self):
3925 # Issue #7322: A file object must disallow further reads
3926 # after a timeout has occurred.
3927 self.cli_conn.settimeout(1)
3928 self.read_file.read(3)
3929 # First read raises a timeout
3930 self.assertRaises(socket.timeout, self.read_file.read, 1)
3931 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003932 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003933 self.read_file.read(1)
3934 self.assertIn("cannot read from timed out object", str(ctx.exception))
3935
3936 def _testReadAfterTimeout(self):
3937 self.write_file.write(self.write_msg[0:3])
3938 self.write_file.flush()
3939 self.serv_finished.wait()
3940
Guido van Rossum24e4af82002-06-12 19:18:08 +00003941 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003942 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003943 first_seg = self.read_file.read(len(self.read_msg)-3)
3944 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003945 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003946 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003947
3948 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003949 self.write_file.write(self.write_msg)
3950 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003951
Guido van Rossum8c943832002-08-08 01:00:28 +00003952 def testFullRead(self):
3953 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003954 msg = self.read_file.read()
3955 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003956
3957 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003958 self.write_file.write(self.write_msg)
3959 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003960
Guido van Rossum24e4af82002-06-12 19:18:08 +00003961 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003962 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003963 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003964 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003965 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003966 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003967 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003968 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003969 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003970
3971 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003972 self.write_file.write(self.write_msg)
3973 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003974
3975 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003976 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003977 line = self.read_file.readline()
3978 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003979
3980 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003981 self.write_file.write(self.write_msg)
3982 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003983
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003984 def testCloseAfterMakefile(self):
3985 # The file returned by makefile should keep the socket open.
3986 self.cli_conn.close()
3987 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003988 msg = self.read_file.read()
3989 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003990
3991 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003992 self.write_file.write(self.write_msg)
3993 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003994
3995 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003996 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003997 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003998 if isinstance(self.read_msg, str):
3999 msg = msg.decode()
4000 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004001
4002 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004003 self.write_file.write(self.write_msg)
4004 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004005
Tim Peters116d83c2004-03-28 02:20:45 +00004006 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004007 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004008
4009 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004010 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004011
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004012 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004013 self.assertEqual(self.read_file.mode, self.read_mode)
4014 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004015
4016 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004017 self.assertEqual(self.write_file.mode, self.write_mode)
4018 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004019
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004020 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004021 self.read_file.close()
4022 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004023 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004024 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004025
4026 def _testRealClose(self):
4027 pass
4028
4029
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004030class FileObjectInterruptedTestCase(unittest.TestCase):
4031 """Test that the file object correctly handles EINTR internally."""
4032
4033 class MockSocket(object):
4034 def __init__(self, recv_funcs=()):
4035 # A generator that returns callables that we'll call for each
4036 # call to recv().
4037 self._recv_step = iter(recv_funcs)
4038
4039 def recv_into(self, buffer):
4040 data = next(self._recv_step)()
4041 assert len(buffer) >= len(data)
4042 buffer[:len(data)] = data
4043 return len(data)
4044
4045 def _decref_socketios(self):
4046 pass
4047
4048 def _textiowrap_for_test(self, buffering=-1):
4049 raw = socket.SocketIO(self, "r")
4050 if buffering < 0:
4051 buffering = io.DEFAULT_BUFFER_SIZE
4052 if buffering == 0:
4053 return raw
4054 buffer = io.BufferedReader(raw, buffering)
4055 text = io.TextIOWrapper(buffer, None, None)
4056 text.mode = "rb"
4057 return text
4058
4059 @staticmethod
4060 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004061 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004062
4063 def _textiowrap_mock_socket(self, mock, buffering=-1):
4064 raw = socket.SocketIO(mock, "r")
4065 if buffering < 0:
4066 buffering = io.DEFAULT_BUFFER_SIZE
4067 if buffering == 0:
4068 return raw
4069 buffer = io.BufferedReader(raw, buffering)
4070 text = io.TextIOWrapper(buffer, None, None)
4071 text.mode = "rb"
4072 return text
4073
4074 def _test_readline(self, size=-1, buffering=-1):
4075 mock_sock = self.MockSocket(recv_funcs=[
4076 lambda : b"This is the first line\nAnd the sec",
4077 self._raise_eintr,
4078 lambda : b"ond line is here\n",
4079 lambda : b"",
4080 lambda : b"", # XXX(gps): io library does an extra EOF read
4081 ])
4082 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004083 self.assertEqual(fo.readline(size), "This is the first line\n")
4084 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004085
4086 def _test_read(self, size=-1, buffering=-1):
4087 mock_sock = self.MockSocket(recv_funcs=[
4088 lambda : b"This is the first line\nAnd the sec",
4089 self._raise_eintr,
4090 lambda : b"ond line is here\n",
4091 lambda : b"",
4092 lambda : b"", # XXX(gps): io library does an extra EOF read
4093 ])
4094 expecting = (b"This is the first line\n"
4095 b"And the second line is here\n")
4096 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4097 if buffering == 0:
4098 data = b''
4099 else:
4100 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004101 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004102 while len(data) != len(expecting):
4103 part = fo.read(size)
4104 if not part:
4105 break
4106 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004107 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004108
4109 def test_default(self):
4110 self._test_readline()
4111 self._test_readline(size=100)
4112 self._test_read()
4113 self._test_read(size=100)
4114
4115 def test_with_1k_buffer(self):
4116 self._test_readline(buffering=1024)
4117 self._test_readline(size=100, buffering=1024)
4118 self._test_read(buffering=1024)
4119 self._test_read(size=100, buffering=1024)
4120
4121 def _test_readline_no_buffer(self, size=-1):
4122 mock_sock = self.MockSocket(recv_funcs=[
4123 lambda : b"a",
4124 lambda : b"\n",
4125 lambda : b"B",
4126 self._raise_eintr,
4127 lambda : b"b",
4128 lambda : b"",
4129 ])
4130 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004131 self.assertEqual(fo.readline(size), b"a\n")
4132 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004133
4134 def test_no_buffer(self):
4135 self._test_readline_no_buffer()
4136 self._test_readline_no_buffer(size=4)
4137 self._test_read(buffering=0)
4138 self._test_read(size=100, buffering=0)
4139
4140
Guido van Rossume9f66142002-08-07 15:46:19 +00004141class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4142
4143 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004144
Guido van Rossume9f66142002-08-07 15:46:19 +00004145 In this case (and in this case only), it should be possible to
4146 create a file object, read a line from it, create another file
4147 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004148 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004149 when reading multiple requests from the same socket."""
4150
4151 bufsize = 0 # Use unbuffered mode
4152
4153 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004154 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004155 line = self.read_file.readline() # first line
4156 self.assertEqual(line, b"A. " + self.write_msg) # first line
4157 self.read_file = self.cli_conn.makefile('rb', 0)
4158 line = self.read_file.readline() # second line
4159 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004160
4161 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004162 self.write_file.write(b"A. " + self.write_msg)
4163 self.write_file.write(b"B. " + self.write_msg)
4164 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004165
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004166 def testMakefileClose(self):
4167 # The file returned by makefile should keep the socket open...
4168 self.cli_conn.close()
4169 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004170 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004171 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004172 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004173 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004174
4175 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004176 self.write_file.write(self.write_msg)
4177 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004178
4179 def testMakefileCloseSocketDestroy(self):
4180 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004181 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004182 refcount_after = sys.getrefcount(self.cli_conn)
4183 self.assertEqual(refcount_before - 1, refcount_after)
4184
4185 def _testMakefileCloseSocketDestroy(self):
4186 pass
4187
Antoine Pitrou98b46702010-09-18 22:59:00 +00004188 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004189 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004190 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4191
4192 def testSmallReadNonBlocking(self):
4193 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004194 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4195 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004196 self.evt1.set()
4197 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004198 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004199 if first_seg is None:
4200 # Data not arrived (can happen under Windows), wait a bit
4201 time.sleep(0.5)
4202 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004203 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004204 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004205 self.assertEqual(n, 3)
4206 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004207 self.assertEqual(msg, self.read_msg)
4208 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4209 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004210
4211 def _testSmallReadNonBlocking(self):
4212 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004213 self.write_file.write(self.write_msg)
4214 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004215 self.evt2.set()
4216 # Avoid cloding the socket before the server test has finished,
4217 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4218 self.serv_finished.wait(5.0)
4219
4220 def testWriteNonBlocking(self):
4221 self.cli_finished.wait(5.0)
4222 # The client thread can't skip directly - the SkipTest exception
4223 # would appear as a failure.
4224 if self.serv_skipped:
4225 self.skipTest(self.serv_skipped)
4226
4227 def _testWriteNonBlocking(self):
4228 self.serv_skipped = None
4229 self.serv_conn.setblocking(False)
4230 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004231 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004232 LIMIT = 10
4233 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004234 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004235 self.assertGreater(n, 0)
4236 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004237 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004238 if n is None:
4239 # Succeeded
4240 break
4241 self.assertGreater(n, 0)
4242 else:
4243 # Let us know that this test didn't manage to establish
4244 # the expected conditions. This is not a failure in itself but,
4245 # if it happens repeatedly, the test should be fixed.
4246 self.serv_skipped = "failed to saturate the socket buffer"
4247
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004248
Guido van Rossum8c943832002-08-08 01:00:28 +00004249class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4250
4251 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4252
4253
4254class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4255
4256 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004257
Thomas Woutersb2137042007-02-01 18:02:27 +00004258
Antoine Pitrou834bd812010-10-13 16:17:14 +00004259class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4260 """Tests for socket.makefile() in text mode (rather than binary)"""
4261
4262 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004263 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004264 write_mode = 'wb'
4265 write_msg = MSG
4266 newline = ''
4267
4268
4269class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4270 """Tests for socket.makefile() in text mode (rather than binary)"""
4271
4272 read_mode = 'rb'
4273 read_msg = MSG
4274 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004275 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004276 newline = ''
4277
4278
4279class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4280 """Tests for socket.makefile() in text mode (rather than binary)"""
4281
4282 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004283 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004284 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004285 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004286 newline = ''
4287
4288
Guido van Rossumd8faa362007-04-27 19:54:29 +00004289class NetworkConnectionTest(object):
4290 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004291
Guido van Rossumd8faa362007-04-27 19:54:29 +00004292 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004293 # We're inherited below by BasicTCPTest2, which also inherits
4294 # BasicTCPTest, which defines self.port referenced below.
4295 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004296 self.serv_conn = self.cli
4297
4298class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4299 """Tests that NetworkConnection does not break existing TCP functionality.
4300 """
4301
4302class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004303
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004304 class MockSocket(socket.socket):
4305 def connect(self, *args):
4306 raise socket.timeout('timed out')
4307
4308 @contextlib.contextmanager
4309 def mocked_socket_module(self):
4310 """Return a socket which times out on connect"""
4311 old_socket = socket.socket
4312 socket.socket = self.MockSocket
4313 try:
4314 yield
4315 finally:
4316 socket.socket = old_socket
4317
4318 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004319 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004320 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004321 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004322 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004323 cli.connect((HOST, port))
4324 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4325
4326 def test_create_connection(self):
4327 # Issue #9792: errors raised by create_connection() should have
4328 # a proper errno attribute.
4329 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004330 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004331 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004332
4333 # Issue #16257: create_connection() calls getaddrinfo() against
4334 # 'localhost'. This may result in an IPV6 addr being returned
4335 # as well as an IPV4 one:
4336 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4337 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4338 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4339 #
4340 # create_connection() enumerates through all the addresses returned
4341 # and if it doesn't successfully bind to any of them, it propagates
4342 # the last exception it encountered.
4343 #
4344 # On Solaris, ENETUNREACH is returned in this circumstance instead
4345 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4346 # expected errnos.
4347 expected_errnos = [ errno.ECONNREFUSED, ]
4348 if hasattr(errno, 'ENETUNREACH'):
4349 expected_errnos.append(errno.ENETUNREACH)
4350
4351 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004352
4353 def test_create_connection_timeout(self):
4354 # Issue #9792: create_connection() should not recast timeout errors
4355 # as generic socket errors.
4356 with self.mocked_socket_module():
4357 with self.assertRaises(socket.timeout):
4358 socket.create_connection((HOST, 1234))
4359
Guido van Rossumd8faa362007-04-27 19:54:29 +00004360
Victor Stinner45df8202010-04-28 22:31:17 +00004361@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004362class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4363
4364 def __init__(self, methodName='runTest'):
4365 SocketTCPTest.__init__(self, methodName=methodName)
4366 ThreadableTest.__init__(self)
4367
4368 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004369 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004370
4371 def clientTearDown(self):
4372 self.cli.close()
4373 self.cli = None
4374 ThreadableTest.clientTearDown(self)
4375
4376 def _justAccept(self):
4377 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004378 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004379
4380 testFamily = _justAccept
4381 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004382 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004383 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004384 self.assertEqual(self.cli.family, 2)
4385
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004386 testSourceAddress = _justAccept
4387 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004388 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4389 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004390 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004391 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004392 # The port number being used is sufficient to show that the bind()
4393 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004394
Guido van Rossumd8faa362007-04-27 19:54:29 +00004395 testTimeoutDefault = _justAccept
4396 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004397 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004398 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004399 socket.setdefaulttimeout(42)
4400 try:
4401 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004402 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004403 finally:
4404 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004405 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004406
4407 testTimeoutNone = _justAccept
4408 def _testTimeoutNone(self):
4409 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004410 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004411 socket.setdefaulttimeout(30)
4412 try:
4413 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004414 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004415 finally:
4416 socket.setdefaulttimeout(None)
4417 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004418
4419 testTimeoutValueNamed = _justAccept
4420 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004421 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004422 self.assertEqual(self.cli.gettimeout(), 30)
4423
4424 testTimeoutValueNonamed = _justAccept
4425 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004426 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004427 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004428 self.assertEqual(self.cli.gettimeout(), 30)
4429
Victor Stinner45df8202010-04-28 22:31:17 +00004430@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004431class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4432
4433 def __init__(self, methodName='runTest'):
4434 SocketTCPTest.__init__(self, methodName=methodName)
4435 ThreadableTest.__init__(self)
4436
4437 def clientSetUp(self):
4438 pass
4439
4440 def clientTearDown(self):
4441 self.cli.close()
4442 self.cli = None
4443 ThreadableTest.clientTearDown(self)
4444
4445 def testInsideTimeout(self):
4446 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004447 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004448 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004449 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004450 testOutsideTimeout = testInsideTimeout
4451
4452 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004453 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004454 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004455 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004456
4457 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004458 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004459 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004460
4461
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004462class TCPTimeoutTest(SocketTCPTest):
4463
4464 def testTCPTimeout(self):
4465 def raise_timeout(*args, **kwargs):
4466 self.serv.settimeout(1.0)
4467 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004468 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004469 "Error generating a timeout exception (TCP)")
4470
4471 def testTimeoutZero(self):
4472 ok = False
4473 try:
4474 self.serv.settimeout(0.0)
4475 foo = self.serv.accept()
4476 except socket.timeout:
4477 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004478 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004479 ok = True
4480 except:
4481 self.fail("caught unexpected exception (TCP)")
4482 if not ok:
4483 self.fail("accept() returned success when we did not expect it")
4484
Serhiy Storchaka43767632013-11-03 21:31:38 +02004485 @unittest.skipUnless(hasattr(signal, 'alarm'),
4486 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004487 def testInterruptedTimeout(self):
4488 # XXX I don't know how to do this test on MSWindows or any other
4489 # plaform that doesn't support signal.alarm() or os.kill(), though
4490 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004491 self.serv.settimeout(5.0) # must be longer than alarm
4492 class Alarm(Exception):
4493 pass
4494 def alarm_handler(signal, frame):
4495 raise Alarm
4496 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4497 try:
4498 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4499 try:
4500 foo = self.serv.accept()
4501 except socket.timeout:
4502 self.fail("caught timeout instead of Alarm")
4503 except Alarm:
4504 pass
4505 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004506 self.fail("caught other exception instead of Alarm:"
4507 " %s(%s):\n%s" %
4508 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004509 else:
4510 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004511 finally:
4512 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004513 except Alarm:
4514 self.fail("got Alarm in wrong place")
4515 finally:
4516 # no alarm can be pending. Safe to restore old handler.
4517 signal.signal(signal.SIGALRM, old_alarm)
4518
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004519class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004520
4521 def testUDPTimeout(self):
4522 def raise_timeout(*args, **kwargs):
4523 self.serv.settimeout(1.0)
4524 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004525 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004526 "Error generating a timeout exception (UDP)")
4527
4528 def testTimeoutZero(self):
4529 ok = False
4530 try:
4531 self.serv.settimeout(0.0)
4532 foo = self.serv.recv(1024)
4533 except socket.timeout:
4534 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004535 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004536 ok = True
4537 except:
4538 self.fail("caught unexpected exception (UDP)")
4539 if not ok:
4540 self.fail("recv() returned success when we did not expect it")
4541
4542class TestExceptions(unittest.TestCase):
4543
4544 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004545 self.assertTrue(issubclass(OSError, Exception))
4546 self.assertTrue(issubclass(socket.herror, OSError))
4547 self.assertTrue(issubclass(socket.gaierror, OSError))
4548 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004549
Serhiy Storchaka43767632013-11-03 21:31:38 +02004550@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004551class TestLinuxAbstractNamespace(unittest.TestCase):
4552
4553 UNIX_PATH_MAX = 108
4554
4555 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004556 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004557 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4558 s1.bind(address)
4559 s1.listen(1)
4560 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4561 s2.connect(s1.getsockname())
4562 with s1.accept()[0] as s3:
4563 self.assertEqual(s1.getsockname(), address)
4564 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004565
4566 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004567 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004568 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4569 s.bind(address)
4570 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004571
4572 def testNameOverflow(self):
4573 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004574 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004575 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004576
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004577 def testStrName(self):
4578 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004579 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4580 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004581 s.bind("\x00python\x00test\x00")
4582 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004583 finally:
4584 s.close()
4585
Serhiy Storchaka43767632013-11-03 21:31:38 +02004586@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004587class TestUnixDomain(unittest.TestCase):
4588
4589 def setUp(self):
4590 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4591
4592 def tearDown(self):
4593 self.sock.close()
4594
4595 def encoded(self, path):
4596 # Return the given path encoded in the file system encoding,
4597 # or skip the test if this is not possible.
4598 try:
4599 return os.fsencode(path)
4600 except UnicodeEncodeError:
4601 self.skipTest(
4602 "Pathname {0!a} cannot be represented in file "
4603 "system encoding {1!r}".format(
4604 path, sys.getfilesystemencoding()))
4605
Antoine Pitrou16374872011-12-16 15:04:12 +01004606 def bind(self, sock, path):
4607 # Bind the socket
4608 try:
4609 sock.bind(path)
4610 except OSError as e:
4611 if str(e) == "AF_UNIX path too long":
4612 self.skipTest(
4613 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4614 .format(path))
4615 else:
4616 raise
4617
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004618 def testStrAddr(self):
4619 # Test binding to and retrieving a normal string pathname.
4620 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004621 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004622 self.addCleanup(support.unlink, path)
4623 self.assertEqual(self.sock.getsockname(), path)
4624
4625 def testBytesAddr(self):
4626 # Test binding to a bytes pathname.
4627 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004628 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004629 self.addCleanup(support.unlink, path)
4630 self.assertEqual(self.sock.getsockname(), path)
4631
4632 def testSurrogateescapeBind(self):
4633 # Test binding to a valid non-ASCII pathname, with the
4634 # non-ASCII bytes supplied using surrogateescape encoding.
4635 path = os.path.abspath(support.TESTFN_UNICODE)
4636 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004637 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004638 self.addCleanup(support.unlink, path)
4639 self.assertEqual(self.sock.getsockname(), path)
4640
4641 def testUnencodableAddr(self):
4642 # Test binding to a pathname that cannot be encoded in the
4643 # file system encoding.
4644 if support.TESTFN_UNENCODABLE is None:
4645 self.skipTest("No unencodable filename available")
4646 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004647 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004648 self.addCleanup(support.unlink, path)
4649 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004650
Victor Stinner45df8202010-04-28 22:31:17 +00004651@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004652class BufferIOTest(SocketConnectedTest):
4653 """
4654 Test the buffer versions of socket.recv() and socket.send().
4655 """
4656 def __init__(self, methodName='runTest'):
4657 SocketConnectedTest.__init__(self, methodName=methodName)
4658
Antoine Pitrou25480782010-03-17 22:50:28 +00004659 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004660 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004661 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004662 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004663 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004664 self.assertEqual(msg, MSG)
4665
Antoine Pitrou25480782010-03-17 22:50:28 +00004666 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004667 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004668 self.serv_conn.send(buf)
4669
Antoine Pitrou25480782010-03-17 22:50:28 +00004670 def testRecvIntoBytearray(self):
4671 buf = bytearray(1024)
4672 nbytes = self.cli_conn.recv_into(buf)
4673 self.assertEqual(nbytes, len(MSG))
4674 msg = buf[:len(MSG)]
4675 self.assertEqual(msg, MSG)
4676
4677 _testRecvIntoBytearray = _testRecvIntoArray
4678
4679 def testRecvIntoMemoryview(self):
4680 buf = bytearray(1024)
4681 nbytes = self.cli_conn.recv_into(memoryview(buf))
4682 self.assertEqual(nbytes, len(MSG))
4683 msg = buf[:len(MSG)]
4684 self.assertEqual(msg, MSG)
4685
4686 _testRecvIntoMemoryview = _testRecvIntoArray
4687
4688 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004689 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004690 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004691 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004692 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004693 self.assertEqual(msg, MSG)
4694
Antoine Pitrou25480782010-03-17 22:50:28 +00004695 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004696 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004697 self.serv_conn.send(buf)
4698
Antoine Pitrou25480782010-03-17 22:50:28 +00004699 def testRecvFromIntoBytearray(self):
4700 buf = bytearray(1024)
4701 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4702 self.assertEqual(nbytes, len(MSG))
4703 msg = buf[:len(MSG)]
4704 self.assertEqual(msg, MSG)
4705
4706 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4707
4708 def testRecvFromIntoMemoryview(self):
4709 buf = bytearray(1024)
4710 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4711 self.assertEqual(nbytes, len(MSG))
4712 msg = buf[:len(MSG)]
4713 self.assertEqual(msg, MSG)
4714
4715 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4716
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004717 def testRecvFromIntoSmallBuffer(self):
4718 # See issue #20246.
4719 buf = bytearray(8)
4720 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4721
4722 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004723 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004724
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004725 def testRecvFromIntoEmptyBuffer(self):
4726 buf = bytearray()
4727 self.cli_conn.recvfrom_into(buf)
4728 self.cli_conn.recvfrom_into(buf, 0)
4729
4730 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4731
Christian Heimes043d6f62008-01-07 17:19:16 +00004732
4733TIPC_STYPE = 2000
4734TIPC_LOWER = 200
4735TIPC_UPPER = 210
4736
4737def isTipcAvailable():
4738 """Check if the TIPC module is loaded
4739
4740 The TIPC module is not loaded automatically on Ubuntu and probably
4741 other Linux distros.
4742 """
4743 if not hasattr(socket, "AF_TIPC"):
4744 return False
4745 if not os.path.isfile("/proc/modules"):
4746 return False
4747 with open("/proc/modules") as f:
4748 for line in f:
4749 if line.startswith("tipc "):
4750 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004751 return False
4752
Serhiy Storchaka43767632013-11-03 21:31:38 +02004753@unittest.skipUnless(isTipcAvailable(),
4754 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004755class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004756 def testRDM(self):
4757 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4758 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004759 self.addCleanup(srv.close)
4760 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004761
4762 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4763 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4764 TIPC_LOWER, TIPC_UPPER)
4765 srv.bind(srvaddr)
4766
4767 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4768 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4769 cli.sendto(MSG, sendaddr)
4770
4771 msg, recvaddr = srv.recvfrom(1024)
4772
4773 self.assertEqual(cli.getsockname(), recvaddr)
4774 self.assertEqual(msg, MSG)
4775
4776
Serhiy Storchaka43767632013-11-03 21:31:38 +02004777@unittest.skipUnless(isTipcAvailable(),
4778 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004779class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004780 def __init__(self, methodName = 'runTest'):
4781 unittest.TestCase.__init__(self, methodName = methodName)
4782 ThreadableTest.__init__(self)
4783
4784 def setUp(self):
4785 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004786 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004787 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4788 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4789 TIPC_LOWER, TIPC_UPPER)
4790 self.srv.bind(srvaddr)
4791 self.srv.listen(5)
4792 self.serverExplicitReady()
4793 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004794 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004795
4796 def clientSetUp(self):
4797 # The is a hittable race between serverExplicitReady() and the
4798 # accept() call; sleep a little while to avoid it, otherwise
4799 # we could get an exception
4800 time.sleep(0.1)
4801 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004802 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004803 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4804 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4805 self.cli.connect(addr)
4806 self.cliaddr = self.cli.getsockname()
4807
4808 def testStream(self):
4809 msg = self.conn.recv(1024)
4810 self.assertEqual(msg, MSG)
4811 self.assertEqual(self.cliaddr, self.connaddr)
4812
4813 def _testStream(self):
4814 self.cli.send(MSG)
4815 self.cli.close()
4816
4817
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004818@unittest.skipUnless(thread, 'Threading required for this test.')
4819class ContextManagersTest(ThreadedTCPSocketTest):
4820
4821 def _testSocketClass(self):
4822 # base test
4823 with socket.socket() as sock:
4824 self.assertFalse(sock._closed)
4825 self.assertTrue(sock._closed)
4826 # close inside with block
4827 with socket.socket() as sock:
4828 sock.close()
4829 self.assertTrue(sock._closed)
4830 # exception inside with block
4831 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004832 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004833 self.assertTrue(sock._closed)
4834
4835 def testCreateConnectionBase(self):
4836 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004837 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004838 data = conn.recv(1024)
4839 conn.sendall(data)
4840
4841 def _testCreateConnectionBase(self):
4842 address = self.serv.getsockname()
4843 with socket.create_connection(address) as sock:
4844 self.assertFalse(sock._closed)
4845 sock.sendall(b'foo')
4846 self.assertEqual(sock.recv(1024), b'foo')
4847 self.assertTrue(sock._closed)
4848
4849 def testCreateConnectionClose(self):
4850 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004851 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004852 data = conn.recv(1024)
4853 conn.sendall(data)
4854
4855 def _testCreateConnectionClose(self):
4856 address = self.serv.getsockname()
4857 with socket.create_connection(address) as sock:
4858 sock.close()
4859 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004860 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004861
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004862
Victor Stinnerdaf45552013-08-28 00:53:59 +02004863class InheritanceTest(unittest.TestCase):
4864 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4865 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004866 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004867 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004868 with socket.socket(socket.AF_INET,
4869 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4870 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004871 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004872
4873 def test_default_inheritable(self):
4874 sock = socket.socket()
4875 with sock:
4876 self.assertEqual(sock.get_inheritable(), False)
4877
4878 def test_dup(self):
4879 sock = socket.socket()
4880 with sock:
4881 newsock = sock.dup()
4882 sock.close()
4883 with newsock:
4884 self.assertEqual(newsock.get_inheritable(), False)
4885
4886 def test_set_inheritable(self):
4887 sock = socket.socket()
4888 with sock:
4889 sock.set_inheritable(True)
4890 self.assertEqual(sock.get_inheritable(), True)
4891
4892 sock.set_inheritable(False)
4893 self.assertEqual(sock.get_inheritable(), False)
4894
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004895 @unittest.skipIf(fcntl is None, "need fcntl")
4896 def test_get_inheritable_cloexec(self):
4897 sock = socket.socket()
4898 with sock:
4899 fd = sock.fileno()
4900 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004901
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004902 # clear FD_CLOEXEC flag
4903 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4904 flags &= ~fcntl.FD_CLOEXEC
4905 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004906
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004907 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004908
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004909 @unittest.skipIf(fcntl is None, "need fcntl")
4910 def test_set_inheritable_cloexec(self):
4911 sock = socket.socket()
4912 with sock:
4913 fd = sock.fileno()
4914 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4915 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004916
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004917 sock.set_inheritable(True)
4918 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4919 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004920
4921
Victor Stinnerdaf45552013-08-28 00:53:59 +02004922 @unittest.skipUnless(hasattr(socket, "socketpair"),
4923 "need socket.socketpair()")
4924 def test_socketpair(self):
4925 s1, s2 = socket.socketpair()
4926 self.addCleanup(s1.close)
4927 self.addCleanup(s2.close)
4928 self.assertEqual(s1.get_inheritable(), False)
4929 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004930
4931
4932@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4933 "SOCK_NONBLOCK not defined")
4934class NonblockConstantTest(unittest.TestCase):
4935 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4936 if nonblock:
4937 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4938 self.assertEqual(s.gettimeout(), timeout)
4939 else:
4940 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4941 self.assertEqual(s.gettimeout(), None)
4942
Charles-François Natali239bb962011-06-03 12:55:15 +02004943 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004944 def test_SOCK_NONBLOCK(self):
4945 # a lot of it seems silly and redundant, but I wanted to test that
4946 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004947 with socket.socket(socket.AF_INET,
4948 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4949 self.checkNonblock(s)
4950 s.setblocking(1)
4951 self.checkNonblock(s, False)
4952 s.setblocking(0)
4953 self.checkNonblock(s)
4954 s.settimeout(None)
4955 self.checkNonblock(s, False)
4956 s.settimeout(2.0)
4957 self.checkNonblock(s, timeout=2.0)
4958 s.setblocking(1)
4959 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004960 # defaulttimeout
4961 t = socket.getdefaulttimeout()
4962 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004963 with socket.socket() as s:
4964 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004965 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004966 with socket.socket() as s:
4967 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004968 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004969 with socket.socket() as s:
4970 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004971 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004972 with socket.socket() as s:
4973 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004974 socket.setdefaulttimeout(t)
4975
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004976
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004977@unittest.skipUnless(os.name == "nt", "Windows specific")
4978@unittest.skipUnless(multiprocessing, "need multiprocessing")
4979class TestSocketSharing(SocketTCPTest):
4980 # This must be classmethod and not staticmethod or multiprocessing
4981 # won't be able to bootstrap it.
4982 @classmethod
4983 def remoteProcessServer(cls, q):
4984 # Recreate socket from shared data
4985 sdata = q.get()
4986 message = q.get()
4987
4988 s = socket.fromshare(sdata)
4989 s2, c = s.accept()
4990
4991 # Send the message
4992 s2.sendall(message)
4993 s2.close()
4994 s.close()
4995
4996 def testShare(self):
4997 # Transfer the listening server socket to another process
4998 # and service it from there.
4999
5000 # Create process:
5001 q = multiprocessing.Queue()
5002 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5003 p.start()
5004
5005 # Get the shared socket data
5006 data = self.serv.share(p.pid)
5007
5008 # Pass the shared socket to the other process
5009 addr = self.serv.getsockname()
5010 self.serv.close()
5011 q.put(data)
5012
5013 # The data that the server will send us
5014 message = b"slapmahfro"
5015 q.put(message)
5016
5017 # Connect
5018 s = socket.create_connection(addr)
5019 # listen for the data
5020 m = []
5021 while True:
5022 data = s.recv(100)
5023 if not data:
5024 break
5025 m.append(data)
5026 s.close()
5027 received = b"".join(m)
5028 self.assertEqual(received, message)
5029 p.join()
5030
5031 def testShareLength(self):
5032 data = self.serv.share(os.getpid())
5033 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5034 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5035
5036 def compareSockets(self, org, other):
5037 # socket sharing is expected to work only for blocking socket
5038 # since the internal python timout value isn't transfered.
5039 self.assertEqual(org.gettimeout(), None)
5040 self.assertEqual(org.gettimeout(), other.gettimeout())
5041
5042 self.assertEqual(org.family, other.family)
5043 self.assertEqual(org.type, other.type)
5044 # If the user specified "0" for proto, then
5045 # internally windows will have picked the correct value.
5046 # Python introspection on the socket however will still return
5047 # 0. For the shared socket, the python value is recreated
5048 # from the actual value, so it may not compare correctly.
5049 if org.proto != 0:
5050 self.assertEqual(org.proto, other.proto)
5051
5052 def testShareLocal(self):
5053 data = self.serv.share(os.getpid())
5054 s = socket.fromshare(data)
5055 try:
5056 self.compareSockets(self.serv, s)
5057 finally:
5058 s.close()
5059
5060 def testTypes(self):
5061 families = [socket.AF_INET, socket.AF_INET6]
5062 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5063 for f in families:
5064 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005065 try:
5066 source = socket.socket(f, t)
5067 except OSError:
5068 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005069 try:
5070 data = source.share(os.getpid())
5071 shared = socket.fromshare(data)
5072 try:
5073 self.compareSockets(source, shared)
5074 finally:
5075 shared.close()
5076 finally:
5077 source.close()
5078
5079
Guido van Rossumb995eb72002-07-31 16:08:40 +00005080def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005081 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005082 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005083
5084 tests.extend([
5085 NonBlockingTCPTests,
5086 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005087 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005088 UnbufferedFileObjectClassTestCase,
5089 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005090 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005091 UnicodeReadFileObjectClassTestCase,
5092 UnicodeWriteFileObjectClassTestCase,
5093 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005094 NetworkConnectionNoServer,
5095 NetworkConnectionAttributesTest,
5096 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005097 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005098 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005099 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005100 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005101 tests.append(BasicSocketPairTest)
5102 tests.append(TestUnixDomain)
5103 tests.append(TestLinuxAbstractNamespace)
5104 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005105 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005106 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005107 tests.extend([
5108 CmsgMacroTests,
5109 SendmsgUDPTest,
5110 RecvmsgUDPTest,
5111 RecvmsgIntoUDPTest,
5112 SendmsgUDP6Test,
5113 RecvmsgUDP6Test,
5114 RecvmsgRFC3542AncillaryUDP6Test,
5115 RecvmsgIntoRFC3542AncillaryUDP6Test,
5116 RecvmsgIntoUDP6Test,
5117 SendmsgTCPTest,
5118 RecvmsgTCPTest,
5119 RecvmsgIntoTCPTest,
5120 SendmsgSCTPStreamTest,
5121 RecvmsgSCTPStreamTest,
5122 RecvmsgIntoSCTPStreamTest,
5123 SendmsgUnixStreamTest,
5124 RecvmsgUnixStreamTest,
5125 RecvmsgIntoUnixStreamTest,
5126 RecvmsgSCMRightsStreamTest,
5127 RecvmsgIntoSCMRightsStreamTest,
5128 # These are slow when setitimer() is not available
5129 InterruptedRecvTimeoutTest,
5130 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005131 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005132 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005133
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005134 thread_info = support.threading_setup()
5135 support.run_unittest(*tests)
5136 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005137
5138if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005139 test_main()