blob: 28bf8f5cc1cfa657239211d56f88662499c0b0ae [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
Charles-François Natali65708cf2014-07-25 18:44:30 +01006import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020022import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000023try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000024 import multiprocessing
25except ImportError:
26 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020027try:
28 import fcntl
29except ImportError:
30 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000031
Benjamin Petersonee8712c2008-05-20 21:35:26 +000032HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000033MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000034
Victor Stinner45df8202010-04-28 22:31:17 +000035try:
36 import _thread as thread
37 import threading
38except ImportError:
39 thread = None
40 threading = None
Victor Stinnere254e532014-07-26 14:36:55 +020041try:
42 import _socket
43except ImportError:
44 _socket = None
45
Victor Stinner45df8202010-04-28 22:31:17 +000046
Charles-François Natali47413c12011-10-06 19:47:44 +020047def _have_socket_can():
48 """Check whether CAN sockets are supported on this host."""
49 try:
50 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020051 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020052 return False
53 else:
54 s.close()
55 return True
56
Charles-François Natali10b8cf42011-11-10 19:21:37 +010057def _have_socket_rds():
58 """Check whether RDS sockets are supported on this host."""
59 try:
60 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
61 except (AttributeError, OSError):
62 return False
63 else:
64 s.close()
65 return True
66
Charles-François Natali47413c12011-10-06 19:47:44 +020067HAVE_SOCKET_CAN = _have_socket_can()
68
Charles-François Natali10b8cf42011-11-10 19:21:37 +010069HAVE_SOCKET_RDS = _have_socket_rds()
70
Nick Coghlan96fe56a2011-08-22 11:55:57 +100071# Size in bytes of the int type
72SIZEOF_INT = array.array("i").itemsize
73
Guido van Rossum24e4af82002-06-12 19:18:08 +000074class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000075
Guido van Rossum24e4af82002-06-12 19:18:08 +000076 def setUp(self):
77 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000078 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000079 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000080
Guido van Rossum24e4af82002-06-12 19:18:08 +000081 def tearDown(self):
82 self.serv.close()
83 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000084
Guido van Rossum24e4af82002-06-12 19:18:08 +000085class SocketUDPTest(unittest.TestCase):
86
87 def setUp(self):
88 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000089 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000090
91 def tearDown(self):
92 self.serv.close()
93 self.serv = None
94
Nick Coghlan96fe56a2011-08-22 11:55:57 +100095class ThreadSafeCleanupTestCase(unittest.TestCase):
96 """Subclass of unittest.TestCase with thread-safe cleanup methods.
97
98 This subclass protects the addCleanup() and doCleanups() methods
99 with a recursive lock.
100 """
101
102 if threading:
103 def __init__(self, *args, **kwargs):
104 super().__init__(*args, **kwargs)
105 self._cleanup_lock = threading.RLock()
106
107 def addCleanup(self, *args, **kwargs):
108 with self._cleanup_lock:
109 return super().addCleanup(*args, **kwargs)
110
111 def doCleanups(self, *args, **kwargs):
112 with self._cleanup_lock:
113 return super().doCleanups(*args, **kwargs)
114
Charles-François Natali47413c12011-10-06 19:47:44 +0200115class SocketCANTest(unittest.TestCase):
116
117 """To be able to run this test, a `vcan0` CAN interface can be created with
118 the following commands:
119 # modprobe vcan
120 # ip link add dev vcan0 type vcan
121 # ifconfig vcan0 up
122 """
123 interface = 'vcan0'
124 bufsize = 128
125
Charles-François Natali773e42d2013-02-05 19:42:01 +0100126 """The CAN frame structure is defined in <linux/can.h>:
127
128 struct can_frame {
129 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
130 __u8 can_dlc; /* data length code: 0 .. 8 */
131 __u8 data[8] __attribute__((aligned(8)));
132 };
133 """
134 can_frame_fmt = "=IB3x8s"
135 can_frame_size = struct.calcsize(can_frame_fmt)
136
137 """The Broadcast Management Command frame structure is defined
138 in <linux/can/bcm.h>:
139
140 struct bcm_msg_head {
141 __u32 opcode;
142 __u32 flags;
143 __u32 count;
144 struct timeval ival1, ival2;
145 canid_t can_id;
146 __u32 nframes;
147 struct can_frame frames[0];
148 }
149
150 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
151 `struct can_frame` definition). Must use native not standard types for packing.
152 """
153 bcm_cmd_msg_fmt = "@3I4l2I"
154 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
155
Charles-François Natali47413c12011-10-06 19:47:44 +0200156 def setUp(self):
157 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200158 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200159 try:
160 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200161 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200162 self.skipTest('network interface `%s` does not exist' %
163 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200164
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100165
166class SocketRDSTest(unittest.TestCase):
167
168 """To be able to run this test, the `rds` kernel module must be loaded:
169 # modprobe rds
170 """
171 bufsize = 8192
172
173 def setUp(self):
174 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
175 self.addCleanup(self.serv.close)
176 try:
177 self.port = support.bind_port(self.serv)
178 except OSError:
179 self.skipTest('unable to bind RDS socket')
180
181
Guido van Rossum24e4af82002-06-12 19:18:08 +0000182class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000183 """Threadable Test class
184
185 The ThreadableTest class makes it easy to create a threaded
186 client/server pair from an existing unit test. To create a
187 new threaded class from an existing unit test, use multiple
188 inheritance:
189
190 class NewClass (OldClass, ThreadableTest):
191 pass
192
193 This class defines two new fixture functions with obvious
194 purposes for overriding:
195
196 clientSetUp ()
197 clientTearDown ()
198
199 Any new test functions within the class must then define
200 tests in pairs, where the test name is preceeded with a
201 '_' to indicate the client portion of the test. Ex:
202
203 def testFoo(self):
204 # Server portion
205
206 def _testFoo(self):
207 # Client portion
208
209 Any exceptions raised by the clients during their tests
210 are caught and transferred to the main thread to alert
211 the testing framework.
212
213 Note, the server setup function cannot call any blocking
214 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000215 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000216 the blocking call (such as in setting up a client/server
217 connection and performing the accept() in setUp().
218 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000219
220 def __init__(self):
221 # Swap the true setup function
222 self.__setUp = self.setUp
223 self.__tearDown = self.tearDown
224 self.setUp = self._setUp
225 self.tearDown = self._tearDown
226
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000227 def serverExplicitReady(self):
228 """This method allows the server to explicitly indicate that
229 it wants the client thread to proceed. This is useful if the
230 server is about to execute a blocking routine that is
231 dependent upon the client thread during its setup routine."""
232 self.server_ready.set()
233
Guido van Rossum24e4af82002-06-12 19:18:08 +0000234 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000235 self.server_ready = threading.Event()
236 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000237 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000238 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200239 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000240
241 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000242 methodname = self.id()
243 i = methodname.rfind('.')
244 methodname = methodname[i+1:]
245 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000246 self.client_thread = thread.start_new_thread(
247 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000248
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200249 try:
250 self.__setUp()
251 except:
252 self.server_crashed = True
253 raise
254 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000255 self.server_ready.set()
256 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000257
258 def _tearDown(self):
259 self.__tearDown()
260 self.done.wait()
261
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000262 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000263 exc = self.queue.get()
264 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265
266 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000267 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000268 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200269 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200270 if self.server_crashed:
271 self.clientTearDown()
272 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000273 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000274 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 try:
276 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000277 except BaseException as e:
278 self.queue.put(e)
279 finally:
280 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281
282 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000283 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000284
285 def clientTearDown(self):
286 self.done.set()
287 thread.exit()
288
289class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
290
291 def __init__(self, methodName='runTest'):
292 SocketTCPTest.__init__(self, methodName=methodName)
293 ThreadableTest.__init__(self)
294
295 def clientSetUp(self):
296 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
297
298 def clientTearDown(self):
299 self.cli.close()
300 self.cli = None
301 ThreadableTest.clientTearDown(self)
302
303class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
304
305 def __init__(self, methodName='runTest'):
306 SocketUDPTest.__init__(self, methodName=methodName)
307 ThreadableTest.__init__(self)
308
309 def clientSetUp(self):
310 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
311
Brian Curtin3beb38f2010-11-04 03:41:43 +0000312 def clientTearDown(self):
313 self.cli.close()
314 self.cli = None
315 ThreadableTest.clientTearDown(self)
316
Charles-François Natali47413c12011-10-06 19:47:44 +0200317class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
318
319 def __init__(self, methodName='runTest'):
320 SocketCANTest.__init__(self, methodName=methodName)
321 ThreadableTest.__init__(self)
322
323 def clientSetUp(self):
324 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
325 try:
326 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200327 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200328 # skipTest should not be called here, and will be called in the
329 # server instead
330 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200331
332 def clientTearDown(self):
333 self.cli.close()
334 self.cli = None
335 ThreadableTest.clientTearDown(self)
336
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100337class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
338
339 def __init__(self, methodName='runTest'):
340 SocketRDSTest.__init__(self, methodName=methodName)
341 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100342
343 def clientSetUp(self):
344 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
345 try:
346 # RDS sockets must be bound explicitly to send or receive data
347 self.cli.bind((HOST, 0))
348 self.cli_addr = self.cli.getsockname()
349 except OSError:
350 # skipTest should not be called here, and will be called in the
351 # server instead
352 pass
353
354 def clientTearDown(self):
355 self.cli.close()
356 self.cli = None
357 ThreadableTest.clientTearDown(self)
358
Guido van Rossum24e4af82002-06-12 19:18:08 +0000359class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000360 """Socket tests for client-server connection.
361
362 self.cli_conn is a client socket connected to the server. The
363 setUp() method guarantees that it is connected to the server.
364 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000365
366 def __init__(self, methodName='runTest'):
367 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
368
369 def setUp(self):
370 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000371 # Indicate explicitly we're ready for the client thread to
372 # proceed and then perform the blocking call to accept
373 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000374 conn, addr = self.serv.accept()
375 self.cli_conn = conn
376
377 def tearDown(self):
378 self.cli_conn.close()
379 self.cli_conn = None
380 ThreadedTCPSocketTest.tearDown(self)
381
382 def clientSetUp(self):
383 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000384 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000385 self.serv_conn = self.cli
386
387 def clientTearDown(self):
388 self.serv_conn.close()
389 self.serv_conn = None
390 ThreadedTCPSocketTest.clientTearDown(self)
391
Dave Cole331708b2004-08-09 04:51:41 +0000392class SocketPairTest(unittest.TestCase, ThreadableTest):
393
394 def __init__(self, methodName='runTest'):
395 unittest.TestCase.__init__(self, methodName=methodName)
396 ThreadableTest.__init__(self)
397
398 def setUp(self):
399 self.serv, self.cli = socket.socketpair()
400
401 def tearDown(self):
402 self.serv.close()
403 self.serv = None
404
405 def clientSetUp(self):
406 pass
407
408 def clientTearDown(self):
409 self.cli.close()
410 self.cli = None
411 ThreadableTest.clientTearDown(self)
412
Tim Peters494aaee2004-08-09 18:54:11 +0000413
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000414# The following classes are used by the sendmsg()/recvmsg() tests.
415# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
416# gives a drop-in replacement for SocketConnectedTest, but different
417# address families can be used, and the attributes serv_addr and
418# cli_addr will be set to the addresses of the endpoints.
419
420class SocketTestBase(unittest.TestCase):
421 """A base class for socket tests.
422
423 Subclasses must provide methods newSocket() to return a new socket
424 and bindSock(sock) to bind it to an unused address.
425
426 Creates a socket self.serv and sets self.serv_addr to its address.
427 """
428
429 def setUp(self):
430 self.serv = self.newSocket()
431 self.bindServer()
432
433 def bindServer(self):
434 """Bind server socket and set self.serv_addr to its address."""
435 self.bindSock(self.serv)
436 self.serv_addr = self.serv.getsockname()
437
438 def tearDown(self):
439 self.serv.close()
440 self.serv = None
441
442
443class SocketListeningTestMixin(SocketTestBase):
444 """Mixin to listen on the server socket."""
445
446 def setUp(self):
447 super().setUp()
448 self.serv.listen(1)
449
450
451class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
452 ThreadableTest):
453 """Mixin to add client socket and allow client/server tests.
454
455 Client socket is self.cli and its address is self.cli_addr. See
456 ThreadableTest for usage information.
457 """
458
459 def __init__(self, *args, **kwargs):
460 super().__init__(*args, **kwargs)
461 ThreadableTest.__init__(self)
462
463 def clientSetUp(self):
464 self.cli = self.newClientSocket()
465 self.bindClient()
466
467 def newClientSocket(self):
468 """Return a new socket for use as client."""
469 return self.newSocket()
470
471 def bindClient(self):
472 """Bind client socket and set self.cli_addr to its address."""
473 self.bindSock(self.cli)
474 self.cli_addr = self.cli.getsockname()
475
476 def clientTearDown(self):
477 self.cli.close()
478 self.cli = None
479 ThreadableTest.clientTearDown(self)
480
481
482class ConnectedStreamTestMixin(SocketListeningTestMixin,
483 ThreadedSocketTestMixin):
484 """Mixin to allow client/server stream tests with connected client.
485
486 Server's socket representing connection to client is self.cli_conn
487 and client's connection to server is self.serv_conn. (Based on
488 SocketConnectedTest.)
489 """
490
491 def setUp(self):
492 super().setUp()
493 # Indicate explicitly we're ready for the client thread to
494 # proceed and then perform the blocking call to accept
495 self.serverExplicitReady()
496 conn, addr = self.serv.accept()
497 self.cli_conn = conn
498
499 def tearDown(self):
500 self.cli_conn.close()
501 self.cli_conn = None
502 super().tearDown()
503
504 def clientSetUp(self):
505 super().clientSetUp()
506 self.cli.connect(self.serv_addr)
507 self.serv_conn = self.cli
508
509 def clientTearDown(self):
510 self.serv_conn.close()
511 self.serv_conn = None
512 super().clientTearDown()
513
514
515class UnixSocketTestBase(SocketTestBase):
516 """Base class for Unix-domain socket tests."""
517
518 # This class is used for file descriptor passing tests, so we
519 # create the sockets in a private directory so that other users
520 # can't send anything that might be problematic for a privileged
521 # user running the tests.
522
523 def setUp(self):
524 self.dir_path = tempfile.mkdtemp()
525 self.addCleanup(os.rmdir, self.dir_path)
526 super().setUp()
527
528 def bindSock(self, sock):
529 path = tempfile.mktemp(dir=self.dir_path)
530 sock.bind(path)
531 self.addCleanup(support.unlink, path)
532
533class UnixStreamBase(UnixSocketTestBase):
534 """Base class for Unix-domain SOCK_STREAM tests."""
535
536 def newSocket(self):
537 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
538
539
540class InetTestBase(SocketTestBase):
541 """Base class for IPv4 socket tests."""
542
543 host = HOST
544
545 def setUp(self):
546 super().setUp()
547 self.port = self.serv_addr[1]
548
549 def bindSock(self, sock):
550 support.bind_port(sock, host=self.host)
551
552class TCPTestBase(InetTestBase):
553 """Base class for TCP-over-IPv4 tests."""
554
555 def newSocket(self):
556 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
557
558class UDPTestBase(InetTestBase):
559 """Base class for UDP-over-IPv4 tests."""
560
561 def newSocket(self):
562 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
563
564class SCTPStreamBase(InetTestBase):
565 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
566
567 def newSocket(self):
568 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
569 socket.IPPROTO_SCTP)
570
571
572class Inet6TestBase(InetTestBase):
573 """Base class for IPv6 socket tests."""
574
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200575 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000576
577class UDP6TestBase(Inet6TestBase):
578 """Base class for UDP-over-IPv6 tests."""
579
580 def newSocket(self):
581 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
582
583
584# Test-skipping decorators for use with ThreadableTest.
585
586def skipWithClientIf(condition, reason):
587 """Skip decorated test if condition is true, add client_skip decorator.
588
589 If the decorated object is not a class, sets its attribute
590 "client_skip" to a decorator which will return an empty function
591 if the test is to be skipped, or the original function if it is
592 not. This can be used to avoid running the client part of a
593 skipped test when using ThreadableTest.
594 """
595 def client_pass(*args, **kwargs):
596 pass
597 def skipdec(obj):
598 retval = unittest.skip(reason)(obj)
599 if not isinstance(obj, type):
600 retval.client_skip = lambda f: client_pass
601 return retval
602 def noskipdec(obj):
603 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
604 obj.client_skip = lambda f: f
605 return obj
606 return skipdec if condition else noskipdec
607
608
609def requireAttrs(obj, *attributes):
610 """Skip decorated test if obj is missing any of the given attributes.
611
612 Sets client_skip attribute as skipWithClientIf() does.
613 """
614 missing = [name for name in attributes if not hasattr(obj, name)]
615 return skipWithClientIf(
616 missing, "don't have " + ", ".join(name for name in missing))
617
618
619def requireSocket(*args):
620 """Skip decorated test if a socket cannot be created with given arguments.
621
622 When an argument is given as a string, will use the value of that
623 attribute of the socket module, or skip the test if it doesn't
624 exist. Sets client_skip attribute as skipWithClientIf() does.
625 """
626 err = None
627 missing = [obj for obj in args if
628 isinstance(obj, str) and not hasattr(socket, obj)]
629 if missing:
630 err = "don't have " + ", ".join(name for name in missing)
631 else:
632 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
633 for obj in args]
634 try:
635 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200636 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000637 # XXX: check errno?
638 err = str(e)
639 else:
640 s.close()
641 return skipWithClientIf(
642 err is not None,
643 "can't create socket({0}): {1}".format(
644 ", ".join(str(o) for o in args), err))
645
646
Guido van Rossum24e4af82002-06-12 19:18:08 +0000647#######################################################################
648## Begin Tests
649
650class GeneralModuleTests(unittest.TestCase):
651
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000652 def test_repr(self):
653 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200654 with s:
655 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000656 self.assertIn('family=%s' % socket.AF_INET, repr(s))
657 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200658 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200659 self.assertNotIn('raddr', repr(s))
660 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200661 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200662 self.assertIn(str(s.getsockname()), repr(s))
663 self.assertIn('[closed]', repr(s))
664 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000665
Victor Stinnere254e532014-07-26 14:36:55 +0200666 @unittest.skipUnless(_socket is not None, 'need _socket module')
667 def test_csocket_repr(self):
668 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
669 try:
670 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
671 % (s.fileno(), s.family, s.type, s.proto))
672 self.assertEqual(repr(s), expected)
673 finally:
674 s.close()
675 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
676 % (s.family, s.type, s.proto))
677 self.assertEqual(repr(s), expected)
678
Raymond Hettinger027bb632004-05-31 03:09:25 +0000679 def test_weakref(self):
680 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
681 p = proxy(s)
682 self.assertEqual(p.fileno(), s.fileno())
683 s.close()
684 s = None
685 try:
686 p.fileno()
687 except ReferenceError:
688 pass
689 else:
690 self.fail('Socket proxy still exists')
691
Guido van Rossum24e4af82002-06-12 19:18:08 +0000692 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000693 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300694 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200695 with self.assertRaises(OSError, msg=msg % 'OSError'):
696 raise OSError
697 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000698 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200699 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701
Ezio Melotti63e42302011-05-07 19:47:48 +0300702 def testSendtoErrors(self):
703 # Testing that sendto doens't masks failures. See #10169.
704 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
705 self.addCleanup(s.close)
706 s.bind(('', 0))
707 sockname = s.getsockname()
708 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300709 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300710 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300711 self.assertEqual(str(cm.exception),
712 "'str' does not support the buffer interface")
713 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300714 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300715 self.assertEqual(str(cm.exception),
716 "'complex' does not support the buffer interface")
717 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300718 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300719 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300720 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300721 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300722 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300723 self.assertEqual(str(cm.exception),
724 "'str' does not support the buffer interface")
725 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300726 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300727 self.assertEqual(str(cm.exception),
728 "'complex' does not support the buffer interface")
729 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300730 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300731 self.assertIn('not NoneType', str(cm.exception))
732 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300733 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300734 self.assertIn('an integer is required', str(cm.exception))
735 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300736 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300737 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300738 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300739 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300740 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300741 self.assertIn('(1 given)', str(cm.exception))
742 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300743 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300744 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300745
Guido van Rossum24e4af82002-06-12 19:18:08 +0000746 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000747 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748 socket.AF_INET
749 socket.SOCK_STREAM
750 socket.SOCK_DGRAM
751 socket.SOCK_RAW
752 socket.SOCK_RDM
753 socket.SOCK_SEQPACKET
754 socket.SOL_SOCKET
755 socket.SO_REUSEADDR
756
Guido van Rossum654c11e2002-06-13 20:24:17 +0000757 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000758 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000759 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000760 try:
761 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200762 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000763 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600764 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000765 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000766 try:
767 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200768 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000769 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600770 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000771 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000772 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000773 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000774 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000775
Charles-François Natali0cc86852013-09-13 19:53:08 +0200776 def test_host_resolution(self):
777 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
778 '1:1:1:1:1:1:1:1:1']:
779 self.assertRaises(OSError, socket.gethostbyname, addr)
780 self.assertRaises(OSError, socket.gethostbyaddr, addr)
781
782 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
783 self.assertEqual(socket.gethostbyname(addr), addr)
784
785 # we don't test support.HOSTv6 because there's a chance it doesn't have
786 # a matching name entry (e.g. 'ip6-localhost')
787 for host in [support.HOST]:
788 self.assertIn(host, socket.gethostbyaddr(host)[2])
789
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000790 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
791 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
792 def test_sethostname(self):
793 oldhn = socket.gethostname()
794 try:
795 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200796 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000797 if e.errno == errno.EPERM:
798 self.skipTest("test should be run as root")
799 else:
800 raise
801 try:
802 # running test as root!
803 self.assertEqual(socket.gethostname(), 'new')
804 # Should work with bytes objects too
805 socket.sethostname(b'bar')
806 self.assertEqual(socket.gethostname(), 'bar')
807 finally:
808 socket.sethostname(oldhn)
809
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700810 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
811 'socket.if_nameindex() not available.')
812 def testInterfaceNameIndex(self):
813 interfaces = socket.if_nameindex()
814 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200815 self.assertIsInstance(index, int)
816 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700817 # interface indices are non-zero integers
818 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200819 _index = socket.if_nametoindex(name)
820 self.assertIsInstance(_index, int)
821 self.assertEqual(index, _index)
822 _name = socket.if_indextoname(index)
823 self.assertIsInstance(_name, str)
824 self.assertEqual(name, _name)
825
826 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
827 'socket.if_nameindex() not available.')
828 def testInvalidInterfaceNameIndex(self):
829 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200830 self.assertRaises(OSError, socket.if_indextoname, 0)
831 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200832 # test with invalid values
833 self.assertRaises(TypeError, socket.if_nametoindex, 0)
834 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700835
Serhiy Storchaka43767632013-11-03 21:31:38 +0200836 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
837 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000838 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000839 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200840 try:
841 # On some versions, this loses a reference
842 orig = sys.getrefcount(__name__)
843 socket.getnameinfo(__name__,0)
844 except TypeError:
845 if sys.getrefcount(__name__) != orig:
846 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000847
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000849 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850 try:
851 # On some versions, this crashes the interpreter.
852 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200853 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000855
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000856 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000857 # This just checks that htons etc. are their own inverse,
858 # when looking at the lower 16 or 32 bits.
859 sizes = {socket.htonl: 32, socket.ntohl: 32,
860 socket.htons: 16, socket.ntohs: 16}
861 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000862 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000863 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
864 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000865
Guido van Rossuma2627af2002-09-14 00:58:46 +0000866 swapped = func(mask)
867 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000868 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000869
Guido van Rossum018919a2007-01-15 00:07:32 +0000870 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000871 good_values = [ 1, 2, 3, 1, 2, 3 ]
872 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000873 for k in good_values:
874 socket.ntohl(k)
875 socket.ntohs(k)
876 socket.htonl(k)
877 socket.htons(k)
878 for k in bad_values:
879 self.assertRaises(OverflowError, socket.ntohl, k)
880 self.assertRaises(OverflowError, socket.ntohs, k)
881 self.assertRaises(OverflowError, socket.htonl, k)
882 self.assertRaises(OverflowError, socket.htons, k)
883
Barry Warsaw11b91a02004-06-28 00:50:43 +0000884 def testGetServBy(self):
885 eq = self.assertEqual
886 # Find one service that exists, then check all the related interfaces.
887 # I've ordered this by protocols that have both a tcp and udp
888 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200889 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200890 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000891 # avoid the 'echo' service on this platform, as there is an
892 # assumption breaking non-standard port/protocol entry
893 services = ('daytime', 'qotd', 'domain')
894 else:
895 services = ('echo', 'daytime', 'domain')
896 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000897 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000898 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000899 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200900 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000901 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000902 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200903 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000904 # Try same call with optional protocol omitted
905 port2 = socket.getservbyname(service)
906 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400907 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000908 try:
909 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200910 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000911 udpport = None
912 else:
913 eq(udpport, port)
914 # Now make sure the lookup by port returns the same service name
915 eq(socket.getservbyport(port2), service)
916 eq(socket.getservbyport(port, 'tcp'), service)
917 if udpport is not None:
918 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000919 # Make sure getservbyport does not accept out of range ports.
920 self.assertRaises(OverflowError, socket.getservbyport, -1)
921 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000923 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000924 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000925 # The default timeout should initially be None
926 self.assertEqual(socket.getdefaulttimeout(), None)
927 s = socket.socket()
928 self.assertEqual(s.gettimeout(), None)
929 s.close()
930
931 # Set the default timeout to 10, and see if it propagates
932 socket.setdefaulttimeout(10)
933 self.assertEqual(socket.getdefaulttimeout(), 10)
934 s = socket.socket()
935 self.assertEqual(s.gettimeout(), 10)
936 s.close()
937
938 # Reset the default timeout to None, and see if it propagates
939 socket.setdefaulttimeout(None)
940 self.assertEqual(socket.getdefaulttimeout(), None)
941 s = socket.socket()
942 self.assertEqual(s.gettimeout(), None)
943 s.close()
944
945 # Check that setting it to an invalid value raises ValueError
946 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
947
948 # Check that setting it to an invalid type raises TypeError
949 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
950
Serhiy Storchaka43767632013-11-03 21:31:38 +0200951 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
952 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000953 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000954 # Test that issue1008086 and issue767150 are fixed.
955 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000956 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
957 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000958
Serhiy Storchaka43767632013-11-03 21:31:38 +0200959 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
960 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000961 def testIPv4toString(self):
962 from socket import inet_aton as f, inet_pton, AF_INET
963 g = lambda a: inet_pton(AF_INET, a)
964
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100965 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200966 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100967 )
968
Ezio Melottib3aedd42010-11-20 19:04:17 +0000969 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
970 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
971 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
972 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
973 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100974 assertInvalid(f, '0.0.0.')
975 assertInvalid(f, '300.0.0.0')
976 assertInvalid(f, 'a.0.0.0')
977 assertInvalid(f, '1.2.3.4.5')
978 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000979
Ezio Melottib3aedd42010-11-20 19:04:17 +0000980 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
981 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
982 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
983 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100984 assertInvalid(g, '0.0.0.')
985 assertInvalid(g, '300.0.0.0')
986 assertInvalid(g, 'a.0.0.0')
987 assertInvalid(g, '1.2.3.4.5')
988 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000989
Serhiy Storchaka43767632013-11-03 21:31:38 +0200990 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
991 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000992 def testIPv6toString(self):
993 try:
994 from socket import inet_pton, AF_INET6, has_ipv6
995 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600996 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000997 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600998 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -0500999
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001000 if sys.platform == "win32":
1001 try:
1002 inet_pton(AF_INET6, '::')
1003 except OSError as e:
1004 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001005 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001006
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001007 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001008 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001009 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001010 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001011
Ezio Melottib3aedd42010-11-20 19:04:17 +00001012 self.assertEqual(b'\x00' * 16, f('::'))
1013 self.assertEqual(b'\x00' * 16, f('0::0'))
1014 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1015 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001016 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 +00001017 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1018 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001019 self.assertEqual(
1020 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1021 f('ad42:abc::127:0:254:2')
1022 )
1023 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1024 assertInvalid('0x20::')
1025 assertInvalid(':::')
1026 assertInvalid('::0::')
1027 assertInvalid('1::abc::')
1028 assertInvalid('1::abc::def')
1029 assertInvalid('1:2:3:4:5:6:')
1030 assertInvalid('1:2:3:4:5:6')
1031 assertInvalid('1:2:3:4:5:6:7:8:')
1032 assertInvalid('1:2:3:4:5:6:7:8:0')
1033
1034 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1035 f('::254.42.23.64')
1036 )
1037 self.assertEqual(
1038 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1039 f('42::a29b:254.42.23.64')
1040 )
1041 self.assertEqual(
1042 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1043 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1044 )
1045 assertInvalid('255.254.253.252')
1046 assertInvalid('1::260.2.3.0')
1047 assertInvalid('1::0.be.e.0')
1048 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1049 assertInvalid('::1.2.3.4:0')
1050 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001051
Serhiy Storchaka43767632013-11-03 21:31:38 +02001052 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1053 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001054 def testStringToIPv4(self):
1055 from socket import inet_ntoa as f, inet_ntop, AF_INET
1056 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001057 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001058 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001059 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001060
Ezio Melottib3aedd42010-11-20 19:04:17 +00001061 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1062 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1063 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1064 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001065 assertInvalid(f, b'\x00' * 3)
1066 assertInvalid(f, b'\x00' * 5)
1067 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001068
Ezio Melottib3aedd42010-11-20 19:04:17 +00001069 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1070 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1071 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001072 assertInvalid(g, b'\x00' * 3)
1073 assertInvalid(g, b'\x00' * 5)
1074 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001075
Serhiy Storchaka43767632013-11-03 21:31:38 +02001076 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1077 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001078 def testStringToIPv6(self):
1079 try:
1080 from socket import inet_ntop, AF_INET6, has_ipv6
1081 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001082 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001083 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001084 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001085
1086 if sys.platform == "win32":
1087 try:
1088 inet_ntop(AF_INET6, b'\x00' * 16)
1089 except OSError as e:
1090 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001091 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001092
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001093 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001094 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001095 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001096 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001097
Ezio Melottib3aedd42010-11-20 19:04:17 +00001098 self.assertEqual('::', f(b'\x00' * 16))
1099 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1100 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001101 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001102 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 +00001103 )
1104
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001105 assertInvalid(b'\x12' * 15)
1106 assertInvalid(b'\x12' * 17)
1107 assertInvalid(b'\x12' * 4)
1108
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001109 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001110
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001111 def testSockName(self):
1112 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001113 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001114 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001115 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001116 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001117 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001118 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1119 # it reasonable to get the host's addr in addition to 0.0.0.0.
1120 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001121 try:
1122 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001123 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001124 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001125 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001126 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001127 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001128
1129 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001130 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001131 # We know a socket should start without reuse==0
1132 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001133 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001134 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001135 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001136
1137 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001138 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001139 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001140 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001141 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1142 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001143 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001144
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001145 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001146 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001147 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1148 sock.settimeout(1)
1149 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001150 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001151
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001152 def testNewAttributes(self):
1153 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001154
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001155 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1156 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001157 if hasattr(socket, 'SOCK_CLOEXEC'):
1158 self.assertIn(sock.type,
1159 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1160 socket.SOCK_STREAM))
1161 else:
1162 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001163 self.assertEqual(sock.proto, 0)
1164 sock.close()
1165
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001166 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001167 sock = socket.socket()
1168 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001169 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001170 big_port = port + 65536
1171 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001172 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1173 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1174 # Since find_unused_port() is inherently subject to race conditions, we
1175 # call it a couple times if necessary.
1176 for i in itertools.count():
1177 port = support.find_unused_port()
1178 try:
1179 sock.bind((HOST, port))
1180 except OSError as e:
1181 if e.errno != errno.EADDRINUSE or i == 5:
1182 raise
1183 else:
1184 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001185
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001186 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001187 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001188 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1189 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1190 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1191 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001192 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1193 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001194 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001195 self.assertRaises(ValueError, s.ioctl, -1, None)
1196 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001197
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001198 def testGetaddrinfo(self):
1199 try:
1200 socket.getaddrinfo('localhost', 80)
1201 except socket.gaierror as err:
1202 if err.errno == socket.EAI_SERVICE:
1203 # see http://bugs.python.org/issue1282647
1204 self.skipTest("buggy libc version")
1205 raise
1206 # len of every sequence is supposed to be == 5
1207 for info in socket.getaddrinfo(HOST, None):
1208 self.assertEqual(len(info), 5)
1209 # host can be a domain name, a string representation of an
1210 # IPv4/v6 address or None
1211 socket.getaddrinfo('localhost', 80)
1212 socket.getaddrinfo('127.0.0.1', 80)
1213 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001214 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001215 socket.getaddrinfo('::1', 80)
1216 # port can be a string service name such as "http", a numeric
1217 # port number or None
1218 socket.getaddrinfo(HOST, "http")
1219 socket.getaddrinfo(HOST, 80)
1220 socket.getaddrinfo(HOST, None)
1221 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001222 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1223 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001224 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001225 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1226 self.assertEqual(type, socket.SOCK_STREAM)
1227 self.assertEqual(str(type), 'SocketType.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001228 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1229 for _, socktype, _, _, _ in infos:
1230 self.assertEqual(socktype, socket.SOCK_STREAM)
1231 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001232 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001233 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1234 # a server willing to support both IPv4 and IPv6 will
1235 # usually do this
1236 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1237 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001238 # test keyword arguments
1239 a = socket.getaddrinfo(HOST, None)
1240 b = socket.getaddrinfo(host=HOST, port=None)
1241 self.assertEqual(a, b)
1242 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1243 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1244 self.assertEqual(a, b)
1245 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1246 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1247 self.assertEqual(a, b)
1248 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1249 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1250 self.assertEqual(a, b)
1251 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1252 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1253 self.assertEqual(a, b)
1254 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1255 socket.AI_PASSIVE)
1256 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1257 type=socket.SOCK_STREAM, proto=0,
1258 flags=socket.AI_PASSIVE)
1259 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001260 # Issue #6697.
1261 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001262
Ned Deilyb24f4812014-02-13 22:50:42 -08001263 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001264 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001265 try:
1266 # The arguments here are undefined and the call may succeed
1267 # or fail. All we care here is that it doesn't segfault.
1268 socket.getaddrinfo("localhost", None, 0, 0, 0,
1269 socket.AI_NUMERICSERV)
1270 except socket.gaierror:
1271 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001272
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001273 def test_getnameinfo(self):
1274 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001275 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001276
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001277 @unittest.skipUnless(support.is_resource_enabled('network'),
1278 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001279 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001280 # Check for internet access before running test (issue #12804).
1281 try:
1282 socket.gethostbyname('python.org')
1283 except socket.gaierror as e:
1284 if e.errno == socket.EAI_NODATA:
1285 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001286 # these should all be successful
1287 socket.gethostbyname('испытание.python.org')
1288 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001289 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1290 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1291 # have a reverse entry yet
1292 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001293
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001294 def check_sendall_interrupted(self, with_timeout):
1295 # socketpair() is not stricly required, but it makes things easier.
1296 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1297 self.skipTest("signal.alarm and socket.socketpair required for this test")
1298 # Our signal handlers clobber the C errno by calling a math function
1299 # with an invalid domain value.
1300 def ok_handler(*args):
1301 self.assertRaises(ValueError, math.acosh, 0)
1302 def raising_handler(*args):
1303 self.assertRaises(ValueError, math.acosh, 0)
1304 1 // 0
1305 c, s = socket.socketpair()
1306 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1307 try:
1308 if with_timeout:
1309 # Just above the one second minimum for signal.alarm
1310 c.settimeout(1.5)
1311 with self.assertRaises(ZeroDivisionError):
1312 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001313 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001314 if with_timeout:
1315 signal.signal(signal.SIGALRM, ok_handler)
1316 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001317 self.assertRaises(socket.timeout, c.sendall,
1318 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001319 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001320 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001321 signal.signal(signal.SIGALRM, old_alarm)
1322 c.close()
1323 s.close()
1324
1325 def test_sendall_interrupted(self):
1326 self.check_sendall_interrupted(False)
1327
1328 def test_sendall_interrupted_with_timeout(self):
1329 self.check_sendall_interrupted(True)
1330
Antoine Pitroue033e062010-10-29 10:38:18 +00001331 def test_dealloc_warn(self):
1332 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1333 r = repr(sock)
1334 with self.assertWarns(ResourceWarning) as cm:
1335 sock = None
1336 support.gc_collect()
1337 self.assertIn(r, str(cm.warning.args[0]))
1338 # An open socket file object gets dereferenced after the socket
1339 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1340 f = sock.makefile('rb')
1341 r = repr(sock)
1342 sock = None
1343 support.gc_collect()
1344 with self.assertWarns(ResourceWarning):
1345 f = None
1346 support.gc_collect()
1347
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001348 def test_name_closed_socketio(self):
1349 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1350 fp = sock.makefile("rb")
1351 fp.close()
1352 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1353
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001354 def test_unusable_closed_socketio(self):
1355 with socket.socket() as sock:
1356 fp = sock.makefile("rb", buffering=0)
1357 self.assertTrue(fp.readable())
1358 self.assertFalse(fp.writable())
1359 self.assertFalse(fp.seekable())
1360 fp.close()
1361 self.assertRaises(ValueError, fp.readable)
1362 self.assertRaises(ValueError, fp.writable)
1363 self.assertRaises(ValueError, fp.seekable)
1364
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001365 def test_pickle(self):
1366 sock = socket.socket()
1367 with sock:
1368 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1369 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1370
Serhiy Storchaka78980432013-01-15 01:12:17 +02001371 def test_listen_backlog(self):
1372 for backlog in 0, -1:
1373 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1374 srv.bind((HOST, 0))
1375 srv.listen(backlog)
1376 srv.close()
1377
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001378 @support.cpython_only
1379 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001380 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001381 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001382 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1383 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001384 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001385 srv.close()
1386
Charles-François Natali42663332012-01-02 15:57:30 +01001387 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001388 def test_flowinfo(self):
1389 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001390 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001391 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001392 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001393
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001394 def test_str_for_enums(self):
1395 # Make sure that the AF_* and SOCK_* constants have enum-like string
1396 # reprs.
1397 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1398 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
1399 self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM')
1400
1401 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1402 def test_uknown_socket_family_repr(self):
1403 # Test that when created with a family that's not one of the known
1404 # AF_*/SOCK_* constants, socket.family just returns the number.
1405 #
1406 # To do this we fool socket.socket into believing it already has an
1407 # open fd because on this path it doesn't actually verify the family and
1408 # type and populates the socket object.
1409 #
1410 # On Windows this trick won't work, so the test is skipped.
1411 fd, _ = tempfile.mkstemp()
1412 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1413 self.assertEqual(s.family, 42424)
1414 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001415
Charles-François Natali47413c12011-10-06 19:47:44 +02001416@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1417class BasicCANTest(unittest.TestCase):
1418
1419 def testCrucialConstants(self):
1420 socket.AF_CAN
1421 socket.PF_CAN
1422 socket.CAN_RAW
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 testBCMConstants(self):
1427 socket.CAN_BCM
1428
1429 # opcodes
1430 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1431 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1432 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1433 socket.CAN_BCM_TX_SEND # send one CAN frame
1434 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1435 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1436 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1437 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1438 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1439 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1440 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1441 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1442
Charles-François Natali47413c12011-10-06 19:47:44 +02001443 def testCreateSocket(self):
1444 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1445 pass
1446
Charles-François Natali773e42d2013-02-05 19:42:01 +01001447 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1448 'socket.CAN_BCM required for this test.')
1449 def testCreateBCMSocket(self):
1450 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1451 pass
1452
Charles-François Natali47413c12011-10-06 19:47:44 +02001453 def testBindAny(self):
1454 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1455 s.bind(('', ))
1456
1457 def testTooLongInterfaceName(self):
1458 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1459 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001460 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001461 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001462
1463 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1464 'socket.CAN_RAW_LOOPBACK required for this test.')
1465 def testLoopback(self):
1466 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1467 for loopback in (0, 1):
1468 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1469 loopback)
1470 self.assertEqual(loopback,
1471 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1472
1473 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1474 'socket.CAN_RAW_FILTER required for this test.')
1475 def testFilter(self):
1476 can_id, can_mask = 0x200, 0x700
1477 can_filter = struct.pack("=II", can_id, can_mask)
1478 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1479 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1480 self.assertEqual(can_filter,
1481 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1482
1483
1484@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001485@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001486class CANTest(ThreadedCANSocketTest):
1487
Charles-François Natali47413c12011-10-06 19:47:44 +02001488 def __init__(self, methodName='runTest'):
1489 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1490
1491 @classmethod
1492 def build_can_frame(cls, can_id, data):
1493 """Build a CAN frame."""
1494 can_dlc = len(data)
1495 data = data.ljust(8, b'\x00')
1496 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1497
1498 @classmethod
1499 def dissect_can_frame(cls, frame):
1500 """Dissect a CAN frame."""
1501 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1502 return (can_id, can_dlc, data[:can_dlc])
1503
1504 def testSendFrame(self):
1505 cf, addr = self.s.recvfrom(self.bufsize)
1506 self.assertEqual(self.cf, cf)
1507 self.assertEqual(addr[0], self.interface)
1508 self.assertEqual(addr[1], socket.AF_CAN)
1509
1510 def _testSendFrame(self):
1511 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1512 self.cli.send(self.cf)
1513
1514 def testSendMaxFrame(self):
1515 cf, addr = self.s.recvfrom(self.bufsize)
1516 self.assertEqual(self.cf, cf)
1517
1518 def _testSendMaxFrame(self):
1519 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1520 self.cli.send(self.cf)
1521
1522 def testSendMultiFrames(self):
1523 cf, addr = self.s.recvfrom(self.bufsize)
1524 self.assertEqual(self.cf1, cf)
1525
1526 cf, addr = self.s.recvfrom(self.bufsize)
1527 self.assertEqual(self.cf2, cf)
1528
1529 def _testSendMultiFrames(self):
1530 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1531 self.cli.send(self.cf1)
1532
1533 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1534 self.cli.send(self.cf2)
1535
Charles-François Natali773e42d2013-02-05 19:42:01 +01001536 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1537 'socket.CAN_BCM required for this test.')
1538 def _testBCM(self):
1539 cf, addr = self.cli.recvfrom(self.bufsize)
1540 self.assertEqual(self.cf, cf)
1541 can_id, can_dlc, data = self.dissect_can_frame(cf)
1542 self.assertEqual(self.can_id, can_id)
1543 self.assertEqual(self.data, data)
1544
1545 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1546 'socket.CAN_BCM required for this test.')
1547 def testBCM(self):
1548 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1549 self.addCleanup(bcm.close)
1550 bcm.connect((self.interface,))
1551 self.can_id = 0x123
1552 self.data = bytes([0xc0, 0xff, 0xee])
1553 self.cf = self.build_can_frame(self.can_id, self.data)
1554 opcode = socket.CAN_BCM_TX_SEND
1555 flags = 0
1556 count = 0
1557 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1558 bcm_can_id = 0x0222
1559 nframes = 1
1560 assert len(self.cf) == 16
1561 header = struct.pack(self.bcm_cmd_msg_fmt,
1562 opcode,
1563 flags,
1564 count,
1565 ival1_seconds,
1566 ival1_usec,
1567 ival2_seconds,
1568 ival2_usec,
1569 bcm_can_id,
1570 nframes,
1571 )
1572 header_plus_frame = header + self.cf
1573 bytes_sent = bcm.send(header_plus_frame)
1574 self.assertEqual(bytes_sent, len(header_plus_frame))
1575
Charles-François Natali47413c12011-10-06 19:47:44 +02001576
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001577@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1578class BasicRDSTest(unittest.TestCase):
1579
1580 def testCrucialConstants(self):
1581 socket.AF_RDS
1582 socket.PF_RDS
1583
1584 def testCreateSocket(self):
1585 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1586 pass
1587
1588 def testSocketBufferSize(self):
1589 bufsize = 16384
1590 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1591 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1592 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1593
1594
1595@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1596@unittest.skipUnless(thread, 'Threading required for this test.')
1597class RDSTest(ThreadedRDSSocketTest):
1598
1599 def __init__(self, methodName='runTest'):
1600 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1601
Charles-François Natali240c55f2011-11-10 20:33:36 +01001602 def setUp(self):
1603 super().setUp()
1604 self.evt = threading.Event()
1605
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001606 def testSendAndRecv(self):
1607 data, addr = self.serv.recvfrom(self.bufsize)
1608 self.assertEqual(self.data, data)
1609 self.assertEqual(self.cli_addr, addr)
1610
1611 def _testSendAndRecv(self):
1612 self.data = b'spam'
1613 self.cli.sendto(self.data, 0, (HOST, self.port))
1614
1615 def testPeek(self):
1616 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1617 self.assertEqual(self.data, data)
1618 data, addr = self.serv.recvfrom(self.bufsize)
1619 self.assertEqual(self.data, data)
1620
1621 def _testPeek(self):
1622 self.data = b'spam'
1623 self.cli.sendto(self.data, 0, (HOST, self.port))
1624
1625 @requireAttrs(socket.socket, 'recvmsg')
1626 def testSendAndRecvMsg(self):
1627 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1628 self.assertEqual(self.data, data)
1629
1630 @requireAttrs(socket.socket, 'sendmsg')
1631 def _testSendAndRecvMsg(self):
1632 self.data = b'hello ' * 10
1633 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1634
1635 def testSendAndRecvMulti(self):
1636 data, addr = self.serv.recvfrom(self.bufsize)
1637 self.assertEqual(self.data1, data)
1638
1639 data, addr = self.serv.recvfrom(self.bufsize)
1640 self.assertEqual(self.data2, data)
1641
1642 def _testSendAndRecvMulti(self):
1643 self.data1 = b'bacon'
1644 self.cli.sendto(self.data1, 0, (HOST, self.port))
1645
1646 self.data2 = b'egg'
1647 self.cli.sendto(self.data2, 0, (HOST, self.port))
1648
1649 def testSelect(self):
1650 r, w, x = select.select([self.serv], [], [], 3.0)
1651 self.assertIn(self.serv, r)
1652 data, addr = self.serv.recvfrom(self.bufsize)
1653 self.assertEqual(self.data, data)
1654
1655 def _testSelect(self):
1656 self.data = b'select'
1657 self.cli.sendto(self.data, 0, (HOST, self.port))
1658
1659 def testCongestion(self):
1660 # wait until the sender is done
1661 self.evt.wait()
1662
1663 def _testCongestion(self):
1664 # test the behavior in case of congestion
1665 self.data = b'fill'
1666 self.cli.setblocking(False)
1667 try:
1668 # try to lower the receiver's socket buffer size
1669 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1670 except OSError:
1671 pass
1672 with self.assertRaises(OSError) as cm:
1673 try:
1674 # fill the receiver's socket buffer
1675 while True:
1676 self.cli.sendto(self.data, 0, (HOST, self.port))
1677 finally:
1678 # signal the receiver we're done
1679 self.evt.set()
1680 # sendto() should have failed with ENOBUFS
1681 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1682 # and we should have received a congestion notification through poll
1683 r, w, x = select.select([self.serv], [], [], 3.0)
1684 self.assertIn(self.serv, r)
1685
1686
Victor Stinner45df8202010-04-28 22:31:17 +00001687@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001688class BasicTCPTest(SocketConnectedTest):
1689
1690 def __init__(self, methodName='runTest'):
1691 SocketConnectedTest.__init__(self, methodName=methodName)
1692
1693 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001694 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001695 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001696 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001697
1698 def _testRecv(self):
1699 self.serv_conn.send(MSG)
1700
1701 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001702 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001703 seg1 = self.cli_conn.recv(len(MSG) - 3)
1704 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001705 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001706 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001707
1708 def _testOverFlowRecv(self):
1709 self.serv_conn.send(MSG)
1710
1711 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001712 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001713 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001714 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001715
1716 def _testRecvFrom(self):
1717 self.serv_conn.send(MSG)
1718
1719 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001720 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001721 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1722 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001723 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001724 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001725
1726 def _testOverFlowRecvFrom(self):
1727 self.serv_conn.send(MSG)
1728
1729 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001730 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001731 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001732 while 1:
1733 read = self.cli_conn.recv(1024)
1734 if not read:
1735 break
Guido van Rossume531e292002-08-08 20:28:34 +00001736 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001737 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001738
1739 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001740 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001741 self.serv_conn.sendall(big_chunk)
1742
1743 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001744 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001745 fd = self.cli_conn.fileno()
1746 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001747 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001748 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001749 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001750 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001751
1752 def _testFromFd(self):
1753 self.serv_conn.send(MSG)
1754
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001755 def testDup(self):
1756 # Testing dup()
1757 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001758 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001759 msg = sock.recv(1024)
1760 self.assertEqual(msg, MSG)
1761
1762 def _testDup(self):
1763 self.serv_conn.send(MSG)
1764
Guido van Rossum24e4af82002-06-12 19:18:08 +00001765 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001766 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001767 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001768 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001769 # wait for _testShutdown to finish: on OS X, when the server
1770 # closes the connection the client also becomes disconnected,
1771 # and the client's shutdown call will fail. (Issue #4397.)
1772 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001773
1774 def _testShutdown(self):
1775 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001776 self.serv_conn.shutdown(2)
1777
1778 testShutdown_overflow = support.cpython_only(testShutdown)
1779
1780 @support.cpython_only
1781 def _testShutdown_overflow(self):
1782 import _testcapi
1783 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001784 # Issue 15989
1785 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1786 _testcapi.INT_MAX + 1)
1787 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1788 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001789 self.serv_conn.shutdown(2)
1790
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001791 def testDetach(self):
1792 # Testing detach()
1793 fileno = self.cli_conn.fileno()
1794 f = self.cli_conn.detach()
1795 self.assertEqual(f, fileno)
1796 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001797 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001798 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001799 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001800 # ...but we can create another socket using the (still open)
1801 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001802 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001803 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001804 msg = sock.recv(1024)
1805 self.assertEqual(msg, MSG)
1806
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001807 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001808 self.serv_conn.send(MSG)
1809
Victor Stinner45df8202010-04-28 22:31:17 +00001810@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001811class BasicUDPTest(ThreadedUDPSocketTest):
1812
1813 def __init__(self, methodName='runTest'):
1814 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1815
1816 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001817 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001818 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001819 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001820
1821 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001822 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001823
Guido van Rossum1c938012002-06-12 21:17:20 +00001824 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001825 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001826 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001827 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001828
Guido van Rossum1c938012002-06-12 21:17:20 +00001829 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001830 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001831
Guido van Rossumd8faa362007-04-27 19:54:29 +00001832 def testRecvFromNegative(self):
1833 # Negative lengths passed to recvfrom should give ValueError.
1834 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1835
1836 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001837 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001838
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001839# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1840# same test code is used with different families and types of socket
1841# (e.g. stream, datagram), and tests using recvmsg() are repeated
1842# using recvmsg_into().
1843#
1844# The generic test classes such as SendmsgTests and
1845# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1846# supplied with sockets cli_sock and serv_sock representing the
1847# client's and the server's end of the connection respectively, and
1848# attributes cli_addr and serv_addr holding their (numeric where
1849# appropriate) addresses.
1850#
1851# The final concrete test classes combine these with subclasses of
1852# SocketTestBase which set up client and server sockets of a specific
1853# type, and with subclasses of SendrecvmsgBase such as
1854# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1855# sockets to cli_sock and serv_sock and override the methods and
1856# attributes of SendrecvmsgBase to fill in destination addresses if
1857# needed when sending, check for specific flags in msg_flags, etc.
1858#
1859# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1860# recvmsg_into().
1861
1862# XXX: like the other datagram (UDP) tests in this module, the code
1863# here assumes that datagram delivery on the local machine will be
1864# reliable.
1865
1866class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1867 # Base class for sendmsg()/recvmsg() tests.
1868
1869 # Time in seconds to wait before considering a test failed, or
1870 # None for no timeout. Not all tests actually set a timeout.
1871 fail_timeout = 3.0
1872
1873 def setUp(self):
1874 self.misc_event = threading.Event()
1875 super().setUp()
1876
1877 def sendToServer(self, msg):
1878 # Send msg to the server.
1879 return self.cli_sock.send(msg)
1880
1881 # Tuple of alternative default arguments for sendmsg() when called
1882 # via sendmsgToServer() (e.g. to include a destination address).
1883 sendmsg_to_server_defaults = ()
1884
1885 def sendmsgToServer(self, *args):
1886 # Call sendmsg() on self.cli_sock with the given arguments,
1887 # filling in any arguments which are not supplied with the
1888 # corresponding items of self.sendmsg_to_server_defaults, if
1889 # any.
1890 return self.cli_sock.sendmsg(
1891 *(args + self.sendmsg_to_server_defaults[len(args):]))
1892
1893 def doRecvmsg(self, sock, bufsize, *args):
1894 # Call recvmsg() on sock with given arguments and return its
1895 # result. Should be used for tests which can use either
1896 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1897 # this method with one which emulates it using recvmsg_into(),
1898 # thus allowing the same test to be used for both methods.
1899 result = sock.recvmsg(bufsize, *args)
1900 self.registerRecvmsgResult(result)
1901 return result
1902
1903 def registerRecvmsgResult(self, result):
1904 # Called by doRecvmsg() with the return value of recvmsg() or
1905 # recvmsg_into(). Can be overridden to arrange cleanup based
1906 # on the returned ancillary data, for instance.
1907 pass
1908
1909 def checkRecvmsgAddress(self, addr1, addr2):
1910 # Called to compare the received address with the address of
1911 # the peer.
1912 self.assertEqual(addr1, addr2)
1913
1914 # Flags that are normally unset in msg_flags
1915 msg_flags_common_unset = 0
1916 for name in ("MSG_CTRUNC", "MSG_OOB"):
1917 msg_flags_common_unset |= getattr(socket, name, 0)
1918
1919 # Flags that are normally set
1920 msg_flags_common_set = 0
1921
1922 # Flags set when a complete record has been received (e.g. MSG_EOR
1923 # for SCTP)
1924 msg_flags_eor_indicator = 0
1925
1926 # Flags set when a complete record has not been received
1927 # (e.g. MSG_TRUNC for datagram sockets)
1928 msg_flags_non_eor_indicator = 0
1929
1930 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1931 # Method to check the value of msg_flags returned by recvmsg[_into]().
1932 #
1933 # Checks that all bits in msg_flags_common_set attribute are
1934 # set in "flags" and all bits in msg_flags_common_unset are
1935 # unset.
1936 #
1937 # The "eor" argument specifies whether the flags should
1938 # indicate that a full record (or datagram) has been received.
1939 # If "eor" is None, no checks are done; otherwise, checks
1940 # that:
1941 #
1942 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1943 # set and all bits in msg_flags_non_eor_indicator are unset
1944 #
1945 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1946 # are set and all bits in msg_flags_eor_indicator are unset
1947 #
1948 # If "checkset" and/or "checkunset" are supplied, they require
1949 # the given bits to be set or unset respectively, overriding
1950 # what the attributes require for those bits.
1951 #
1952 # If any bits are set in "ignore", they will not be checked,
1953 # regardless of the other inputs.
1954 #
1955 # Will raise Exception if the inputs require a bit to be both
1956 # set and unset, and it is not ignored.
1957
1958 defaultset = self.msg_flags_common_set
1959 defaultunset = self.msg_flags_common_unset
1960
1961 if eor:
1962 defaultset |= self.msg_flags_eor_indicator
1963 defaultunset |= self.msg_flags_non_eor_indicator
1964 elif eor is not None:
1965 defaultset |= self.msg_flags_non_eor_indicator
1966 defaultunset |= self.msg_flags_eor_indicator
1967
1968 # Function arguments override defaults
1969 defaultset &= ~checkunset
1970 defaultunset &= ~checkset
1971
1972 # Merge arguments with remaining defaults, and check for conflicts
1973 checkset |= defaultset
1974 checkunset |= defaultunset
1975 inboth = checkset & checkunset & ~ignore
1976 if inboth:
1977 raise Exception("contradictory set, unset requirements for flags "
1978 "{0:#x}".format(inboth))
1979
1980 # Compare with given msg_flags value
1981 mask = (checkset | checkunset) & ~ignore
1982 self.assertEqual(flags & mask, checkset & mask)
1983
1984
1985class RecvmsgIntoMixin(SendrecvmsgBase):
1986 # Mixin to implement doRecvmsg() using recvmsg_into().
1987
1988 def doRecvmsg(self, sock, bufsize, *args):
1989 buf = bytearray(bufsize)
1990 result = sock.recvmsg_into([buf], *args)
1991 self.registerRecvmsgResult(result)
1992 self.assertGreaterEqual(result[0], 0)
1993 self.assertLessEqual(result[0], bufsize)
1994 return (bytes(buf[:result[0]]),) + result[1:]
1995
1996
1997class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1998 # Defines flags to be checked in msg_flags for datagram sockets.
1999
2000 @property
2001 def msg_flags_non_eor_indicator(self):
2002 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2003
2004
2005class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2006 # Defines flags to be checked in msg_flags for SCTP sockets.
2007
2008 @property
2009 def msg_flags_eor_indicator(self):
2010 return super().msg_flags_eor_indicator | socket.MSG_EOR
2011
2012
2013class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2014 # Base class for tests on connectionless-mode sockets. Users must
2015 # supply sockets on attributes cli and serv to be mapped to
2016 # cli_sock and serv_sock respectively.
2017
2018 @property
2019 def serv_sock(self):
2020 return self.serv
2021
2022 @property
2023 def cli_sock(self):
2024 return self.cli
2025
2026 @property
2027 def sendmsg_to_server_defaults(self):
2028 return ([], [], 0, self.serv_addr)
2029
2030 def sendToServer(self, msg):
2031 return self.cli_sock.sendto(msg, self.serv_addr)
2032
2033
2034class SendrecvmsgConnectedBase(SendrecvmsgBase):
2035 # Base class for tests on connected sockets. Users must supply
2036 # sockets on attributes serv_conn and cli_conn (representing the
2037 # connections *to* the server and the client), to be mapped to
2038 # cli_sock and serv_sock respectively.
2039
2040 @property
2041 def serv_sock(self):
2042 return self.cli_conn
2043
2044 @property
2045 def cli_sock(self):
2046 return self.serv_conn
2047
2048 def checkRecvmsgAddress(self, addr1, addr2):
2049 # Address is currently "unspecified" for a connected socket,
2050 # so we don't examine it
2051 pass
2052
2053
2054class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2055 # Base class to set a timeout on server's socket.
2056
2057 def setUp(self):
2058 super().setUp()
2059 self.serv_sock.settimeout(self.fail_timeout)
2060
2061
2062class SendmsgTests(SendrecvmsgServerTimeoutBase):
2063 # Tests for sendmsg() which can use any socket type and do not
2064 # involve recvmsg() or recvmsg_into().
2065
2066 def testSendmsg(self):
2067 # Send a simple message with sendmsg().
2068 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2069
2070 def _testSendmsg(self):
2071 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2072
2073 def testSendmsgDataGenerator(self):
2074 # Send from buffer obtained from a generator (not a sequence).
2075 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2076
2077 def _testSendmsgDataGenerator(self):
2078 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2079 len(MSG))
2080
2081 def testSendmsgAncillaryGenerator(self):
2082 # Gather (empty) ancillary data from a generator.
2083 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2084
2085 def _testSendmsgAncillaryGenerator(self):
2086 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2087 len(MSG))
2088
2089 def testSendmsgArray(self):
2090 # Send data from an array instead of the usual bytes object.
2091 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2092
2093 def _testSendmsgArray(self):
2094 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2095 len(MSG))
2096
2097 def testSendmsgGather(self):
2098 # Send message data from more than one buffer (gather write).
2099 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2100
2101 def _testSendmsgGather(self):
2102 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2103
2104 def testSendmsgBadArgs(self):
2105 # Check that sendmsg() rejects invalid arguments.
2106 self.assertEqual(self.serv_sock.recv(1000), b"done")
2107
2108 def _testSendmsgBadArgs(self):
2109 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2110 self.assertRaises(TypeError, self.sendmsgToServer,
2111 b"not in an iterable")
2112 self.assertRaises(TypeError, self.sendmsgToServer,
2113 object())
2114 self.assertRaises(TypeError, self.sendmsgToServer,
2115 [object()])
2116 self.assertRaises(TypeError, self.sendmsgToServer,
2117 [MSG, object()])
2118 self.assertRaises(TypeError, self.sendmsgToServer,
2119 [MSG], object())
2120 self.assertRaises(TypeError, self.sendmsgToServer,
2121 [MSG], [], object())
2122 self.assertRaises(TypeError, self.sendmsgToServer,
2123 [MSG], [], 0, object())
2124 self.sendToServer(b"done")
2125
2126 def testSendmsgBadCmsg(self):
2127 # Check that invalid ancillary data items are rejected.
2128 self.assertEqual(self.serv_sock.recv(1000), b"done")
2129
2130 def _testSendmsgBadCmsg(self):
2131 self.assertRaises(TypeError, self.sendmsgToServer,
2132 [MSG], [object()])
2133 self.assertRaises(TypeError, self.sendmsgToServer,
2134 [MSG], [(object(), 0, b"data")])
2135 self.assertRaises(TypeError, self.sendmsgToServer,
2136 [MSG], [(0, object(), b"data")])
2137 self.assertRaises(TypeError, self.sendmsgToServer,
2138 [MSG], [(0, 0, object())])
2139 self.assertRaises(TypeError, self.sendmsgToServer,
2140 [MSG], [(0, 0)])
2141 self.assertRaises(TypeError, self.sendmsgToServer,
2142 [MSG], [(0, 0, b"data", 42)])
2143 self.sendToServer(b"done")
2144
2145 @requireAttrs(socket, "CMSG_SPACE")
2146 def testSendmsgBadMultiCmsg(self):
2147 # Check that invalid ancillary data items are rejected when
2148 # more than one item is present.
2149 self.assertEqual(self.serv_sock.recv(1000), b"done")
2150
2151 @testSendmsgBadMultiCmsg.client_skip
2152 def _testSendmsgBadMultiCmsg(self):
2153 self.assertRaises(TypeError, self.sendmsgToServer,
2154 [MSG], [0, 0, b""])
2155 self.assertRaises(TypeError, self.sendmsgToServer,
2156 [MSG], [(0, 0, b""), object()])
2157 self.sendToServer(b"done")
2158
2159 def testSendmsgExcessCmsgReject(self):
2160 # Check that sendmsg() rejects excess ancillary data items
2161 # when the number that can be sent is limited.
2162 self.assertEqual(self.serv_sock.recv(1000), b"done")
2163
2164 def _testSendmsgExcessCmsgReject(self):
2165 if not hasattr(socket, "CMSG_SPACE"):
2166 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002167 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002168 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2169 self.assertIsNone(cm.exception.errno)
2170 self.sendToServer(b"done")
2171
2172 def testSendmsgAfterClose(self):
2173 # Check that sendmsg() fails on a closed socket.
2174 pass
2175
2176 def _testSendmsgAfterClose(self):
2177 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002178 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002179
2180
2181class SendmsgStreamTests(SendmsgTests):
2182 # Tests for sendmsg() which require a stream socket and do not
2183 # involve recvmsg() or recvmsg_into().
2184
2185 def testSendmsgExplicitNoneAddr(self):
2186 # Check that peer address can be specified as None.
2187 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2188
2189 def _testSendmsgExplicitNoneAddr(self):
2190 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2191
2192 def testSendmsgTimeout(self):
2193 # Check that timeout works with sendmsg().
2194 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2195 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2196
2197 def _testSendmsgTimeout(self):
2198 try:
2199 self.cli_sock.settimeout(0.03)
2200 with self.assertRaises(socket.timeout):
2201 while True:
2202 self.sendmsgToServer([b"a"*512])
2203 finally:
2204 self.misc_event.set()
2205
2206 # XXX: would be nice to have more tests for sendmsg flags argument.
2207
2208 # Linux supports MSG_DONTWAIT when sending, but in general, it
2209 # only works when receiving. Could add other platforms if they
2210 # support it too.
2211 @skipWithClientIf(sys.platform not in {"linux2"},
2212 "MSG_DONTWAIT not known to work on this platform when "
2213 "sending")
2214 def testSendmsgDontWait(self):
2215 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2216 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2217 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2218
2219 @testSendmsgDontWait.client_skip
2220 def _testSendmsgDontWait(self):
2221 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002222 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002223 while True:
2224 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2225 self.assertIn(cm.exception.errno,
2226 (errno.EAGAIN, errno.EWOULDBLOCK))
2227 finally:
2228 self.misc_event.set()
2229
2230
2231class SendmsgConnectionlessTests(SendmsgTests):
2232 # Tests for sendmsg() which require a connectionless-mode
2233 # (e.g. datagram) socket, and do not involve recvmsg() or
2234 # recvmsg_into().
2235
2236 def testSendmsgNoDestAddr(self):
2237 # Check that sendmsg() fails when no destination address is
2238 # given for unconnected socket.
2239 pass
2240
2241 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002242 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002243 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002244 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002245 [MSG], [], 0, None)
2246
2247
2248class RecvmsgGenericTests(SendrecvmsgBase):
2249 # Tests for recvmsg() which can also be emulated using
2250 # recvmsg_into(), and can use any socket type.
2251
2252 def testRecvmsg(self):
2253 # Receive a simple message with recvmsg[_into]().
2254 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
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 _testRecvmsg(self):
2261 self.sendToServer(MSG)
2262
2263 def testRecvmsgExplicitDefaults(self):
2264 # Test recvmsg[_into]() with default arguments provided explicitly.
2265 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2266 len(MSG), 0, 0)
2267 self.assertEqual(msg, MSG)
2268 self.checkRecvmsgAddress(addr, self.cli_addr)
2269 self.assertEqual(ancdata, [])
2270 self.checkFlags(flags, eor=True)
2271
2272 def _testRecvmsgExplicitDefaults(self):
2273 self.sendToServer(MSG)
2274
2275 def testRecvmsgShorter(self):
2276 # Receive a message smaller than buffer.
2277 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2278 len(MSG) + 42)
2279 self.assertEqual(msg, MSG)
2280 self.checkRecvmsgAddress(addr, self.cli_addr)
2281 self.assertEqual(ancdata, [])
2282 self.checkFlags(flags, eor=True)
2283
2284 def _testRecvmsgShorter(self):
2285 self.sendToServer(MSG)
2286
Charles-François Natali8619cd72011-10-03 19:43:15 +02002287 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2288 # datagram is received (issue #13001).
2289 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002290 def testRecvmsgTrunc(self):
2291 # Receive part of message, check for truncation indicators.
2292 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2293 len(MSG) - 3)
2294 self.assertEqual(msg, MSG[:-3])
2295 self.checkRecvmsgAddress(addr, self.cli_addr)
2296 self.assertEqual(ancdata, [])
2297 self.checkFlags(flags, eor=False)
2298
Charles-François Natali8619cd72011-10-03 19:43:15 +02002299 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002300 def _testRecvmsgTrunc(self):
2301 self.sendToServer(MSG)
2302
2303 def testRecvmsgShortAncillaryBuf(self):
2304 # Test ancillary data buffer too small to hold any ancillary data.
2305 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2306 len(MSG), 1)
2307 self.assertEqual(msg, MSG)
2308 self.checkRecvmsgAddress(addr, self.cli_addr)
2309 self.assertEqual(ancdata, [])
2310 self.checkFlags(flags, eor=True)
2311
2312 def _testRecvmsgShortAncillaryBuf(self):
2313 self.sendToServer(MSG)
2314
2315 def testRecvmsgLongAncillaryBuf(self):
2316 # Test large ancillary data buffer.
2317 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2318 len(MSG), 10240)
2319 self.assertEqual(msg, MSG)
2320 self.checkRecvmsgAddress(addr, self.cli_addr)
2321 self.assertEqual(ancdata, [])
2322 self.checkFlags(flags, eor=True)
2323
2324 def _testRecvmsgLongAncillaryBuf(self):
2325 self.sendToServer(MSG)
2326
2327 def testRecvmsgAfterClose(self):
2328 # Check that recvmsg[_into]() fails on a closed socket.
2329 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002330 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002331
2332 def _testRecvmsgAfterClose(self):
2333 pass
2334
2335 def testRecvmsgTimeout(self):
2336 # Check that timeout works.
2337 try:
2338 self.serv_sock.settimeout(0.03)
2339 self.assertRaises(socket.timeout,
2340 self.doRecvmsg, self.serv_sock, len(MSG))
2341 finally:
2342 self.misc_event.set()
2343
2344 def _testRecvmsgTimeout(self):
2345 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2346
2347 @requireAttrs(socket, "MSG_PEEK")
2348 def testRecvmsgPeek(self):
2349 # Check that MSG_PEEK in flags enables examination of pending
2350 # data without consuming it.
2351
2352 # Receive part of data with MSG_PEEK.
2353 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2354 len(MSG) - 3, 0,
2355 socket.MSG_PEEK)
2356 self.assertEqual(msg, MSG[:-3])
2357 self.checkRecvmsgAddress(addr, self.cli_addr)
2358 self.assertEqual(ancdata, [])
2359 # Ignoring MSG_TRUNC here (so this test is the same for stream
2360 # and datagram sockets). Some wording in POSIX seems to
2361 # suggest that it needn't be set when peeking, but that may
2362 # just be a slip.
2363 self.checkFlags(flags, eor=False,
2364 ignore=getattr(socket, "MSG_TRUNC", 0))
2365
2366 # Receive all data with MSG_PEEK.
2367 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2368 len(MSG), 0,
2369 socket.MSG_PEEK)
2370 self.assertEqual(msg, MSG)
2371 self.checkRecvmsgAddress(addr, self.cli_addr)
2372 self.assertEqual(ancdata, [])
2373 self.checkFlags(flags, eor=True)
2374
2375 # Check that the same data can still be received normally.
2376 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2377 self.assertEqual(msg, MSG)
2378 self.checkRecvmsgAddress(addr, self.cli_addr)
2379 self.assertEqual(ancdata, [])
2380 self.checkFlags(flags, eor=True)
2381
2382 @testRecvmsgPeek.client_skip
2383 def _testRecvmsgPeek(self):
2384 self.sendToServer(MSG)
2385
2386 @requireAttrs(socket.socket, "sendmsg")
2387 def testRecvmsgFromSendmsg(self):
2388 # Test receiving with recvmsg[_into]() when message is sent
2389 # using sendmsg().
2390 self.serv_sock.settimeout(self.fail_timeout)
2391 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2392 self.assertEqual(msg, MSG)
2393 self.checkRecvmsgAddress(addr, self.cli_addr)
2394 self.assertEqual(ancdata, [])
2395 self.checkFlags(flags, eor=True)
2396
2397 @testRecvmsgFromSendmsg.client_skip
2398 def _testRecvmsgFromSendmsg(self):
2399 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2400
2401
2402class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2403 # Tests which require a stream socket and can use either recvmsg()
2404 # or recvmsg_into().
2405
2406 def testRecvmsgEOF(self):
2407 # Receive end-of-stream indicator (b"", peer socket closed).
2408 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2409 self.assertEqual(msg, b"")
2410 self.checkRecvmsgAddress(addr, self.cli_addr)
2411 self.assertEqual(ancdata, [])
2412 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2413
2414 def _testRecvmsgEOF(self):
2415 self.cli_sock.close()
2416
2417 def testRecvmsgOverflow(self):
2418 # Receive a message in more than one chunk.
2419 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2420 len(MSG) - 3)
2421 self.checkRecvmsgAddress(addr, self.cli_addr)
2422 self.assertEqual(ancdata, [])
2423 self.checkFlags(flags, eor=False)
2424
2425 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2426 self.checkRecvmsgAddress(addr, self.cli_addr)
2427 self.assertEqual(ancdata, [])
2428 self.checkFlags(flags, eor=True)
2429
2430 msg = seg1 + seg2
2431 self.assertEqual(msg, MSG)
2432
2433 def _testRecvmsgOverflow(self):
2434 self.sendToServer(MSG)
2435
2436
2437class RecvmsgTests(RecvmsgGenericTests):
2438 # Tests for recvmsg() which can use any socket type.
2439
2440 def testRecvmsgBadArgs(self):
2441 # Check that recvmsg() rejects invalid arguments.
2442 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2443 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2444 -1, 0, 0)
2445 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2446 len(MSG), -1, 0)
2447 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2448 [bytearray(10)], 0, 0)
2449 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2450 object(), 0, 0)
2451 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2452 len(MSG), object(), 0)
2453 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2454 len(MSG), 0, object())
2455
2456 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2457 self.assertEqual(msg, MSG)
2458 self.checkRecvmsgAddress(addr, self.cli_addr)
2459 self.assertEqual(ancdata, [])
2460 self.checkFlags(flags, eor=True)
2461
2462 def _testRecvmsgBadArgs(self):
2463 self.sendToServer(MSG)
2464
2465
2466class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2467 # Tests for recvmsg_into() which can use any socket type.
2468
2469 def testRecvmsgIntoBadArgs(self):
2470 # Check that recvmsg_into() rejects invalid arguments.
2471 buf = bytearray(len(MSG))
2472 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2473 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2474 len(MSG), 0, 0)
2475 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2476 buf, 0, 0)
2477 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2478 [object()], 0, 0)
2479 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2480 [b"I'm not writable"], 0, 0)
2481 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2482 [buf, object()], 0, 0)
2483 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2484 [buf], -1, 0)
2485 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2486 [buf], object(), 0)
2487 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2488 [buf], 0, object())
2489
2490 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2491 self.assertEqual(nbytes, len(MSG))
2492 self.assertEqual(buf, bytearray(MSG))
2493 self.checkRecvmsgAddress(addr, self.cli_addr)
2494 self.assertEqual(ancdata, [])
2495 self.checkFlags(flags, eor=True)
2496
2497 def _testRecvmsgIntoBadArgs(self):
2498 self.sendToServer(MSG)
2499
2500 def testRecvmsgIntoGenerator(self):
2501 # Receive into buffer obtained from a generator (not a sequence).
2502 buf = bytearray(len(MSG))
2503 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2504 (o for o in [buf]))
2505 self.assertEqual(nbytes, len(MSG))
2506 self.assertEqual(buf, bytearray(MSG))
2507 self.checkRecvmsgAddress(addr, self.cli_addr)
2508 self.assertEqual(ancdata, [])
2509 self.checkFlags(flags, eor=True)
2510
2511 def _testRecvmsgIntoGenerator(self):
2512 self.sendToServer(MSG)
2513
2514 def testRecvmsgIntoArray(self):
2515 # Receive into an array rather than the usual bytearray.
2516 buf = array.array("B", [0] * len(MSG))
2517 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2518 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002519 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002520 self.checkRecvmsgAddress(addr, self.cli_addr)
2521 self.assertEqual(ancdata, [])
2522 self.checkFlags(flags, eor=True)
2523
2524 def _testRecvmsgIntoArray(self):
2525 self.sendToServer(MSG)
2526
2527 def testRecvmsgIntoScatter(self):
2528 # Receive into multiple buffers (scatter write).
2529 b1 = bytearray(b"----")
2530 b2 = bytearray(b"0123456789")
2531 b3 = bytearray(b"--------------")
2532 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2533 [b1, memoryview(b2)[2:9], b3])
2534 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2535 self.assertEqual(b1, bytearray(b"Mary"))
2536 self.assertEqual(b2, bytearray(b"01 had a 9"))
2537 self.assertEqual(b3, bytearray(b"little lamb---"))
2538 self.checkRecvmsgAddress(addr, self.cli_addr)
2539 self.assertEqual(ancdata, [])
2540 self.checkFlags(flags, eor=True)
2541
2542 def _testRecvmsgIntoScatter(self):
2543 self.sendToServer(b"Mary had a little lamb")
2544
2545
2546class CmsgMacroTests(unittest.TestCase):
2547 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2548 # assumptions used by sendmsg() and recvmsg[_into](), which share
2549 # code with these functions.
2550
2551 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002552 try:
2553 import _testcapi
2554 except ImportError:
2555 socklen_t_limit = 0x7fffffff
2556 else:
2557 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002558
2559 @requireAttrs(socket, "CMSG_LEN")
2560 def testCMSG_LEN(self):
2561 # Test CMSG_LEN() with various valid and invalid values,
2562 # checking the assumptions used by recvmsg() and sendmsg().
2563 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2564 values = list(range(257)) + list(range(toobig - 257, toobig))
2565
2566 # struct cmsghdr has at least three members, two of which are ints
2567 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2568 for n in values:
2569 ret = socket.CMSG_LEN(n)
2570 # This is how recvmsg() calculates the data size
2571 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2572 self.assertLessEqual(ret, self.socklen_t_limit)
2573
2574 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2575 # sendmsg() shares code with these functions, and requires
2576 # that it reject values over the limit.
2577 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2578 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2579
2580 @requireAttrs(socket, "CMSG_SPACE")
2581 def testCMSG_SPACE(self):
2582 # Test CMSG_SPACE() with various valid and invalid values,
2583 # checking the assumptions used by sendmsg().
2584 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2585 values = list(range(257)) + list(range(toobig - 257, toobig))
2586
2587 last = socket.CMSG_SPACE(0)
2588 # struct cmsghdr has at least three members, two of which are ints
2589 self.assertGreater(last, array.array("i").itemsize * 2)
2590 for n in values:
2591 ret = socket.CMSG_SPACE(n)
2592 self.assertGreaterEqual(ret, last)
2593 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2594 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2595 self.assertLessEqual(ret, self.socklen_t_limit)
2596 last = ret
2597
2598 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2599 # sendmsg() shares code with these functions, and requires
2600 # that it reject values over the limit.
2601 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2602 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2603
2604
2605class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2606 # Tests for file descriptor passing on Unix-domain sockets.
2607
2608 # Invalid file descriptor value that's unlikely to evaluate to a
2609 # real FD even if one of its bytes is replaced with a different
2610 # value (which shouldn't actually happen).
2611 badfd = -0x5555
2612
2613 def newFDs(self, n):
2614 # Return a list of n file descriptors for newly-created files
2615 # containing their list indices as ASCII numbers.
2616 fds = []
2617 for i in range(n):
2618 fd, path = tempfile.mkstemp()
2619 self.addCleanup(os.unlink, path)
2620 self.addCleanup(os.close, fd)
2621 os.write(fd, str(i).encode())
2622 fds.append(fd)
2623 return fds
2624
2625 def checkFDs(self, fds):
2626 # Check that the file descriptors in the given list contain
2627 # their correct list indices as ASCII numbers.
2628 for n, fd in enumerate(fds):
2629 os.lseek(fd, 0, os.SEEK_SET)
2630 self.assertEqual(os.read(fd, 1024), str(n).encode())
2631
2632 def registerRecvmsgResult(self, result):
2633 self.addCleanup(self.closeRecvmsgFDs, result)
2634
2635 def closeRecvmsgFDs(self, recvmsg_result):
2636 # Close all file descriptors specified in the ancillary data
2637 # of the given return value from recvmsg() or recvmsg_into().
2638 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2639 if (cmsg_level == socket.SOL_SOCKET and
2640 cmsg_type == socket.SCM_RIGHTS):
2641 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002642 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002643 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2644 for fd in fds:
2645 os.close(fd)
2646
2647 def createAndSendFDs(self, n):
2648 # Send n new file descriptors created by newFDs() to the
2649 # server, with the constant MSG as the non-ancillary data.
2650 self.assertEqual(
2651 self.sendmsgToServer([MSG],
2652 [(socket.SOL_SOCKET,
2653 socket.SCM_RIGHTS,
2654 array.array("i", self.newFDs(n)))]),
2655 len(MSG))
2656
2657 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2658 # Check that constant MSG was received with numfds file
2659 # descriptors in a maximum of maxcmsgs control messages (which
2660 # must contain only complete integers). By default, check
2661 # that MSG_CTRUNC is unset, but ignore any flags in
2662 # ignoreflags.
2663 msg, ancdata, flags, addr = result
2664 self.assertEqual(msg, MSG)
2665 self.checkRecvmsgAddress(addr, self.cli_addr)
2666 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2667 ignore=ignoreflags)
2668
2669 self.assertIsInstance(ancdata, list)
2670 self.assertLessEqual(len(ancdata), maxcmsgs)
2671 fds = array.array("i")
2672 for item in ancdata:
2673 self.assertIsInstance(item, tuple)
2674 cmsg_level, cmsg_type, cmsg_data = item
2675 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2676 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2677 self.assertIsInstance(cmsg_data, bytes)
2678 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002679 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002680
2681 self.assertEqual(len(fds), numfds)
2682 self.checkFDs(fds)
2683
2684 def testFDPassSimple(self):
2685 # Pass a single FD (array read from bytes object).
2686 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2687 len(MSG), 10240))
2688
2689 def _testFDPassSimple(self):
2690 self.assertEqual(
2691 self.sendmsgToServer(
2692 [MSG],
2693 [(socket.SOL_SOCKET,
2694 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002695 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002696 len(MSG))
2697
2698 def testMultipleFDPass(self):
2699 # Pass multiple FDs in a single array.
2700 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2701 len(MSG), 10240))
2702
2703 def _testMultipleFDPass(self):
2704 self.createAndSendFDs(4)
2705
2706 @requireAttrs(socket, "CMSG_SPACE")
2707 def testFDPassCMSG_SPACE(self):
2708 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2709 self.checkRecvmsgFDs(
2710 4, self.doRecvmsg(self.serv_sock, len(MSG),
2711 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2712
2713 @testFDPassCMSG_SPACE.client_skip
2714 def _testFDPassCMSG_SPACE(self):
2715 self.createAndSendFDs(4)
2716
2717 def testFDPassCMSG_LEN(self):
2718 # Test using CMSG_LEN() to calculate ancillary buffer size.
2719 self.checkRecvmsgFDs(1,
2720 self.doRecvmsg(self.serv_sock, len(MSG),
2721 socket.CMSG_LEN(4 * SIZEOF_INT)),
2722 # RFC 3542 says implementations may set
2723 # MSG_CTRUNC if there isn't enough space
2724 # for trailing padding.
2725 ignoreflags=socket.MSG_CTRUNC)
2726
2727 def _testFDPassCMSG_LEN(self):
2728 self.createAndSendFDs(1)
2729
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002730 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002731 @requireAttrs(socket, "CMSG_SPACE")
2732 def testFDPassSeparate(self):
2733 # Pass two FDs in two separate arrays. Arrays may be combined
2734 # into a single control message by the OS.
2735 self.checkRecvmsgFDs(2,
2736 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2737 maxcmsgs=2)
2738
2739 @testFDPassSeparate.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 _testFDPassSeparate(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
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002752 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002753 @requireAttrs(socket, "CMSG_SPACE")
2754 def testFDPassSeparateMinSpace(self):
2755 # Pass two FDs in two separate arrays, receiving them into the
2756 # minimum space for two arrays.
2757 self.checkRecvmsgFDs(2,
2758 self.doRecvmsg(self.serv_sock, len(MSG),
2759 socket.CMSG_SPACE(SIZEOF_INT) +
2760 socket.CMSG_LEN(SIZEOF_INT)),
2761 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2762
2763 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002764 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002765 def _testFDPassSeparateMinSpace(self):
2766 fd0, fd1 = self.newFDs(2)
2767 self.assertEqual(
2768 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2769 socket.SCM_RIGHTS,
2770 array.array("i", [fd0])),
2771 (socket.SOL_SOCKET,
2772 socket.SCM_RIGHTS,
2773 array.array("i", [fd1]))]),
2774 len(MSG))
2775
2776 def sendAncillaryIfPossible(self, msg, ancdata):
2777 # Try to send msg and ancdata to server, but if the system
2778 # call fails, just send msg with no ancillary data.
2779 try:
2780 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002781 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002782 # Check that it was the system call that failed
2783 self.assertIsInstance(e.errno, int)
2784 nbytes = self.sendmsgToServer([msg])
2785 self.assertEqual(nbytes, len(msg))
2786
2787 def testFDPassEmpty(self):
2788 # Try to pass an empty FD array. Can receive either no array
2789 # or an empty array.
2790 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2791 len(MSG), 10240),
2792 ignoreflags=socket.MSG_CTRUNC)
2793
2794 def _testFDPassEmpty(self):
2795 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2796 socket.SCM_RIGHTS,
2797 b"")])
2798
2799 def testFDPassPartialInt(self):
2800 # Try to pass a truncated FD array.
2801 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2802 len(MSG), 10240)
2803 self.assertEqual(msg, MSG)
2804 self.checkRecvmsgAddress(addr, self.cli_addr)
2805 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2806 self.assertLessEqual(len(ancdata), 1)
2807 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2808 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2809 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2810 self.assertLess(len(cmsg_data), SIZEOF_INT)
2811
2812 def _testFDPassPartialInt(self):
2813 self.sendAncillaryIfPossible(
2814 MSG,
2815 [(socket.SOL_SOCKET,
2816 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002817 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002818
2819 @requireAttrs(socket, "CMSG_SPACE")
2820 def testFDPassPartialIntInMiddle(self):
2821 # Try to pass two FD arrays, the first of which is truncated.
2822 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2823 len(MSG), 10240)
2824 self.assertEqual(msg, MSG)
2825 self.checkRecvmsgAddress(addr, self.cli_addr)
2826 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2827 self.assertLessEqual(len(ancdata), 2)
2828 fds = array.array("i")
2829 # Arrays may have been combined in a single control message
2830 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2831 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2832 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002833 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002834 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2835 self.assertLessEqual(len(fds), 2)
2836 self.checkFDs(fds)
2837
2838 @testFDPassPartialIntInMiddle.client_skip
2839 def _testFDPassPartialIntInMiddle(self):
2840 fd0, fd1 = self.newFDs(2)
2841 self.sendAncillaryIfPossible(
2842 MSG,
2843 [(socket.SOL_SOCKET,
2844 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002845 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002846 (socket.SOL_SOCKET,
2847 socket.SCM_RIGHTS,
2848 array.array("i", [fd1]))])
2849
2850 def checkTruncatedHeader(self, result, ignoreflags=0):
2851 # Check that no ancillary data items are returned when data is
2852 # truncated inside the cmsghdr structure.
2853 msg, ancdata, flags, addr = result
2854 self.assertEqual(msg, MSG)
2855 self.checkRecvmsgAddress(addr, self.cli_addr)
2856 self.assertEqual(ancdata, [])
2857 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2858 ignore=ignoreflags)
2859
2860 def testCmsgTruncNoBufSize(self):
2861 # Check that no ancillary data is received when no buffer size
2862 # is specified.
2863 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2864 # BSD seems to set MSG_CTRUNC only
2865 # if an item has been partially
2866 # received.
2867 ignoreflags=socket.MSG_CTRUNC)
2868
2869 def _testCmsgTruncNoBufSize(self):
2870 self.createAndSendFDs(1)
2871
2872 def testCmsgTrunc0(self):
2873 # Check that no ancillary data is received when buffer size is 0.
2874 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2875 ignoreflags=socket.MSG_CTRUNC)
2876
2877 def _testCmsgTrunc0(self):
2878 self.createAndSendFDs(1)
2879
2880 # Check that no ancillary data is returned for various non-zero
2881 # (but still too small) buffer sizes.
2882
2883 def testCmsgTrunc1(self):
2884 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2885
2886 def _testCmsgTrunc1(self):
2887 self.createAndSendFDs(1)
2888
2889 def testCmsgTrunc2Int(self):
2890 # The cmsghdr structure has at least three members, two of
2891 # which are ints, so we still shouldn't see any ancillary
2892 # data.
2893 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2894 SIZEOF_INT * 2))
2895
2896 def _testCmsgTrunc2Int(self):
2897 self.createAndSendFDs(1)
2898
2899 def testCmsgTruncLen0Minus1(self):
2900 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2901 socket.CMSG_LEN(0) - 1))
2902
2903 def _testCmsgTruncLen0Minus1(self):
2904 self.createAndSendFDs(1)
2905
2906 # The following tests try to truncate the control message in the
2907 # middle of the FD array.
2908
2909 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2910 # Check that file descriptor data is truncated to between
2911 # mindata and maxdata bytes when received with buffer size
2912 # ancbuf, and that any complete file descriptor numbers are
2913 # valid.
2914 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2915 len(MSG), ancbuf)
2916 self.assertEqual(msg, MSG)
2917 self.checkRecvmsgAddress(addr, self.cli_addr)
2918 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2919
2920 if mindata == 0 and ancdata == []:
2921 return
2922 self.assertEqual(len(ancdata), 1)
2923 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2924 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2925 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2926 self.assertGreaterEqual(len(cmsg_data), mindata)
2927 self.assertLessEqual(len(cmsg_data), maxdata)
2928 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002929 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002930 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2931 self.checkFDs(fds)
2932
2933 def testCmsgTruncLen0(self):
2934 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2935
2936 def _testCmsgTruncLen0(self):
2937 self.createAndSendFDs(1)
2938
2939 def testCmsgTruncLen0Plus1(self):
2940 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2941
2942 def _testCmsgTruncLen0Plus1(self):
2943 self.createAndSendFDs(2)
2944
2945 def testCmsgTruncLen1(self):
2946 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2947 maxdata=SIZEOF_INT)
2948
2949 def _testCmsgTruncLen1(self):
2950 self.createAndSendFDs(2)
2951
2952 def testCmsgTruncLen2Minus1(self):
2953 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2954 maxdata=(2 * SIZEOF_INT) - 1)
2955
2956 def _testCmsgTruncLen2Minus1(self):
2957 self.createAndSendFDs(2)
2958
2959
2960class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2961 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2962 # features of the RFC 3542 Advanced Sockets API for IPv6.
2963 # Currently we can only handle certain data items (e.g. traffic
2964 # class, hop limit, MTU discovery and fragmentation settings)
2965 # without resorting to unportable means such as the struct module,
2966 # but the tests here are aimed at testing the ancillary data
2967 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2968 # itself.
2969
2970 # Test value to use when setting hop limit of packet
2971 hop_limit = 2
2972
2973 # Test value to use when setting traffic class of packet.
2974 # -1 means "use kernel default".
2975 traffic_class = -1
2976
2977 def ancillaryMapping(self, ancdata):
2978 # Given ancillary data list ancdata, return a mapping from
2979 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2980 # Check that no (level, type) pair appears more than once.
2981 d = {}
2982 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2983 self.assertNotIn((cmsg_level, cmsg_type), d)
2984 d[(cmsg_level, cmsg_type)] = cmsg_data
2985 return d
2986
2987 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2988 # Receive hop limit into ancbufsize bytes of ancillary data
2989 # space. Check that data is MSG, ancillary data is not
2990 # truncated (but ignore any flags in ignoreflags), and hop
2991 # limit is between 0 and maxhop inclusive.
2992 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2993 socket.IPV6_RECVHOPLIMIT, 1)
2994 self.misc_event.set()
2995 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2996 len(MSG), ancbufsize)
2997
2998 self.assertEqual(msg, MSG)
2999 self.checkRecvmsgAddress(addr, self.cli_addr)
3000 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3001 ignore=ignoreflags)
3002
3003 self.assertEqual(len(ancdata), 1)
3004 self.assertIsInstance(ancdata[0], tuple)
3005 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3006 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3007 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3008 self.assertIsInstance(cmsg_data, bytes)
3009 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3010 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003011 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003012 self.assertGreaterEqual(a[0], 0)
3013 self.assertLessEqual(a[0], maxhop)
3014
3015 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3016 def testRecvHopLimit(self):
3017 # Test receiving the packet hop limit as ancillary data.
3018 self.checkHopLimit(ancbufsize=10240)
3019
3020 @testRecvHopLimit.client_skip
3021 def _testRecvHopLimit(self):
3022 # Need to wait until server has asked to receive ancillary
3023 # data, as implementations are not required to buffer it
3024 # otherwise.
3025 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3026 self.sendToServer(MSG)
3027
3028 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3029 def testRecvHopLimitCMSG_SPACE(self):
3030 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3031 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3032
3033 @testRecvHopLimitCMSG_SPACE.client_skip
3034 def _testRecvHopLimitCMSG_SPACE(self):
3035 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3036 self.sendToServer(MSG)
3037
3038 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3039 # 3542 says portable applications must provide space for trailing
3040 # padding. Implementations may set MSG_CTRUNC if there isn't
3041 # enough space for the padding.
3042
3043 @requireAttrs(socket.socket, "sendmsg")
3044 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3045 def testSetHopLimit(self):
3046 # Test setting hop limit on outgoing packet and receiving it
3047 # at the other end.
3048 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3049
3050 @testSetHopLimit.client_skip
3051 def _testSetHopLimit(self):
3052 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3053 self.assertEqual(
3054 self.sendmsgToServer([MSG],
3055 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3056 array.array("i", [self.hop_limit]))]),
3057 len(MSG))
3058
3059 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3060 ignoreflags=0):
3061 # Receive traffic class and hop limit into ancbufsize bytes of
3062 # ancillary data space. Check that data is MSG, ancillary
3063 # data is not truncated (but ignore any flags in ignoreflags),
3064 # and traffic class and hop limit are in range (hop limit no
3065 # more than maxhop).
3066 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3067 socket.IPV6_RECVHOPLIMIT, 1)
3068 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3069 socket.IPV6_RECVTCLASS, 1)
3070 self.misc_event.set()
3071 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3072 len(MSG), ancbufsize)
3073
3074 self.assertEqual(msg, MSG)
3075 self.checkRecvmsgAddress(addr, self.cli_addr)
3076 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3077 ignore=ignoreflags)
3078 self.assertEqual(len(ancdata), 2)
3079 ancmap = self.ancillaryMapping(ancdata)
3080
3081 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3082 self.assertEqual(len(tcdata), SIZEOF_INT)
3083 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003084 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003085 self.assertGreaterEqual(a[0], 0)
3086 self.assertLessEqual(a[0], 255)
3087
3088 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3089 self.assertEqual(len(hldata), SIZEOF_INT)
3090 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003091 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003092 self.assertGreaterEqual(a[0], 0)
3093 self.assertLessEqual(a[0], maxhop)
3094
3095 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3096 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3097 def testRecvTrafficClassAndHopLimit(self):
3098 # Test receiving traffic class and hop limit as ancillary data.
3099 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3100
3101 @testRecvTrafficClassAndHopLimit.client_skip
3102 def _testRecvTrafficClassAndHopLimit(self):
3103 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3104 self.sendToServer(MSG)
3105
3106 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3107 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3108 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3109 # Test receiving traffic class and hop limit, using
3110 # CMSG_SPACE() to calculate buffer size.
3111 self.checkTrafficClassAndHopLimit(
3112 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3113
3114 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3115 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3116 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3117 self.sendToServer(MSG)
3118
3119 @requireAttrs(socket.socket, "sendmsg")
3120 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3121 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3122 def testSetTrafficClassAndHopLimit(self):
3123 # Test setting traffic class and hop limit on outgoing packet,
3124 # and receiving them at the other end.
3125 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3126 maxhop=self.hop_limit)
3127
3128 @testSetTrafficClassAndHopLimit.client_skip
3129 def _testSetTrafficClassAndHopLimit(self):
3130 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3131 self.assertEqual(
3132 self.sendmsgToServer([MSG],
3133 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3134 array.array("i", [self.traffic_class])),
3135 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3136 array.array("i", [self.hop_limit]))]),
3137 len(MSG))
3138
3139 @requireAttrs(socket.socket, "sendmsg")
3140 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3141 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3142 def testOddCmsgSize(self):
3143 # Try to send ancillary data with first item one byte too
3144 # long. Fall back to sending with correct size if this fails,
3145 # and check that second item was handled correctly.
3146 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3147 maxhop=self.hop_limit)
3148
3149 @testOddCmsgSize.client_skip
3150 def _testOddCmsgSize(self):
3151 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3152 try:
3153 nbytes = self.sendmsgToServer(
3154 [MSG],
3155 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003156 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003157 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3158 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003159 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003160 self.assertIsInstance(e.errno, int)
3161 nbytes = self.sendmsgToServer(
3162 [MSG],
3163 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3164 array.array("i", [self.traffic_class])),
3165 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3166 array.array("i", [self.hop_limit]))])
3167 self.assertEqual(nbytes, len(MSG))
3168
3169 # Tests for proper handling of truncated ancillary data
3170
3171 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3172 # Receive hop limit into ancbufsize bytes of ancillary data
3173 # space, which should be too small to contain the ancillary
3174 # data header (if ancbufsize is None, pass no second argument
3175 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3176 # (unless included in ignoreflags), and no ancillary data is
3177 # returned.
3178 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3179 socket.IPV6_RECVHOPLIMIT, 1)
3180 self.misc_event.set()
3181 args = () if ancbufsize is None else (ancbufsize,)
3182 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3183 len(MSG), *args)
3184
3185 self.assertEqual(msg, MSG)
3186 self.checkRecvmsgAddress(addr, self.cli_addr)
3187 self.assertEqual(ancdata, [])
3188 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3189 ignore=ignoreflags)
3190
3191 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3192 def testCmsgTruncNoBufSize(self):
3193 # Check that no ancillary data is received when no ancillary
3194 # buffer size is provided.
3195 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3196 # BSD seems to set
3197 # MSG_CTRUNC only if an item
3198 # has been partially
3199 # received.
3200 ignoreflags=socket.MSG_CTRUNC)
3201
3202 @testCmsgTruncNoBufSize.client_skip
3203 def _testCmsgTruncNoBufSize(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 testSingleCmsgTrunc0(self):
3209 # Check that no ancillary data is received when ancillary
3210 # buffer size is zero.
3211 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3212 ignoreflags=socket.MSG_CTRUNC)
3213
3214 @testSingleCmsgTrunc0.client_skip
3215 def _testSingleCmsgTrunc0(self):
3216 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3217 self.sendToServer(MSG)
3218
3219 # Check that no ancillary data is returned for various non-zero
3220 # (but still too small) buffer sizes.
3221
3222 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3223 def testSingleCmsgTrunc1(self):
3224 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3225
3226 @testSingleCmsgTrunc1.client_skip
3227 def _testSingleCmsgTrunc1(self):
3228 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3229 self.sendToServer(MSG)
3230
3231 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3232 def testSingleCmsgTrunc2Int(self):
3233 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3234
3235 @testSingleCmsgTrunc2Int.client_skip
3236 def _testSingleCmsgTrunc2Int(self):
3237 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3238 self.sendToServer(MSG)
3239
3240 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3241 def testSingleCmsgTruncLen0Minus1(self):
3242 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3243
3244 @testSingleCmsgTruncLen0Minus1.client_skip
3245 def _testSingleCmsgTruncLen0Minus1(self):
3246 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3247 self.sendToServer(MSG)
3248
3249 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3250 def testSingleCmsgTruncInData(self):
3251 # Test truncation of a control message inside its associated
3252 # data. The message may be returned with its data truncated,
3253 # or not returned at all.
3254 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3255 socket.IPV6_RECVHOPLIMIT, 1)
3256 self.misc_event.set()
3257 msg, ancdata, flags, addr = self.doRecvmsg(
3258 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3259
3260 self.assertEqual(msg, MSG)
3261 self.checkRecvmsgAddress(addr, self.cli_addr)
3262 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3263
3264 self.assertLessEqual(len(ancdata), 1)
3265 if ancdata:
3266 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3267 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3268 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3269 self.assertLess(len(cmsg_data), SIZEOF_INT)
3270
3271 @testSingleCmsgTruncInData.client_skip
3272 def _testSingleCmsgTruncInData(self):
3273 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3274 self.sendToServer(MSG)
3275
3276 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3277 # Receive traffic class and hop limit into ancbufsize bytes of
3278 # ancillary data space, which should be large enough to
3279 # contain the first item, but too small to contain the header
3280 # of the second. Check that data is MSG, MSG_CTRUNC is set
3281 # (unless included in ignoreflags), and only one ancillary
3282 # data item is returned.
3283 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3284 socket.IPV6_RECVHOPLIMIT, 1)
3285 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3286 socket.IPV6_RECVTCLASS, 1)
3287 self.misc_event.set()
3288 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3289 len(MSG), ancbufsize)
3290
3291 self.assertEqual(msg, MSG)
3292 self.checkRecvmsgAddress(addr, self.cli_addr)
3293 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3294 ignore=ignoreflags)
3295
3296 self.assertEqual(len(ancdata), 1)
3297 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3298 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3299 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3300 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3301 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003302 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003303 self.assertGreaterEqual(a[0], 0)
3304 self.assertLessEqual(a[0], 255)
3305
3306 # Try the above test with various buffer sizes.
3307
3308 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3309 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3310 def testSecondCmsgTrunc0(self):
3311 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3312 ignoreflags=socket.MSG_CTRUNC)
3313
3314 @testSecondCmsgTrunc0.client_skip
3315 def _testSecondCmsgTrunc0(self):
3316 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3317 self.sendToServer(MSG)
3318
3319 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3320 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3321 def testSecondCmsgTrunc1(self):
3322 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3323
3324 @testSecondCmsgTrunc1.client_skip
3325 def _testSecondCmsgTrunc1(self):
3326 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3327 self.sendToServer(MSG)
3328
3329 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3330 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3331 def testSecondCmsgTrunc2Int(self):
3332 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3333 2 * SIZEOF_INT)
3334
3335 @testSecondCmsgTrunc2Int.client_skip
3336 def _testSecondCmsgTrunc2Int(self):
3337 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3338 self.sendToServer(MSG)
3339
3340 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3341 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3342 def testSecondCmsgTruncLen0Minus1(self):
3343 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3344 socket.CMSG_LEN(0) - 1)
3345
3346 @testSecondCmsgTruncLen0Minus1.client_skip
3347 def _testSecondCmsgTruncLen0Minus1(self):
3348 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3349 self.sendToServer(MSG)
3350
3351 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3352 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3353 def testSecomdCmsgTruncInData(self):
3354 # Test truncation of the second of two control messages inside
3355 # its associated data.
3356 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3357 socket.IPV6_RECVHOPLIMIT, 1)
3358 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3359 socket.IPV6_RECVTCLASS, 1)
3360 self.misc_event.set()
3361 msg, ancdata, flags, addr = self.doRecvmsg(
3362 self.serv_sock, len(MSG),
3363 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3364
3365 self.assertEqual(msg, MSG)
3366 self.checkRecvmsgAddress(addr, self.cli_addr)
3367 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3368
3369 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3370
3371 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3372 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3373 cmsg_types.remove(cmsg_type)
3374 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3375 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003376 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003377 self.assertGreaterEqual(a[0], 0)
3378 self.assertLessEqual(a[0], 255)
3379
3380 if ancdata:
3381 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3382 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3383 cmsg_types.remove(cmsg_type)
3384 self.assertLess(len(cmsg_data), SIZEOF_INT)
3385
3386 self.assertEqual(ancdata, [])
3387
3388 @testSecomdCmsgTruncInData.client_skip
3389 def _testSecomdCmsgTruncInData(self):
3390 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3391 self.sendToServer(MSG)
3392
3393
3394# Derive concrete test classes for different socket types.
3395
3396class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3397 SendrecvmsgConnectionlessBase,
3398 ThreadedSocketTestMixin, UDPTestBase):
3399 pass
3400
3401@requireAttrs(socket.socket, "sendmsg")
3402@unittest.skipUnless(thread, 'Threading required for this test.')
3403class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3404 pass
3405
3406@requireAttrs(socket.socket, "recvmsg")
3407@unittest.skipUnless(thread, 'Threading required for this test.')
3408class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3409 pass
3410
3411@requireAttrs(socket.socket, "recvmsg_into")
3412@unittest.skipUnless(thread, 'Threading required for this test.')
3413class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3414 pass
3415
3416
3417class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3418 SendrecvmsgConnectionlessBase,
3419 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003420
3421 def checkRecvmsgAddress(self, addr1, addr2):
3422 # Called to compare the received address with the address of
3423 # the peer, ignoring scope ID
3424 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003425
3426@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003427@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003428@requireSocket("AF_INET6", "SOCK_DGRAM")
3429@unittest.skipUnless(thread, 'Threading required for this test.')
3430class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3431 pass
3432
3433@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003434@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003435@requireSocket("AF_INET6", "SOCK_DGRAM")
3436@unittest.skipUnless(thread, 'Threading required for this test.')
3437class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3438 pass
3439
3440@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003441@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003442@requireSocket("AF_INET6", "SOCK_DGRAM")
3443@unittest.skipUnless(thread, 'Threading required for this test.')
3444class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3445 pass
3446
3447@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003448@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003449@requireAttrs(socket, "IPPROTO_IPV6")
3450@requireSocket("AF_INET6", "SOCK_DGRAM")
3451@unittest.skipUnless(thread, 'Threading required for this test.')
3452class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3453 SendrecvmsgUDP6TestBase):
3454 pass
3455
3456@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003457@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003458@requireAttrs(socket, "IPPROTO_IPV6")
3459@requireSocket("AF_INET6", "SOCK_DGRAM")
3460@unittest.skipUnless(thread, 'Threading required for this test.')
3461class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3462 RFC3542AncillaryTest,
3463 SendrecvmsgUDP6TestBase):
3464 pass
3465
3466
3467class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3468 ConnectedStreamTestMixin, TCPTestBase):
3469 pass
3470
3471@requireAttrs(socket.socket, "sendmsg")
3472@unittest.skipUnless(thread, 'Threading required for this test.')
3473class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3474 pass
3475
3476@requireAttrs(socket.socket, "recvmsg")
3477@unittest.skipUnless(thread, 'Threading required for this test.')
3478class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3479 SendrecvmsgTCPTestBase):
3480 pass
3481
3482@requireAttrs(socket.socket, "recvmsg_into")
3483@unittest.skipUnless(thread, 'Threading required for this test.')
3484class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3485 SendrecvmsgTCPTestBase):
3486 pass
3487
3488
3489class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3490 SendrecvmsgConnectedBase,
3491 ConnectedStreamTestMixin, SCTPStreamBase):
3492 pass
3493
3494@requireAttrs(socket.socket, "sendmsg")
3495@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3496@unittest.skipUnless(thread, 'Threading required for this test.')
3497class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3498 pass
3499
3500@requireAttrs(socket.socket, "recvmsg")
3501@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3502@unittest.skipUnless(thread, 'Threading required for this test.')
3503class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3504 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003505
3506 def testRecvmsgEOF(self):
3507 try:
3508 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3509 except OSError as e:
3510 if e.errno != errno.ENOTCONN:
3511 raise
3512 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003513
3514@requireAttrs(socket.socket, "recvmsg_into")
3515@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3516@unittest.skipUnless(thread, 'Threading required for this test.')
3517class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3518 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003519
3520 def testRecvmsgEOF(self):
3521 try:
3522 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3523 except OSError as e:
3524 if e.errno != errno.ENOTCONN:
3525 raise
3526 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003527
3528
3529class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3530 ConnectedStreamTestMixin, UnixStreamBase):
3531 pass
3532
3533@requireAttrs(socket.socket, "sendmsg")
3534@requireAttrs(socket, "AF_UNIX")
3535@unittest.skipUnless(thread, 'Threading required for this test.')
3536class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3537 pass
3538
3539@requireAttrs(socket.socket, "recvmsg")
3540@requireAttrs(socket, "AF_UNIX")
3541@unittest.skipUnless(thread, 'Threading required for this test.')
3542class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3543 SendrecvmsgUnixStreamTestBase):
3544 pass
3545
3546@requireAttrs(socket.socket, "recvmsg_into")
3547@requireAttrs(socket, "AF_UNIX")
3548@unittest.skipUnless(thread, 'Threading required for this test.')
3549class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3550 SendrecvmsgUnixStreamTestBase):
3551 pass
3552
3553@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3554@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3555@unittest.skipUnless(thread, 'Threading required for this test.')
3556class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3557 pass
3558
3559@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3560@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3561@unittest.skipUnless(thread, 'Threading required for this test.')
3562class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3563 SendrecvmsgUnixStreamTestBase):
3564 pass
3565
3566
3567# Test interrupting the interruptible send/receive methods with a
3568# signal when a timeout is set. These tests avoid having multiple
3569# threads alive during the test so that the OS cannot deliver the
3570# signal to the wrong one.
3571
3572class InterruptedTimeoutBase(unittest.TestCase):
3573 # Base class for interrupted send/receive tests. Installs an
3574 # empty handler for SIGALRM and removes it on teardown, along with
3575 # any scheduled alarms.
3576
3577 def setUp(self):
3578 super().setUp()
3579 orig_alrm_handler = signal.signal(signal.SIGALRM,
3580 lambda signum, frame: None)
3581 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3582 self.addCleanup(self.setAlarm, 0)
3583
3584 # Timeout for socket operations
3585 timeout = 4.0
3586
3587 # Provide setAlarm() method to schedule delivery of SIGALRM after
3588 # given number of seconds, or cancel it if zero, and an
3589 # appropriate time value to use. Use setitimer() if available.
3590 if hasattr(signal, "setitimer"):
3591 alarm_time = 0.05
3592
3593 def setAlarm(self, seconds):
3594 signal.setitimer(signal.ITIMER_REAL, seconds)
3595 else:
3596 # Old systems may deliver the alarm up to one second early
3597 alarm_time = 2
3598
3599 def setAlarm(self, seconds):
3600 signal.alarm(seconds)
3601
3602
3603# Require siginterrupt() in order to ensure that system calls are
3604# interrupted by default.
3605@requireAttrs(signal, "siginterrupt")
3606@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3607 "Don't have signal.alarm or signal.setitimer")
3608class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3609 # Test interrupting the recv*() methods with signals when a
3610 # timeout is set.
3611
3612 def setUp(self):
3613 super().setUp()
3614 self.serv.settimeout(self.timeout)
3615
3616 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003617 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003618 # errno of EINTR when interrupted by a signal.
3619 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003620 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003621 func(*args, **kwargs)
3622 self.assertNotIsInstance(cm.exception, socket.timeout)
3623 self.assertEqual(cm.exception.errno, errno.EINTR)
3624
3625 def testInterruptedRecvTimeout(self):
3626 self.checkInterruptedRecv(self.serv.recv, 1024)
3627
3628 def testInterruptedRecvIntoTimeout(self):
3629 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3630
3631 def testInterruptedRecvfromTimeout(self):
3632 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3633
3634 def testInterruptedRecvfromIntoTimeout(self):
3635 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3636
3637 @requireAttrs(socket.socket, "recvmsg")
3638 def testInterruptedRecvmsgTimeout(self):
3639 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3640
3641 @requireAttrs(socket.socket, "recvmsg_into")
3642 def testInterruptedRecvmsgIntoTimeout(self):
3643 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3644
3645
3646# Require siginterrupt() in order to ensure that system calls are
3647# interrupted by default.
3648@requireAttrs(signal, "siginterrupt")
3649@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3650 "Don't have signal.alarm or signal.setitimer")
3651@unittest.skipUnless(thread, 'Threading required for this test.')
3652class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3653 ThreadSafeCleanupTestCase,
3654 SocketListeningTestMixin, TCPTestBase):
3655 # Test interrupting the interruptible send*() methods with signals
3656 # when a timeout is set.
3657
3658 def setUp(self):
3659 super().setUp()
3660 self.serv_conn = self.newSocket()
3661 self.addCleanup(self.serv_conn.close)
3662 # Use a thread to complete the connection, but wait for it to
3663 # terminate before running the test, so that there is only one
3664 # thread to accept the signal.
3665 cli_thread = threading.Thread(target=self.doConnect)
3666 cli_thread.start()
3667 self.cli_conn, addr = self.serv.accept()
3668 self.addCleanup(self.cli_conn.close)
3669 cli_thread.join()
3670 self.serv_conn.settimeout(self.timeout)
3671
3672 def doConnect(self):
3673 self.serv_conn.connect(self.serv_addr)
3674
3675 def checkInterruptedSend(self, func, *args, **kwargs):
3676 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003677 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003678 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003679 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003680 while True:
3681 self.setAlarm(self.alarm_time)
3682 func(*args, **kwargs)
3683 self.assertNotIsInstance(cm.exception, socket.timeout)
3684 self.assertEqual(cm.exception.errno, errno.EINTR)
3685
Ned Deilyc5640382014-02-03 13:58:31 -08003686 # Issue #12958: The following tests have problems on OS X prior to 10.7
3687 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003688 def testInterruptedSendTimeout(self):
3689 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3690
Ned Deilyc5640382014-02-03 13:58:31 -08003691 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003692 def testInterruptedSendtoTimeout(self):
3693 # Passing an actual address here as Python's wrapper for
3694 # sendto() doesn't allow passing a zero-length one; POSIX
3695 # requires that the address is ignored since the socket is
3696 # connection-mode, however.
3697 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3698 self.serv_addr)
3699
Ned Deilyc5640382014-02-03 13:58:31 -08003700 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003701 @requireAttrs(socket.socket, "sendmsg")
3702 def testInterruptedSendmsgTimeout(self):
3703 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3704
3705
Victor Stinner45df8202010-04-28 22:31:17 +00003706@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003707class TCPCloserTest(ThreadedTCPSocketTest):
3708
3709 def testClose(self):
3710 conn, addr = self.serv.accept()
3711 conn.close()
3712
3713 sd = self.cli
3714 read, write, err = select.select([sd], [], [], 1.0)
3715 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003716 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003717
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003718 # Calling close() many times should be safe.
3719 conn.close()
3720 conn.close()
3721
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003722 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003723 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003724 time.sleep(1.0)
3725
Serhiy Storchaka43767632013-11-03 21:31:38 +02003726@unittest.skipUnless(hasattr(socket, 'socketpair'),
3727 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003728@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003729class BasicSocketPairTest(SocketPairTest):
3730
3731 def __init__(self, methodName='runTest'):
3732 SocketPairTest.__init__(self, methodName=methodName)
3733
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003734 def _check_defaults(self, sock):
3735 self.assertIsInstance(sock, socket.socket)
3736 if hasattr(socket, 'AF_UNIX'):
3737 self.assertEqual(sock.family, socket.AF_UNIX)
3738 else:
3739 self.assertEqual(sock.family, socket.AF_INET)
3740 self.assertEqual(sock.type, socket.SOCK_STREAM)
3741 self.assertEqual(sock.proto, 0)
3742
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003743 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003744 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003745
3746 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003747 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003748
Dave Cole331708b2004-08-09 04:51:41 +00003749 def testRecv(self):
3750 msg = self.serv.recv(1024)
3751 self.assertEqual(msg, MSG)
3752
3753 def _testRecv(self):
3754 self.cli.send(MSG)
3755
3756 def testSend(self):
3757 self.serv.send(MSG)
3758
3759 def _testSend(self):
3760 msg = self.cli.recv(1024)
3761 self.assertEqual(msg, MSG)
3762
Victor Stinner45df8202010-04-28 22:31:17 +00003763@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003764class NonBlockingTCPTests(ThreadedTCPSocketTest):
3765
3766 def __init__(self, methodName='runTest'):
3767 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3768
3769 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003770 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003771 self.serv.setblocking(True)
3772 self.assertIsNone(self.serv.gettimeout())
3773 self.serv.setblocking(False)
3774 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003775 start = time.time()
3776 try:
3777 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003778 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003779 pass
3780 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003781 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003782
3783 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003784 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003785
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003786 @support.cpython_only
3787 def testSetBlocking_overflow(self):
3788 # Issue 15989
3789 import _testcapi
3790 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3791 self.skipTest('needs UINT_MAX < ULONG_MAX')
3792 self.serv.setblocking(False)
3793 self.assertEqual(self.serv.gettimeout(), 0.0)
3794 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3795 self.assertIsNone(self.serv.gettimeout())
3796
3797 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3798
Serhiy Storchaka43767632013-11-03 21:31:38 +02003799 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3800 'test needs socket.SOCK_NONBLOCK')
3801 @support.requires_linux_version(2, 6, 28)
3802 def testInitNonBlocking(self):
3803 # reinit server socket
3804 self.serv.close()
3805 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3806 socket.SOCK_NONBLOCK)
3807 self.port = support.bind_port(self.serv)
3808 self.serv.listen(1)
3809 # actual testing
3810 start = time.time()
3811 try:
3812 self.serv.accept()
3813 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003814 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003815 end = time.time()
3816 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3817
3818 def _testInitNonBlocking(self):
3819 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003820
Antoine Pitrou600232b2011-01-05 21:03:42 +00003821 def testInheritFlags(self):
3822 # Issue #7995: when calling accept() on a listening socket with a
3823 # timeout, the resulting socket should not be non-blocking.
3824 self.serv.settimeout(10)
3825 try:
3826 conn, addr = self.serv.accept()
3827 message = conn.recv(len(MSG))
3828 finally:
3829 conn.close()
3830 self.serv.settimeout(None)
3831
3832 def _testInheritFlags(self):
3833 time.sleep(0.1)
3834 self.cli.connect((HOST, self.port))
3835 time.sleep(0.5)
3836 self.cli.send(MSG)
3837
Guido van Rossum24e4af82002-06-12 19:18:08 +00003838 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003839 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003840 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003841 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003842 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003843 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003844 pass
3845 else:
3846 self.fail("Error trying to do non-blocking accept.")
3847 read, write, err = select.select([self.serv], [], [])
3848 if self.serv in read:
3849 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003850 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003851 else:
3852 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003853
Guido van Rossum24e4af82002-06-12 19:18:08 +00003854 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003855 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003856 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003857
3858 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003859 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003860 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003861 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003862
3863 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003864 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003865 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003866
3867 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003868 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003869 conn, addr = self.serv.accept()
3870 conn.setblocking(0)
3871 try:
3872 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003873 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003874 pass
3875 else:
3876 self.fail("Error trying to do non-blocking recv.")
3877 read, write, err = select.select([conn], [], [])
3878 if conn in read:
3879 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003880 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003881 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003882 else:
3883 self.fail("Error during select call to non-blocking socket.")
3884
3885 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003886 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003887 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003888 self.cli.send(MSG)
3889
Victor Stinner45df8202010-04-28 22:31:17 +00003890@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003891class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003892 """Unit tests for the object returned by socket.makefile()
3893
Antoine Pitrou834bd812010-10-13 16:17:14 +00003894 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003895 the client connection. You can read from this file to
3896 get output from the server.
3897
Antoine Pitrou834bd812010-10-13 16:17:14 +00003898 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003899 server connection. You can write to this file to send output
3900 to the client.
3901 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003902
Guido van Rossume9f66142002-08-07 15:46:19 +00003903 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003904 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003905 errors = 'strict'
3906 newline = None
3907
3908 read_mode = 'rb'
3909 read_msg = MSG
3910 write_mode = 'wb'
3911 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003912
Guido van Rossum24e4af82002-06-12 19:18:08 +00003913 def __init__(self, methodName='runTest'):
3914 SocketConnectedTest.__init__(self, methodName=methodName)
3915
3916 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003917 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3918 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003919 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003920 self.read_file = self.cli_conn.makefile(
3921 self.read_mode, self.bufsize,
3922 encoding = self.encoding,
3923 errors = self.errors,
3924 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003925
3926 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003927 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003928 self.read_file.close()
3929 self.assertTrue(self.read_file.closed)
3930 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003931 SocketConnectedTest.tearDown(self)
3932
3933 def clientSetUp(self):
3934 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003935 self.write_file = self.serv_conn.makefile(
3936 self.write_mode, self.bufsize,
3937 encoding = self.encoding,
3938 errors = self.errors,
3939 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003940
3941 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003942 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003943 self.write_file.close()
3944 self.assertTrue(self.write_file.closed)
3945 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003946 SocketConnectedTest.clientTearDown(self)
3947
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003948 def testReadAfterTimeout(self):
3949 # Issue #7322: A file object must disallow further reads
3950 # after a timeout has occurred.
3951 self.cli_conn.settimeout(1)
3952 self.read_file.read(3)
3953 # First read raises a timeout
3954 self.assertRaises(socket.timeout, self.read_file.read, 1)
3955 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003956 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003957 self.read_file.read(1)
3958 self.assertIn("cannot read from timed out object", str(ctx.exception))
3959
3960 def _testReadAfterTimeout(self):
3961 self.write_file.write(self.write_msg[0:3])
3962 self.write_file.flush()
3963 self.serv_finished.wait()
3964
Guido van Rossum24e4af82002-06-12 19:18:08 +00003965 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003966 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003967 first_seg = self.read_file.read(len(self.read_msg)-3)
3968 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003969 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003970 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003971
3972 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003973 self.write_file.write(self.write_msg)
3974 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003975
Guido van Rossum8c943832002-08-08 01:00:28 +00003976 def testFullRead(self):
3977 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003978 msg = self.read_file.read()
3979 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003980
3981 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003982 self.write_file.write(self.write_msg)
3983 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003984
Guido van Rossum24e4af82002-06-12 19:18:08 +00003985 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003986 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003987 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003988 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003989 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003990 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003991 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003992 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003993 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003994
3995 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003996 self.write_file.write(self.write_msg)
3997 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003998
3999 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004000 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004001 line = self.read_file.readline()
4002 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004003
4004 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004005 self.write_file.write(self.write_msg)
4006 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004007
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004008 def testCloseAfterMakefile(self):
4009 # The file returned by makefile should keep the socket open.
4010 self.cli_conn.close()
4011 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004012 msg = self.read_file.read()
4013 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004014
4015 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004016 self.write_file.write(self.write_msg)
4017 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004018
4019 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004020 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004021 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004022 if isinstance(self.read_msg, str):
4023 msg = msg.decode()
4024 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004025
4026 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027 self.write_file.write(self.write_msg)
4028 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004029
Tim Peters116d83c2004-03-28 02:20:45 +00004030 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004031 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004032
4033 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004034 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004035
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004036 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004037 self.assertEqual(self.read_file.mode, self.read_mode)
4038 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004039
4040 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004041 self.assertEqual(self.write_file.mode, self.write_mode)
4042 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004043
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004044 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004045 self.read_file.close()
4046 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004047 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004048 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004049
4050 def _testRealClose(self):
4051 pass
4052
4053
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004054class FileObjectInterruptedTestCase(unittest.TestCase):
4055 """Test that the file object correctly handles EINTR internally."""
4056
4057 class MockSocket(object):
4058 def __init__(self, recv_funcs=()):
4059 # A generator that returns callables that we'll call for each
4060 # call to recv().
4061 self._recv_step = iter(recv_funcs)
4062
4063 def recv_into(self, buffer):
4064 data = next(self._recv_step)()
4065 assert len(buffer) >= len(data)
4066 buffer[:len(data)] = data
4067 return len(data)
4068
4069 def _decref_socketios(self):
4070 pass
4071
4072 def _textiowrap_for_test(self, buffering=-1):
4073 raw = socket.SocketIO(self, "r")
4074 if buffering < 0:
4075 buffering = io.DEFAULT_BUFFER_SIZE
4076 if buffering == 0:
4077 return raw
4078 buffer = io.BufferedReader(raw, buffering)
4079 text = io.TextIOWrapper(buffer, None, None)
4080 text.mode = "rb"
4081 return text
4082
4083 @staticmethod
4084 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004085 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004086
4087 def _textiowrap_mock_socket(self, mock, buffering=-1):
4088 raw = socket.SocketIO(mock, "r")
4089 if buffering < 0:
4090 buffering = io.DEFAULT_BUFFER_SIZE
4091 if buffering == 0:
4092 return raw
4093 buffer = io.BufferedReader(raw, buffering)
4094 text = io.TextIOWrapper(buffer, None, None)
4095 text.mode = "rb"
4096 return text
4097
4098 def _test_readline(self, size=-1, buffering=-1):
4099 mock_sock = self.MockSocket(recv_funcs=[
4100 lambda : b"This is the first line\nAnd the sec",
4101 self._raise_eintr,
4102 lambda : b"ond line is here\n",
4103 lambda : b"",
4104 lambda : b"", # XXX(gps): io library does an extra EOF read
4105 ])
4106 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004107 self.assertEqual(fo.readline(size), "This is the first line\n")
4108 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004109
4110 def _test_read(self, size=-1, buffering=-1):
4111 mock_sock = self.MockSocket(recv_funcs=[
4112 lambda : b"This is the first line\nAnd the sec",
4113 self._raise_eintr,
4114 lambda : b"ond line is here\n",
4115 lambda : b"",
4116 lambda : b"", # XXX(gps): io library does an extra EOF read
4117 ])
4118 expecting = (b"This is the first line\n"
4119 b"And the second line is here\n")
4120 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4121 if buffering == 0:
4122 data = b''
4123 else:
4124 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004125 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004126 while len(data) != len(expecting):
4127 part = fo.read(size)
4128 if not part:
4129 break
4130 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004131 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004132
4133 def test_default(self):
4134 self._test_readline()
4135 self._test_readline(size=100)
4136 self._test_read()
4137 self._test_read(size=100)
4138
4139 def test_with_1k_buffer(self):
4140 self._test_readline(buffering=1024)
4141 self._test_readline(size=100, buffering=1024)
4142 self._test_read(buffering=1024)
4143 self._test_read(size=100, buffering=1024)
4144
4145 def _test_readline_no_buffer(self, size=-1):
4146 mock_sock = self.MockSocket(recv_funcs=[
4147 lambda : b"a",
4148 lambda : b"\n",
4149 lambda : b"B",
4150 self._raise_eintr,
4151 lambda : b"b",
4152 lambda : b"",
4153 ])
4154 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004155 self.assertEqual(fo.readline(size), b"a\n")
4156 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004157
4158 def test_no_buffer(self):
4159 self._test_readline_no_buffer()
4160 self._test_readline_no_buffer(size=4)
4161 self._test_read(buffering=0)
4162 self._test_read(size=100, buffering=0)
4163
4164
Guido van Rossume9f66142002-08-07 15:46:19 +00004165class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4166
4167 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004168
Guido van Rossume9f66142002-08-07 15:46:19 +00004169 In this case (and in this case only), it should be possible to
4170 create a file object, read a line from it, create another file
4171 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004172 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004173 when reading multiple requests from the same socket."""
4174
4175 bufsize = 0 # Use unbuffered mode
4176
4177 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004178 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004179 line = self.read_file.readline() # first line
4180 self.assertEqual(line, b"A. " + self.write_msg) # first line
4181 self.read_file = self.cli_conn.makefile('rb', 0)
4182 line = self.read_file.readline() # second line
4183 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004184
4185 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004186 self.write_file.write(b"A. " + self.write_msg)
4187 self.write_file.write(b"B. " + self.write_msg)
4188 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004189
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004190 def testMakefileClose(self):
4191 # The file returned by makefile should keep the socket open...
4192 self.cli_conn.close()
4193 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004194 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004195 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004196 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004197 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004198
4199 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004200 self.write_file.write(self.write_msg)
4201 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004202
4203 def testMakefileCloseSocketDestroy(self):
4204 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004205 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004206 refcount_after = sys.getrefcount(self.cli_conn)
4207 self.assertEqual(refcount_before - 1, refcount_after)
4208
4209 def _testMakefileCloseSocketDestroy(self):
4210 pass
4211
Antoine Pitrou98b46702010-09-18 22:59:00 +00004212 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004213 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004214 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4215
4216 def testSmallReadNonBlocking(self):
4217 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004218 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4219 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004220 self.evt1.set()
4221 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004222 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004223 if first_seg is None:
4224 # Data not arrived (can happen under Windows), wait a bit
4225 time.sleep(0.5)
4226 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004227 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004228 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004229 self.assertEqual(n, 3)
4230 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004231 self.assertEqual(msg, self.read_msg)
4232 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4233 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004234
4235 def _testSmallReadNonBlocking(self):
4236 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004237 self.write_file.write(self.write_msg)
4238 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004239 self.evt2.set()
4240 # Avoid cloding the socket before the server test has finished,
4241 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4242 self.serv_finished.wait(5.0)
4243
4244 def testWriteNonBlocking(self):
4245 self.cli_finished.wait(5.0)
4246 # The client thread can't skip directly - the SkipTest exception
4247 # would appear as a failure.
4248 if self.serv_skipped:
4249 self.skipTest(self.serv_skipped)
4250
4251 def _testWriteNonBlocking(self):
4252 self.serv_skipped = None
4253 self.serv_conn.setblocking(False)
4254 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004255 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004256 LIMIT = 10
4257 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004258 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004259 self.assertGreater(n, 0)
4260 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004261 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004262 if n is None:
4263 # Succeeded
4264 break
4265 self.assertGreater(n, 0)
4266 else:
4267 # Let us know that this test didn't manage to establish
4268 # the expected conditions. This is not a failure in itself but,
4269 # if it happens repeatedly, the test should be fixed.
4270 self.serv_skipped = "failed to saturate the socket buffer"
4271
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004272
Guido van Rossum8c943832002-08-08 01:00:28 +00004273class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4274
4275 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4276
4277
4278class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4279
4280 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004281
Thomas Woutersb2137042007-02-01 18:02:27 +00004282
Antoine Pitrou834bd812010-10-13 16:17:14 +00004283class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4284 """Tests for socket.makefile() in text mode (rather than binary)"""
4285
4286 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004287 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004288 write_mode = 'wb'
4289 write_msg = MSG
4290 newline = ''
4291
4292
4293class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4294 """Tests for socket.makefile() in text mode (rather than binary)"""
4295
4296 read_mode = 'rb'
4297 read_msg = MSG
4298 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004299 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004300 newline = ''
4301
4302
4303class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4304 """Tests for socket.makefile() in text mode (rather than binary)"""
4305
4306 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004307 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004308 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004309 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004310 newline = ''
4311
4312
Guido van Rossumd8faa362007-04-27 19:54:29 +00004313class NetworkConnectionTest(object):
4314 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004315
Guido van Rossumd8faa362007-04-27 19:54:29 +00004316 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004317 # We're inherited below by BasicTCPTest2, which also inherits
4318 # BasicTCPTest, which defines self.port referenced below.
4319 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004320 self.serv_conn = self.cli
4321
4322class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4323 """Tests that NetworkConnection does not break existing TCP functionality.
4324 """
4325
4326class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004327
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004328 class MockSocket(socket.socket):
4329 def connect(self, *args):
4330 raise socket.timeout('timed out')
4331
4332 @contextlib.contextmanager
4333 def mocked_socket_module(self):
4334 """Return a socket which times out on connect"""
4335 old_socket = socket.socket
4336 socket.socket = self.MockSocket
4337 try:
4338 yield
4339 finally:
4340 socket.socket = old_socket
4341
4342 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004343 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004344 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004345 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004346 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004347 cli.connect((HOST, port))
4348 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4349
4350 def test_create_connection(self):
4351 # Issue #9792: errors raised by create_connection() should have
4352 # a proper errno attribute.
4353 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004354 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004355 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004356
4357 # Issue #16257: create_connection() calls getaddrinfo() against
4358 # 'localhost'. This may result in an IPV6 addr being returned
4359 # as well as an IPV4 one:
4360 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4361 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4362 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4363 #
4364 # create_connection() enumerates through all the addresses returned
4365 # and if it doesn't successfully bind to any of them, it propagates
4366 # the last exception it encountered.
4367 #
4368 # On Solaris, ENETUNREACH is returned in this circumstance instead
4369 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4370 # expected errnos.
4371 expected_errnos = [ errno.ECONNREFUSED, ]
4372 if hasattr(errno, 'ENETUNREACH'):
4373 expected_errnos.append(errno.ENETUNREACH)
4374
4375 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004376
4377 def test_create_connection_timeout(self):
4378 # Issue #9792: create_connection() should not recast timeout errors
4379 # as generic socket errors.
4380 with self.mocked_socket_module():
4381 with self.assertRaises(socket.timeout):
4382 socket.create_connection((HOST, 1234))
4383
Guido van Rossumd8faa362007-04-27 19:54:29 +00004384
Victor Stinner45df8202010-04-28 22:31:17 +00004385@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004386class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4387
4388 def __init__(self, methodName='runTest'):
4389 SocketTCPTest.__init__(self, methodName=methodName)
4390 ThreadableTest.__init__(self)
4391
4392 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004393 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004394
4395 def clientTearDown(self):
4396 self.cli.close()
4397 self.cli = None
4398 ThreadableTest.clientTearDown(self)
4399
4400 def _justAccept(self):
4401 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004402 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004403
4404 testFamily = _justAccept
4405 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004406 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004407 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004408 self.assertEqual(self.cli.family, 2)
4409
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004410 testSourceAddress = _justAccept
4411 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004412 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4413 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004414 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004415 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004416 # The port number being used is sufficient to show that the bind()
4417 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004418
Guido van Rossumd8faa362007-04-27 19:54:29 +00004419 testTimeoutDefault = _justAccept
4420 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004421 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004422 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004423 socket.setdefaulttimeout(42)
4424 try:
4425 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004426 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004427 finally:
4428 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004429 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004430
4431 testTimeoutNone = _justAccept
4432 def _testTimeoutNone(self):
4433 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004434 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004435 socket.setdefaulttimeout(30)
4436 try:
4437 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004438 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004439 finally:
4440 socket.setdefaulttimeout(None)
4441 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004442
4443 testTimeoutValueNamed = _justAccept
4444 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004445 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004446 self.assertEqual(self.cli.gettimeout(), 30)
4447
4448 testTimeoutValueNonamed = _justAccept
4449 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004450 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004451 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004452 self.assertEqual(self.cli.gettimeout(), 30)
4453
Victor Stinner45df8202010-04-28 22:31:17 +00004454@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004455class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4456
4457 def __init__(self, methodName='runTest'):
4458 SocketTCPTest.__init__(self, methodName=methodName)
4459 ThreadableTest.__init__(self)
4460
4461 def clientSetUp(self):
4462 pass
4463
4464 def clientTearDown(self):
4465 self.cli.close()
4466 self.cli = None
4467 ThreadableTest.clientTearDown(self)
4468
4469 def testInsideTimeout(self):
4470 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004471 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004472 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004473 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004474 testOutsideTimeout = testInsideTimeout
4475
4476 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004477 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004478 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004479 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004480
4481 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004482 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004483 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004484
4485
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004486class TCPTimeoutTest(SocketTCPTest):
4487
4488 def testTCPTimeout(self):
4489 def raise_timeout(*args, **kwargs):
4490 self.serv.settimeout(1.0)
4491 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004492 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004493 "Error generating a timeout exception (TCP)")
4494
4495 def testTimeoutZero(self):
4496 ok = False
4497 try:
4498 self.serv.settimeout(0.0)
4499 foo = self.serv.accept()
4500 except socket.timeout:
4501 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004502 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004503 ok = True
4504 except:
4505 self.fail("caught unexpected exception (TCP)")
4506 if not ok:
4507 self.fail("accept() returned success when we did not expect it")
4508
Serhiy Storchaka43767632013-11-03 21:31:38 +02004509 @unittest.skipUnless(hasattr(signal, 'alarm'),
4510 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004511 def testInterruptedTimeout(self):
4512 # XXX I don't know how to do this test on MSWindows or any other
4513 # plaform that doesn't support signal.alarm() or os.kill(), though
4514 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004515 self.serv.settimeout(5.0) # must be longer than alarm
4516 class Alarm(Exception):
4517 pass
4518 def alarm_handler(signal, frame):
4519 raise Alarm
4520 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4521 try:
4522 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4523 try:
4524 foo = self.serv.accept()
4525 except socket.timeout:
4526 self.fail("caught timeout instead of Alarm")
4527 except Alarm:
4528 pass
4529 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004530 self.fail("caught other exception instead of Alarm:"
4531 " %s(%s):\n%s" %
4532 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004533 else:
4534 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004535 finally:
4536 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004537 except Alarm:
4538 self.fail("got Alarm in wrong place")
4539 finally:
4540 # no alarm can be pending. Safe to restore old handler.
4541 signal.signal(signal.SIGALRM, old_alarm)
4542
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004543class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004544
4545 def testUDPTimeout(self):
4546 def raise_timeout(*args, **kwargs):
4547 self.serv.settimeout(1.0)
4548 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004549 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004550 "Error generating a timeout exception (UDP)")
4551
4552 def testTimeoutZero(self):
4553 ok = False
4554 try:
4555 self.serv.settimeout(0.0)
4556 foo = self.serv.recv(1024)
4557 except socket.timeout:
4558 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004559 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004560 ok = True
4561 except:
4562 self.fail("caught unexpected exception (UDP)")
4563 if not ok:
4564 self.fail("recv() returned success when we did not expect it")
4565
4566class TestExceptions(unittest.TestCase):
4567
4568 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004569 self.assertTrue(issubclass(OSError, Exception))
4570 self.assertTrue(issubclass(socket.herror, OSError))
4571 self.assertTrue(issubclass(socket.gaierror, OSError))
4572 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004573
Serhiy Storchaka43767632013-11-03 21:31:38 +02004574@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004575class TestLinuxAbstractNamespace(unittest.TestCase):
4576
4577 UNIX_PATH_MAX = 108
4578
4579 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004580 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004581 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4582 s1.bind(address)
4583 s1.listen(1)
4584 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4585 s2.connect(s1.getsockname())
4586 with s1.accept()[0] as s3:
4587 self.assertEqual(s1.getsockname(), address)
4588 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004589
4590 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004591 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004592 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4593 s.bind(address)
4594 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004595
4596 def testNameOverflow(self):
4597 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004598 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004599 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004600
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004601 def testStrName(self):
4602 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004603 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4604 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004605 s.bind("\x00python\x00test\x00")
4606 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004607 finally:
4608 s.close()
4609
Serhiy Storchaka43767632013-11-03 21:31:38 +02004610@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004611class TestUnixDomain(unittest.TestCase):
4612
4613 def setUp(self):
4614 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4615
4616 def tearDown(self):
4617 self.sock.close()
4618
4619 def encoded(self, path):
4620 # Return the given path encoded in the file system encoding,
4621 # or skip the test if this is not possible.
4622 try:
4623 return os.fsencode(path)
4624 except UnicodeEncodeError:
4625 self.skipTest(
4626 "Pathname {0!a} cannot be represented in file "
4627 "system encoding {1!r}".format(
4628 path, sys.getfilesystemencoding()))
4629
Antoine Pitrou16374872011-12-16 15:04:12 +01004630 def bind(self, sock, path):
4631 # Bind the socket
4632 try:
4633 sock.bind(path)
4634 except OSError as e:
4635 if str(e) == "AF_UNIX path too long":
4636 self.skipTest(
4637 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4638 .format(path))
4639 else:
4640 raise
4641
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004642 def testStrAddr(self):
4643 # Test binding to and retrieving a normal string pathname.
4644 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004645 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004646 self.addCleanup(support.unlink, path)
4647 self.assertEqual(self.sock.getsockname(), path)
4648
4649 def testBytesAddr(self):
4650 # Test binding to a bytes pathname.
4651 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004652 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004653 self.addCleanup(support.unlink, path)
4654 self.assertEqual(self.sock.getsockname(), path)
4655
4656 def testSurrogateescapeBind(self):
4657 # Test binding to a valid non-ASCII pathname, with the
4658 # non-ASCII bytes supplied using surrogateescape encoding.
4659 path = os.path.abspath(support.TESTFN_UNICODE)
4660 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004661 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004662 self.addCleanup(support.unlink, path)
4663 self.assertEqual(self.sock.getsockname(), path)
4664
4665 def testUnencodableAddr(self):
4666 # Test binding to a pathname that cannot be encoded in the
4667 # file system encoding.
4668 if support.TESTFN_UNENCODABLE is None:
4669 self.skipTest("No unencodable filename available")
4670 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004671 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004672 self.addCleanup(support.unlink, path)
4673 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004674
Victor Stinner45df8202010-04-28 22:31:17 +00004675@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004676class BufferIOTest(SocketConnectedTest):
4677 """
4678 Test the buffer versions of socket.recv() and socket.send().
4679 """
4680 def __init__(self, methodName='runTest'):
4681 SocketConnectedTest.__init__(self, methodName=methodName)
4682
Antoine Pitrou25480782010-03-17 22:50:28 +00004683 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004684 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004685 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004686 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004687 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004688 self.assertEqual(msg, MSG)
4689
Antoine Pitrou25480782010-03-17 22:50:28 +00004690 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004691 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004692 self.serv_conn.send(buf)
4693
Antoine Pitrou25480782010-03-17 22:50:28 +00004694 def testRecvIntoBytearray(self):
4695 buf = bytearray(1024)
4696 nbytes = self.cli_conn.recv_into(buf)
4697 self.assertEqual(nbytes, len(MSG))
4698 msg = buf[:len(MSG)]
4699 self.assertEqual(msg, MSG)
4700
4701 _testRecvIntoBytearray = _testRecvIntoArray
4702
4703 def testRecvIntoMemoryview(self):
4704 buf = bytearray(1024)
4705 nbytes = self.cli_conn.recv_into(memoryview(buf))
4706 self.assertEqual(nbytes, len(MSG))
4707 msg = buf[:len(MSG)]
4708 self.assertEqual(msg, MSG)
4709
4710 _testRecvIntoMemoryview = _testRecvIntoArray
4711
4712 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004713 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004714 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004715 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004716 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004717 self.assertEqual(msg, MSG)
4718
Antoine Pitrou25480782010-03-17 22:50:28 +00004719 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004720 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004721 self.serv_conn.send(buf)
4722
Antoine Pitrou25480782010-03-17 22:50:28 +00004723 def testRecvFromIntoBytearray(self):
4724 buf = bytearray(1024)
4725 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4726 self.assertEqual(nbytes, len(MSG))
4727 msg = buf[:len(MSG)]
4728 self.assertEqual(msg, MSG)
4729
4730 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4731
4732 def testRecvFromIntoMemoryview(self):
4733 buf = bytearray(1024)
4734 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4735 self.assertEqual(nbytes, len(MSG))
4736 msg = buf[:len(MSG)]
4737 self.assertEqual(msg, MSG)
4738
4739 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4740
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004741 def testRecvFromIntoSmallBuffer(self):
4742 # See issue #20246.
4743 buf = bytearray(8)
4744 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4745
4746 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004747 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004748
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004749 def testRecvFromIntoEmptyBuffer(self):
4750 buf = bytearray()
4751 self.cli_conn.recvfrom_into(buf)
4752 self.cli_conn.recvfrom_into(buf, 0)
4753
4754 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4755
Christian Heimes043d6f62008-01-07 17:19:16 +00004756
4757TIPC_STYPE = 2000
4758TIPC_LOWER = 200
4759TIPC_UPPER = 210
4760
4761def isTipcAvailable():
4762 """Check if the TIPC module is loaded
4763
4764 The TIPC module is not loaded automatically on Ubuntu and probably
4765 other Linux distros.
4766 """
4767 if not hasattr(socket, "AF_TIPC"):
4768 return False
4769 if not os.path.isfile("/proc/modules"):
4770 return False
4771 with open("/proc/modules") as f:
4772 for line in f:
4773 if line.startswith("tipc "):
4774 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004775 return False
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 TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004780 def testRDM(self):
4781 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4782 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004783 self.addCleanup(srv.close)
4784 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004785
4786 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4787 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4788 TIPC_LOWER, TIPC_UPPER)
4789 srv.bind(srvaddr)
4790
4791 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4792 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4793 cli.sendto(MSG, sendaddr)
4794
4795 msg, recvaddr = srv.recvfrom(1024)
4796
4797 self.assertEqual(cli.getsockname(), recvaddr)
4798 self.assertEqual(msg, MSG)
4799
4800
Serhiy Storchaka43767632013-11-03 21:31:38 +02004801@unittest.skipUnless(isTipcAvailable(),
4802 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004803class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004804 def __init__(self, methodName = 'runTest'):
4805 unittest.TestCase.__init__(self, methodName = methodName)
4806 ThreadableTest.__init__(self)
4807
4808 def setUp(self):
4809 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004810 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004811 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4812 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4813 TIPC_LOWER, TIPC_UPPER)
4814 self.srv.bind(srvaddr)
4815 self.srv.listen(5)
4816 self.serverExplicitReady()
4817 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004818 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004819
4820 def clientSetUp(self):
4821 # The is a hittable race between serverExplicitReady() and the
4822 # accept() call; sleep a little while to avoid it, otherwise
4823 # we could get an exception
4824 time.sleep(0.1)
4825 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004826 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004827 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4828 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4829 self.cli.connect(addr)
4830 self.cliaddr = self.cli.getsockname()
4831
4832 def testStream(self):
4833 msg = self.conn.recv(1024)
4834 self.assertEqual(msg, MSG)
4835 self.assertEqual(self.cliaddr, self.connaddr)
4836
4837 def _testStream(self):
4838 self.cli.send(MSG)
4839 self.cli.close()
4840
4841
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004842@unittest.skipUnless(thread, 'Threading required for this test.')
4843class ContextManagersTest(ThreadedTCPSocketTest):
4844
4845 def _testSocketClass(self):
4846 # base test
4847 with socket.socket() as sock:
4848 self.assertFalse(sock._closed)
4849 self.assertTrue(sock._closed)
4850 # close inside with block
4851 with socket.socket() as sock:
4852 sock.close()
4853 self.assertTrue(sock._closed)
4854 # exception inside with block
4855 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004856 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004857 self.assertTrue(sock._closed)
4858
4859 def testCreateConnectionBase(self):
4860 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004861 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004862 data = conn.recv(1024)
4863 conn.sendall(data)
4864
4865 def _testCreateConnectionBase(self):
4866 address = self.serv.getsockname()
4867 with socket.create_connection(address) as sock:
4868 self.assertFalse(sock._closed)
4869 sock.sendall(b'foo')
4870 self.assertEqual(sock.recv(1024), b'foo')
4871 self.assertTrue(sock._closed)
4872
4873 def testCreateConnectionClose(self):
4874 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004875 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004876 data = conn.recv(1024)
4877 conn.sendall(data)
4878
4879 def _testCreateConnectionClose(self):
4880 address = self.serv.getsockname()
4881 with socket.create_connection(address) as sock:
4882 sock.close()
4883 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004884 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004885
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004886
Victor Stinnerdaf45552013-08-28 00:53:59 +02004887class InheritanceTest(unittest.TestCase):
4888 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4889 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004890 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004891 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004892 with socket.socket(socket.AF_INET,
4893 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4894 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004895 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004896
4897 def test_default_inheritable(self):
4898 sock = socket.socket()
4899 with sock:
4900 self.assertEqual(sock.get_inheritable(), False)
4901
4902 def test_dup(self):
4903 sock = socket.socket()
4904 with sock:
4905 newsock = sock.dup()
4906 sock.close()
4907 with newsock:
4908 self.assertEqual(newsock.get_inheritable(), False)
4909
4910 def test_set_inheritable(self):
4911 sock = socket.socket()
4912 with sock:
4913 sock.set_inheritable(True)
4914 self.assertEqual(sock.get_inheritable(), True)
4915
4916 sock.set_inheritable(False)
4917 self.assertEqual(sock.get_inheritable(), False)
4918
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004919 @unittest.skipIf(fcntl is None, "need fcntl")
4920 def test_get_inheritable_cloexec(self):
4921 sock = socket.socket()
4922 with sock:
4923 fd = sock.fileno()
4924 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004925
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004926 # clear FD_CLOEXEC flag
4927 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4928 flags &= ~fcntl.FD_CLOEXEC
4929 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004930
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004931 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004932
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004933 @unittest.skipIf(fcntl is None, "need fcntl")
4934 def test_set_inheritable_cloexec(self):
4935 sock = socket.socket()
4936 with sock:
4937 fd = sock.fileno()
4938 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4939 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004940
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004941 sock.set_inheritable(True)
4942 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4943 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004944
4945
Victor Stinnerdaf45552013-08-28 00:53:59 +02004946 @unittest.skipUnless(hasattr(socket, "socketpair"),
4947 "need socket.socketpair()")
4948 def test_socketpair(self):
4949 s1, s2 = socket.socketpair()
4950 self.addCleanup(s1.close)
4951 self.addCleanup(s2.close)
4952 self.assertEqual(s1.get_inheritable(), False)
4953 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004954
4955
4956@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4957 "SOCK_NONBLOCK not defined")
4958class NonblockConstantTest(unittest.TestCase):
4959 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4960 if nonblock:
4961 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4962 self.assertEqual(s.gettimeout(), timeout)
4963 else:
4964 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4965 self.assertEqual(s.gettimeout(), None)
4966
Charles-François Natali239bb962011-06-03 12:55:15 +02004967 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004968 def test_SOCK_NONBLOCK(self):
4969 # a lot of it seems silly and redundant, but I wanted to test that
4970 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004971 with socket.socket(socket.AF_INET,
4972 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4973 self.checkNonblock(s)
4974 s.setblocking(1)
4975 self.checkNonblock(s, False)
4976 s.setblocking(0)
4977 self.checkNonblock(s)
4978 s.settimeout(None)
4979 self.checkNonblock(s, False)
4980 s.settimeout(2.0)
4981 self.checkNonblock(s, timeout=2.0)
4982 s.setblocking(1)
4983 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004984 # defaulttimeout
4985 t = socket.getdefaulttimeout()
4986 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004987 with socket.socket() as s:
4988 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004989 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004990 with socket.socket() as s:
4991 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004992 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004993 with socket.socket() as s:
4994 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004995 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004996 with socket.socket() as s:
4997 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004998 socket.setdefaulttimeout(t)
4999
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005000
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005001@unittest.skipUnless(os.name == "nt", "Windows specific")
5002@unittest.skipUnless(multiprocessing, "need multiprocessing")
5003class TestSocketSharing(SocketTCPTest):
5004 # This must be classmethod and not staticmethod or multiprocessing
5005 # won't be able to bootstrap it.
5006 @classmethod
5007 def remoteProcessServer(cls, q):
5008 # Recreate socket from shared data
5009 sdata = q.get()
5010 message = q.get()
5011
5012 s = socket.fromshare(sdata)
5013 s2, c = s.accept()
5014
5015 # Send the message
5016 s2.sendall(message)
5017 s2.close()
5018 s.close()
5019
5020 def testShare(self):
5021 # Transfer the listening server socket to another process
5022 # and service it from there.
5023
5024 # Create process:
5025 q = multiprocessing.Queue()
5026 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5027 p.start()
5028
5029 # Get the shared socket data
5030 data = self.serv.share(p.pid)
5031
5032 # Pass the shared socket to the other process
5033 addr = self.serv.getsockname()
5034 self.serv.close()
5035 q.put(data)
5036
5037 # The data that the server will send us
5038 message = b"slapmahfro"
5039 q.put(message)
5040
5041 # Connect
5042 s = socket.create_connection(addr)
5043 # listen for the data
5044 m = []
5045 while True:
5046 data = s.recv(100)
5047 if not data:
5048 break
5049 m.append(data)
5050 s.close()
5051 received = b"".join(m)
5052 self.assertEqual(received, message)
5053 p.join()
5054
5055 def testShareLength(self):
5056 data = self.serv.share(os.getpid())
5057 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5058 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5059
5060 def compareSockets(self, org, other):
5061 # socket sharing is expected to work only for blocking socket
5062 # since the internal python timout value isn't transfered.
5063 self.assertEqual(org.gettimeout(), None)
5064 self.assertEqual(org.gettimeout(), other.gettimeout())
5065
5066 self.assertEqual(org.family, other.family)
5067 self.assertEqual(org.type, other.type)
5068 # If the user specified "0" for proto, then
5069 # internally windows will have picked the correct value.
5070 # Python introspection on the socket however will still return
5071 # 0. For the shared socket, the python value is recreated
5072 # from the actual value, so it may not compare correctly.
5073 if org.proto != 0:
5074 self.assertEqual(org.proto, other.proto)
5075
5076 def testShareLocal(self):
5077 data = self.serv.share(os.getpid())
5078 s = socket.fromshare(data)
5079 try:
5080 self.compareSockets(self.serv, s)
5081 finally:
5082 s.close()
5083
5084 def testTypes(self):
5085 families = [socket.AF_INET, socket.AF_INET6]
5086 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5087 for f in families:
5088 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005089 try:
5090 source = socket.socket(f, t)
5091 except OSError:
5092 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005093 try:
5094 data = source.share(os.getpid())
5095 shared = socket.fromshare(data)
5096 try:
5097 self.compareSockets(source, shared)
5098 finally:
5099 shared.close()
5100 finally:
5101 source.close()
5102
5103
Guido van Rossumb995eb72002-07-31 16:08:40 +00005104def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005105 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005106 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005107
5108 tests.extend([
5109 NonBlockingTCPTests,
5110 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005111 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005112 UnbufferedFileObjectClassTestCase,
5113 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005114 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005115 UnicodeReadFileObjectClassTestCase,
5116 UnicodeWriteFileObjectClassTestCase,
5117 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005118 NetworkConnectionNoServer,
5119 NetworkConnectionAttributesTest,
5120 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005121 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005122 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005123 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005124 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005125 tests.append(BasicSocketPairTest)
5126 tests.append(TestUnixDomain)
5127 tests.append(TestLinuxAbstractNamespace)
5128 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005129 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005130 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005131 tests.extend([
5132 CmsgMacroTests,
5133 SendmsgUDPTest,
5134 RecvmsgUDPTest,
5135 RecvmsgIntoUDPTest,
5136 SendmsgUDP6Test,
5137 RecvmsgUDP6Test,
5138 RecvmsgRFC3542AncillaryUDP6Test,
5139 RecvmsgIntoRFC3542AncillaryUDP6Test,
5140 RecvmsgIntoUDP6Test,
5141 SendmsgTCPTest,
5142 RecvmsgTCPTest,
5143 RecvmsgIntoTCPTest,
5144 SendmsgSCTPStreamTest,
5145 RecvmsgSCTPStreamTest,
5146 RecvmsgIntoSCTPStreamTest,
5147 SendmsgUnixStreamTest,
5148 RecvmsgUnixStreamTest,
5149 RecvmsgIntoUnixStreamTest,
5150 RecvmsgSCMRightsStreamTest,
5151 RecvmsgIntoSCMRightsStreamTest,
5152 # These are slow when setitimer() is not available
5153 InterruptedRecvTimeoutTest,
5154 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005155 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005156 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005157
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005158 thread_info = support.threading_setup()
5159 support.run_unittest(*tests)
5160 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005161
5162if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005163 test_main()