blob: b412386c43928dfef62cb9db13ef89079b09aa27 [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
Ethan Furman7184bac2014-10-14 18:56:53 -0700652 def test_SocketType_is_socketobject(self):
653 import _socket
654 self.assertTrue(socket.SocketType is _socket.socket)
655 s = socket.socket()
656 self.assertIsInstance(s, socket.SocketType)
657 s.close()
658
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000659 def test_repr(self):
660 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200661 with s:
662 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000663 self.assertIn('family=%s' % socket.AF_INET, repr(s))
664 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200665 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200666 self.assertNotIn('raddr', repr(s))
667 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200668 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200669 self.assertIn(str(s.getsockname()), repr(s))
670 self.assertIn('[closed]', repr(s))
671 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000672
Victor Stinnere254e532014-07-26 14:36:55 +0200673 @unittest.skipUnless(_socket is not None, 'need _socket module')
674 def test_csocket_repr(self):
675 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
676 try:
677 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
678 % (s.fileno(), s.family, s.type, s.proto))
679 self.assertEqual(repr(s), expected)
680 finally:
681 s.close()
682 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
683 % (s.family, s.type, s.proto))
684 self.assertEqual(repr(s), expected)
685
Raymond Hettinger027bb632004-05-31 03:09:25 +0000686 def test_weakref(self):
687 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
688 p = proxy(s)
689 self.assertEqual(p.fileno(), s.fileno())
690 s.close()
691 s = None
692 try:
693 p.fileno()
694 except ReferenceError:
695 pass
696 else:
697 self.fail('Socket proxy still exists')
698
Guido van Rossum24e4af82002-06-12 19:18:08 +0000699 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000700 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300701 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200702 with self.assertRaises(OSError, msg=msg % 'OSError'):
703 raise OSError
704 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200706 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000708
Ezio Melotti63e42302011-05-07 19:47:48 +0300709 def testSendtoErrors(self):
710 # Testing that sendto doens't masks failures. See #10169.
711 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
712 self.addCleanup(s.close)
713 s.bind(('', 0))
714 sockname = s.getsockname()
715 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300716 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300717 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300718 self.assertEqual(str(cm.exception),
719 "'str' does not support the buffer interface")
720 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300721 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300722 self.assertEqual(str(cm.exception),
723 "'complex' does not support the buffer interface")
724 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300725 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300726 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300727 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300728 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300729 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300730 self.assertEqual(str(cm.exception),
731 "'str' does not support the buffer interface")
732 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300733 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300734 self.assertEqual(str(cm.exception),
735 "'complex' does not support the buffer interface")
736 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300737 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300738 self.assertIn('not NoneType', str(cm.exception))
739 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300740 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300741 self.assertIn('an integer is required', str(cm.exception))
742 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300743 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300744 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300745 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300746 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300747 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300748 self.assertIn('(1 given)', str(cm.exception))
749 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300750 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300751 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300752
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000754 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 socket.AF_INET
756 socket.SOCK_STREAM
757 socket.SOCK_DGRAM
758 socket.SOCK_RAW
759 socket.SOCK_RDM
760 socket.SOCK_SEQPACKET
761 socket.SOL_SOCKET
762 socket.SO_REUSEADDR
763
Guido van Rossum654c11e2002-06-13 20:24:17 +0000764 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000765 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000766 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000767 try:
768 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200769 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000770 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600771 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000772 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000773 try:
774 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200775 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000776 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600777 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000778 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000779 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000780 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000781 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000782
Charles-François Natali0cc86852013-09-13 19:53:08 +0200783 def test_host_resolution(self):
784 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
785 '1:1:1:1:1:1:1:1:1']:
786 self.assertRaises(OSError, socket.gethostbyname, addr)
787 self.assertRaises(OSError, socket.gethostbyaddr, addr)
788
789 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
790 self.assertEqual(socket.gethostbyname(addr), addr)
791
792 # we don't test support.HOSTv6 because there's a chance it doesn't have
793 # a matching name entry (e.g. 'ip6-localhost')
794 for host in [support.HOST]:
795 self.assertIn(host, socket.gethostbyaddr(host)[2])
796
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000797 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
798 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
799 def test_sethostname(self):
800 oldhn = socket.gethostname()
801 try:
802 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200803 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000804 if e.errno == errno.EPERM:
805 self.skipTest("test should be run as root")
806 else:
807 raise
808 try:
809 # running test as root!
810 self.assertEqual(socket.gethostname(), 'new')
811 # Should work with bytes objects too
812 socket.sethostname(b'bar')
813 self.assertEqual(socket.gethostname(), 'bar')
814 finally:
815 socket.sethostname(oldhn)
816
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700817 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
818 'socket.if_nameindex() not available.')
819 def testInterfaceNameIndex(self):
820 interfaces = socket.if_nameindex()
821 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200822 self.assertIsInstance(index, int)
823 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700824 # interface indices are non-zero integers
825 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200826 _index = socket.if_nametoindex(name)
827 self.assertIsInstance(_index, int)
828 self.assertEqual(index, _index)
829 _name = socket.if_indextoname(index)
830 self.assertIsInstance(_name, str)
831 self.assertEqual(name, _name)
832
833 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
834 'socket.if_nameindex() not available.')
835 def testInvalidInterfaceNameIndex(self):
836 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200837 self.assertRaises(OSError, socket.if_indextoname, 0)
838 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200839 # test with invalid values
840 self.assertRaises(TypeError, socket.if_nametoindex, 0)
841 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700842
Serhiy Storchaka43767632013-11-03 21:31:38 +0200843 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
844 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000845 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000846 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200847 try:
848 # On some versions, this loses a reference
849 orig = sys.getrefcount(__name__)
850 socket.getnameinfo(__name__,0)
851 except TypeError:
852 if sys.getrefcount(__name__) != orig:
853 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000854
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000856 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 try:
858 # On some versions, this crashes the interpreter.
859 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200860 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000862
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000863 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000864 # This just checks that htons etc. are their own inverse,
865 # when looking at the lower 16 or 32 bits.
866 sizes = {socket.htonl: 32, socket.ntohl: 32,
867 socket.htons: 16, socket.ntohs: 16}
868 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000869 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000870 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
871 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000872
Guido van Rossuma2627af2002-09-14 00:58:46 +0000873 swapped = func(mask)
874 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000875 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000876
Guido van Rossum018919a2007-01-15 00:07:32 +0000877 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000878 good_values = [ 1, 2, 3, 1, 2, 3 ]
879 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000880 for k in good_values:
881 socket.ntohl(k)
882 socket.ntohs(k)
883 socket.htonl(k)
884 socket.htons(k)
885 for k in bad_values:
886 self.assertRaises(OverflowError, socket.ntohl, k)
887 self.assertRaises(OverflowError, socket.ntohs, k)
888 self.assertRaises(OverflowError, socket.htonl, k)
889 self.assertRaises(OverflowError, socket.htons, k)
890
Barry Warsaw11b91a02004-06-28 00:50:43 +0000891 def testGetServBy(self):
892 eq = self.assertEqual
893 # Find one service that exists, then check all the related interfaces.
894 # I've ordered this by protocols that have both a tcp and udp
895 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200896 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200897 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000898 # avoid the 'echo' service on this platform, as there is an
899 # assumption breaking non-standard port/protocol entry
900 services = ('daytime', 'qotd', 'domain')
901 else:
902 services = ('echo', 'daytime', 'domain')
903 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000904 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000905 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000906 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200907 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000908 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000909 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200910 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000911 # Try same call with optional protocol omitted
912 port2 = socket.getservbyname(service)
913 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400914 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000915 try:
916 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200917 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000918 udpport = None
919 else:
920 eq(udpport, port)
921 # Now make sure the lookup by port returns the same service name
922 eq(socket.getservbyport(port2), service)
923 eq(socket.getservbyport(port, 'tcp'), service)
924 if udpport is not None:
925 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000926 # Make sure getservbyport does not accept out of range ports.
927 self.assertRaises(OverflowError, socket.getservbyport, -1)
928 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000930 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000931 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000932 # The default timeout should initially be None
933 self.assertEqual(socket.getdefaulttimeout(), None)
934 s = socket.socket()
935 self.assertEqual(s.gettimeout(), None)
936 s.close()
937
938 # Set the default timeout to 10, and see if it propagates
939 socket.setdefaulttimeout(10)
940 self.assertEqual(socket.getdefaulttimeout(), 10)
941 s = socket.socket()
942 self.assertEqual(s.gettimeout(), 10)
943 s.close()
944
945 # Reset the default timeout to None, and see if it propagates
946 socket.setdefaulttimeout(None)
947 self.assertEqual(socket.getdefaulttimeout(), None)
948 s = socket.socket()
949 self.assertEqual(s.gettimeout(), None)
950 s.close()
951
952 # Check that setting it to an invalid value raises ValueError
953 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
954
955 # Check that setting it to an invalid type raises TypeError
956 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
957
Serhiy Storchaka43767632013-11-03 21:31:38 +0200958 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
959 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000960 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000961 # Test that issue1008086 and issue767150 are fixed.
962 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000963 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
964 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000965
Serhiy Storchaka43767632013-11-03 21:31:38 +0200966 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
967 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000968 def testIPv4toString(self):
969 from socket import inet_aton as f, inet_pton, AF_INET
970 g = lambda a: inet_pton(AF_INET, a)
971
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100972 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200973 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100974 )
975
Ezio Melottib3aedd42010-11-20 19:04:17 +0000976 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
977 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
978 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
979 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
980 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100981 assertInvalid(f, '0.0.0.')
982 assertInvalid(f, '300.0.0.0')
983 assertInvalid(f, 'a.0.0.0')
984 assertInvalid(f, '1.2.3.4.5')
985 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000986
Ezio Melottib3aedd42010-11-20 19:04:17 +0000987 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
988 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
989 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
990 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100991 assertInvalid(g, '0.0.0.')
992 assertInvalid(g, '300.0.0.0')
993 assertInvalid(g, 'a.0.0.0')
994 assertInvalid(g, '1.2.3.4.5')
995 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000996
Serhiy Storchaka43767632013-11-03 21:31:38 +0200997 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
998 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000999 def testIPv6toString(self):
1000 try:
1001 from socket import inet_pton, AF_INET6, has_ipv6
1002 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001003 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001004 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001005 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001006
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001007 if sys.platform == "win32":
1008 try:
1009 inet_pton(AF_INET6, '::')
1010 except OSError as e:
1011 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001012 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001013
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001014 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001015 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001016 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001017 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001018
Ezio Melottib3aedd42010-11-20 19:04:17 +00001019 self.assertEqual(b'\x00' * 16, f('::'))
1020 self.assertEqual(b'\x00' * 16, f('0::0'))
1021 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1022 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001023 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 +00001024 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1025 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001026 self.assertEqual(
1027 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1028 f('ad42:abc::127:0:254:2')
1029 )
1030 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1031 assertInvalid('0x20::')
1032 assertInvalid(':::')
1033 assertInvalid('::0::')
1034 assertInvalid('1::abc::')
1035 assertInvalid('1::abc::def')
1036 assertInvalid('1:2:3:4:5:6:')
1037 assertInvalid('1:2:3:4:5:6')
1038 assertInvalid('1:2:3:4:5:6:7:8:')
1039 assertInvalid('1:2:3:4:5:6:7:8:0')
1040
1041 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1042 f('::254.42.23.64')
1043 )
1044 self.assertEqual(
1045 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1046 f('42::a29b:254.42.23.64')
1047 )
1048 self.assertEqual(
1049 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1050 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1051 )
1052 assertInvalid('255.254.253.252')
1053 assertInvalid('1::260.2.3.0')
1054 assertInvalid('1::0.be.e.0')
1055 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1056 assertInvalid('::1.2.3.4:0')
1057 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001058
Serhiy Storchaka43767632013-11-03 21:31:38 +02001059 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1060 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001061 def testStringToIPv4(self):
1062 from socket import inet_ntoa as f, inet_ntop, AF_INET
1063 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001064 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001065 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001066 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001067
Ezio Melottib3aedd42010-11-20 19:04:17 +00001068 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1069 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1070 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1071 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001072 assertInvalid(f, b'\x00' * 3)
1073 assertInvalid(f, b'\x00' * 5)
1074 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +00001075
Ezio Melottib3aedd42010-11-20 19:04:17 +00001076 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1077 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1078 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001079 assertInvalid(g, b'\x00' * 3)
1080 assertInvalid(g, b'\x00' * 5)
1081 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001082
Serhiy Storchaka43767632013-11-03 21:31:38 +02001083 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1084 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001085 def testStringToIPv6(self):
1086 try:
1087 from socket import inet_ntop, AF_INET6, has_ipv6
1088 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001089 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001090 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001091 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001092
1093 if sys.platform == "win32":
1094 try:
1095 inet_ntop(AF_INET6, b'\x00' * 16)
1096 except OSError as e:
1097 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001098 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001099
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001100 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001101 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001102 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001103 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001104
Ezio Melottib3aedd42010-11-20 19:04:17 +00001105 self.assertEqual('::', f(b'\x00' * 16))
1106 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1107 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001108 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001109 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 +00001110 )
1111
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001112 assertInvalid(b'\x12' * 15)
1113 assertInvalid(b'\x12' * 17)
1114 assertInvalid(b'\x12' * 4)
1115
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001116 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001117
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001118 def testSockName(self):
1119 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001120 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001121 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001122 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001123 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001124 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001125 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1126 # it reasonable to get the host's addr in addition to 0.0.0.0.
1127 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001128 try:
1129 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001130 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001131 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001132 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001133 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001134 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001135
1136 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001137 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001138 # We know a socket should start without reuse==0
1139 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 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001142 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143
1144 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001145 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001146 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001147 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001148 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1149 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001150 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001151
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001152 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001153 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001154 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1155 sock.settimeout(1)
1156 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001157 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001158
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001159 def testNewAttributes(self):
1160 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001161
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001162 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1163 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001164 if hasattr(socket, 'SOCK_CLOEXEC'):
1165 self.assertIn(sock.type,
1166 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1167 socket.SOCK_STREAM))
1168 else:
1169 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001170 self.assertEqual(sock.proto, 0)
1171 sock.close()
1172
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001173 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001174 sock = socket.socket()
1175 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001176 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001177 big_port = port + 65536
1178 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001179 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1180 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1181 # Since find_unused_port() is inherently subject to race conditions, we
1182 # call it a couple times if necessary.
1183 for i in itertools.count():
1184 port = support.find_unused_port()
1185 try:
1186 sock.bind((HOST, port))
1187 except OSError as e:
1188 if e.errno != errno.EADDRINUSE or i == 5:
1189 raise
1190 else:
1191 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001192
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001193 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001194 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001195 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1196 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1197 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1198 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001199 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1200 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001201 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001202 self.assertRaises(ValueError, s.ioctl, -1, None)
1203 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001204
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001205 def testGetaddrinfo(self):
1206 try:
1207 socket.getaddrinfo('localhost', 80)
1208 except socket.gaierror as err:
1209 if err.errno == socket.EAI_SERVICE:
1210 # see http://bugs.python.org/issue1282647
1211 self.skipTest("buggy libc version")
1212 raise
1213 # len of every sequence is supposed to be == 5
1214 for info in socket.getaddrinfo(HOST, None):
1215 self.assertEqual(len(info), 5)
1216 # host can be a domain name, a string representation of an
1217 # IPv4/v6 address or None
1218 socket.getaddrinfo('localhost', 80)
1219 socket.getaddrinfo('127.0.0.1', 80)
1220 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001221 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001222 socket.getaddrinfo('::1', 80)
1223 # port can be a string service name such as "http", a numeric
1224 # port number or None
1225 socket.getaddrinfo(HOST, "http")
1226 socket.getaddrinfo(HOST, 80)
1227 socket.getaddrinfo(HOST, None)
1228 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001229 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1230 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001231 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001232 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1233 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001234 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001235 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1236 for _, socktype, _, _, _ in infos:
1237 self.assertEqual(socktype, socket.SOCK_STREAM)
1238 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001239 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001240 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1241 # a server willing to support both IPv4 and IPv6 will
1242 # usually do this
1243 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1244 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001245 # test keyword arguments
1246 a = socket.getaddrinfo(HOST, None)
1247 b = socket.getaddrinfo(host=HOST, port=None)
1248 self.assertEqual(a, b)
1249 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1250 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1251 self.assertEqual(a, b)
1252 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1253 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1254 self.assertEqual(a, b)
1255 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1256 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1257 self.assertEqual(a, b)
1258 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1259 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1260 self.assertEqual(a, b)
1261 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1262 socket.AI_PASSIVE)
1263 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1264 type=socket.SOCK_STREAM, proto=0,
1265 flags=socket.AI_PASSIVE)
1266 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001267 # Issue #6697.
1268 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001269
Ned Deilyb24f4812014-02-13 22:50:42 -08001270 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001271 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001272 try:
1273 # The arguments here are undefined and the call may succeed
1274 # or fail. All we care here is that it doesn't segfault.
1275 socket.getaddrinfo("localhost", None, 0, 0, 0,
1276 socket.AI_NUMERICSERV)
1277 except socket.gaierror:
1278 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001279
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001280 def test_getnameinfo(self):
1281 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001282 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001283
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001284 @unittest.skipUnless(support.is_resource_enabled('network'),
1285 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001286 def test_idna(self):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001287 # Check for internet access before running test (issue #12804).
1288 try:
1289 socket.gethostbyname('python.org')
1290 except socket.gaierror as e:
1291 if e.errno == socket.EAI_NODATA:
1292 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001293 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001294 domain = 'испытание.pythontest.net'
1295 socket.gethostbyname(domain)
1296 socket.gethostbyname_ex(domain)
1297 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001298 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1299 # have a reverse entry yet
1300 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001301
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001302 def check_sendall_interrupted(self, with_timeout):
1303 # socketpair() is not stricly required, but it makes things easier.
1304 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1305 self.skipTest("signal.alarm and socket.socketpair required for this test")
1306 # Our signal handlers clobber the C errno by calling a math function
1307 # with an invalid domain value.
1308 def ok_handler(*args):
1309 self.assertRaises(ValueError, math.acosh, 0)
1310 def raising_handler(*args):
1311 self.assertRaises(ValueError, math.acosh, 0)
1312 1 // 0
1313 c, s = socket.socketpair()
1314 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1315 try:
1316 if with_timeout:
1317 # Just above the one second minimum for signal.alarm
1318 c.settimeout(1.5)
1319 with self.assertRaises(ZeroDivisionError):
1320 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001321 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001322 if with_timeout:
1323 signal.signal(signal.SIGALRM, ok_handler)
1324 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001325 self.assertRaises(socket.timeout, c.sendall,
1326 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001327 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001328 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001329 signal.signal(signal.SIGALRM, old_alarm)
1330 c.close()
1331 s.close()
1332
1333 def test_sendall_interrupted(self):
1334 self.check_sendall_interrupted(False)
1335
1336 def test_sendall_interrupted_with_timeout(self):
1337 self.check_sendall_interrupted(True)
1338
Antoine Pitroue033e062010-10-29 10:38:18 +00001339 def test_dealloc_warn(self):
1340 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1341 r = repr(sock)
1342 with self.assertWarns(ResourceWarning) as cm:
1343 sock = None
1344 support.gc_collect()
1345 self.assertIn(r, str(cm.warning.args[0]))
1346 # An open socket file object gets dereferenced after the socket
1347 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1348 f = sock.makefile('rb')
1349 r = repr(sock)
1350 sock = None
1351 support.gc_collect()
1352 with self.assertWarns(ResourceWarning):
1353 f = None
1354 support.gc_collect()
1355
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001356 def test_name_closed_socketio(self):
1357 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1358 fp = sock.makefile("rb")
1359 fp.close()
1360 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1361
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001362 def test_unusable_closed_socketio(self):
1363 with socket.socket() as sock:
1364 fp = sock.makefile("rb", buffering=0)
1365 self.assertTrue(fp.readable())
1366 self.assertFalse(fp.writable())
1367 self.assertFalse(fp.seekable())
1368 fp.close()
1369 self.assertRaises(ValueError, fp.readable)
1370 self.assertRaises(ValueError, fp.writable)
1371 self.assertRaises(ValueError, fp.seekable)
1372
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001373 def test_pickle(self):
1374 sock = socket.socket()
1375 with sock:
1376 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1377 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1378
Serhiy Storchaka78980432013-01-15 01:12:17 +02001379 def test_listen_backlog(self):
1380 for backlog in 0, -1:
1381 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1382 srv.bind((HOST, 0))
1383 srv.listen(backlog)
1384 srv.close()
1385
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001386 @support.cpython_only
1387 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001388 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001389 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001390 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1391 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001392 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001393 srv.close()
1394
Charles-François Natali42663332012-01-02 15:57:30 +01001395 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001396 def test_flowinfo(self):
1397 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001398 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001399 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001400 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001401
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001402 def test_str_for_enums(self):
1403 # Make sure that the AF_* and SOCK_* constants have enum-like string
1404 # reprs.
1405 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1406 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001407 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001408
1409 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1410 def test_uknown_socket_family_repr(self):
1411 # Test that when created with a family that's not one of the known
1412 # AF_*/SOCK_* constants, socket.family just returns the number.
1413 #
1414 # To do this we fool socket.socket into believing it already has an
1415 # open fd because on this path it doesn't actually verify the family and
1416 # type and populates the socket object.
1417 #
1418 # On Windows this trick won't work, so the test is skipped.
1419 fd, _ = tempfile.mkstemp()
1420 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1421 self.assertEqual(s.family, 42424)
1422 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001423
Charles-François Natali47413c12011-10-06 19:47:44 +02001424@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1425class BasicCANTest(unittest.TestCase):
1426
1427 def testCrucialConstants(self):
1428 socket.AF_CAN
1429 socket.PF_CAN
1430 socket.CAN_RAW
1431
Charles-François Natali773e42d2013-02-05 19:42:01 +01001432 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1433 'socket.CAN_BCM required for this test.')
1434 def testBCMConstants(self):
1435 socket.CAN_BCM
1436
1437 # opcodes
1438 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1439 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1440 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1441 socket.CAN_BCM_TX_SEND # send one CAN frame
1442 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1443 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1444 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1445 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1446 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1447 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1448 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1449 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1450
Charles-François Natali47413c12011-10-06 19:47:44 +02001451 def testCreateSocket(self):
1452 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1453 pass
1454
Charles-François Natali773e42d2013-02-05 19:42:01 +01001455 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1456 'socket.CAN_BCM required for this test.')
1457 def testCreateBCMSocket(self):
1458 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1459 pass
1460
Charles-François Natali47413c12011-10-06 19:47:44 +02001461 def testBindAny(self):
1462 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1463 s.bind(('', ))
1464
1465 def testTooLongInterfaceName(self):
1466 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1467 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001468 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001469 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001470
1471 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1472 'socket.CAN_RAW_LOOPBACK required for this test.')
1473 def testLoopback(self):
1474 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1475 for loopback in (0, 1):
1476 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1477 loopback)
1478 self.assertEqual(loopback,
1479 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1480
1481 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1482 'socket.CAN_RAW_FILTER required for this test.')
1483 def testFilter(self):
1484 can_id, can_mask = 0x200, 0x700
1485 can_filter = struct.pack("=II", can_id, can_mask)
1486 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1487 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1488 self.assertEqual(can_filter,
1489 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1490
1491
1492@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001493@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001494class CANTest(ThreadedCANSocketTest):
1495
Charles-François Natali47413c12011-10-06 19:47:44 +02001496 def __init__(self, methodName='runTest'):
1497 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1498
1499 @classmethod
1500 def build_can_frame(cls, can_id, data):
1501 """Build a CAN frame."""
1502 can_dlc = len(data)
1503 data = data.ljust(8, b'\x00')
1504 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1505
1506 @classmethod
1507 def dissect_can_frame(cls, frame):
1508 """Dissect a CAN frame."""
1509 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1510 return (can_id, can_dlc, data[:can_dlc])
1511
1512 def testSendFrame(self):
1513 cf, addr = self.s.recvfrom(self.bufsize)
1514 self.assertEqual(self.cf, cf)
1515 self.assertEqual(addr[0], self.interface)
1516 self.assertEqual(addr[1], socket.AF_CAN)
1517
1518 def _testSendFrame(self):
1519 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1520 self.cli.send(self.cf)
1521
1522 def testSendMaxFrame(self):
1523 cf, addr = self.s.recvfrom(self.bufsize)
1524 self.assertEqual(self.cf, cf)
1525
1526 def _testSendMaxFrame(self):
1527 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1528 self.cli.send(self.cf)
1529
1530 def testSendMultiFrames(self):
1531 cf, addr = self.s.recvfrom(self.bufsize)
1532 self.assertEqual(self.cf1, cf)
1533
1534 cf, addr = self.s.recvfrom(self.bufsize)
1535 self.assertEqual(self.cf2, cf)
1536
1537 def _testSendMultiFrames(self):
1538 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1539 self.cli.send(self.cf1)
1540
1541 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1542 self.cli.send(self.cf2)
1543
Charles-François Natali773e42d2013-02-05 19:42:01 +01001544 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1545 'socket.CAN_BCM required for this test.')
1546 def _testBCM(self):
1547 cf, addr = self.cli.recvfrom(self.bufsize)
1548 self.assertEqual(self.cf, cf)
1549 can_id, can_dlc, data = self.dissect_can_frame(cf)
1550 self.assertEqual(self.can_id, can_id)
1551 self.assertEqual(self.data, data)
1552
1553 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1554 'socket.CAN_BCM required for this test.')
1555 def testBCM(self):
1556 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1557 self.addCleanup(bcm.close)
1558 bcm.connect((self.interface,))
1559 self.can_id = 0x123
1560 self.data = bytes([0xc0, 0xff, 0xee])
1561 self.cf = self.build_can_frame(self.can_id, self.data)
1562 opcode = socket.CAN_BCM_TX_SEND
1563 flags = 0
1564 count = 0
1565 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1566 bcm_can_id = 0x0222
1567 nframes = 1
1568 assert len(self.cf) == 16
1569 header = struct.pack(self.bcm_cmd_msg_fmt,
1570 opcode,
1571 flags,
1572 count,
1573 ival1_seconds,
1574 ival1_usec,
1575 ival2_seconds,
1576 ival2_usec,
1577 bcm_can_id,
1578 nframes,
1579 )
1580 header_plus_frame = header + self.cf
1581 bytes_sent = bcm.send(header_plus_frame)
1582 self.assertEqual(bytes_sent, len(header_plus_frame))
1583
Charles-François Natali47413c12011-10-06 19:47:44 +02001584
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001585@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1586class BasicRDSTest(unittest.TestCase):
1587
1588 def testCrucialConstants(self):
1589 socket.AF_RDS
1590 socket.PF_RDS
1591
1592 def testCreateSocket(self):
1593 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1594 pass
1595
1596 def testSocketBufferSize(self):
1597 bufsize = 16384
1598 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1599 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1600 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1601
1602
1603@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1604@unittest.skipUnless(thread, 'Threading required for this test.')
1605class RDSTest(ThreadedRDSSocketTest):
1606
1607 def __init__(self, methodName='runTest'):
1608 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1609
Charles-François Natali240c55f2011-11-10 20:33:36 +01001610 def setUp(self):
1611 super().setUp()
1612 self.evt = threading.Event()
1613
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001614 def testSendAndRecv(self):
1615 data, addr = self.serv.recvfrom(self.bufsize)
1616 self.assertEqual(self.data, data)
1617 self.assertEqual(self.cli_addr, addr)
1618
1619 def _testSendAndRecv(self):
1620 self.data = b'spam'
1621 self.cli.sendto(self.data, 0, (HOST, self.port))
1622
1623 def testPeek(self):
1624 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1625 self.assertEqual(self.data, data)
1626 data, addr = self.serv.recvfrom(self.bufsize)
1627 self.assertEqual(self.data, data)
1628
1629 def _testPeek(self):
1630 self.data = b'spam'
1631 self.cli.sendto(self.data, 0, (HOST, self.port))
1632
1633 @requireAttrs(socket.socket, 'recvmsg')
1634 def testSendAndRecvMsg(self):
1635 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1636 self.assertEqual(self.data, data)
1637
1638 @requireAttrs(socket.socket, 'sendmsg')
1639 def _testSendAndRecvMsg(self):
1640 self.data = b'hello ' * 10
1641 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1642
1643 def testSendAndRecvMulti(self):
1644 data, addr = self.serv.recvfrom(self.bufsize)
1645 self.assertEqual(self.data1, data)
1646
1647 data, addr = self.serv.recvfrom(self.bufsize)
1648 self.assertEqual(self.data2, data)
1649
1650 def _testSendAndRecvMulti(self):
1651 self.data1 = b'bacon'
1652 self.cli.sendto(self.data1, 0, (HOST, self.port))
1653
1654 self.data2 = b'egg'
1655 self.cli.sendto(self.data2, 0, (HOST, self.port))
1656
1657 def testSelect(self):
1658 r, w, x = select.select([self.serv], [], [], 3.0)
1659 self.assertIn(self.serv, r)
1660 data, addr = self.serv.recvfrom(self.bufsize)
1661 self.assertEqual(self.data, data)
1662
1663 def _testSelect(self):
1664 self.data = b'select'
1665 self.cli.sendto(self.data, 0, (HOST, self.port))
1666
1667 def testCongestion(self):
1668 # wait until the sender is done
1669 self.evt.wait()
1670
1671 def _testCongestion(self):
1672 # test the behavior in case of congestion
1673 self.data = b'fill'
1674 self.cli.setblocking(False)
1675 try:
1676 # try to lower the receiver's socket buffer size
1677 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1678 except OSError:
1679 pass
1680 with self.assertRaises(OSError) as cm:
1681 try:
1682 # fill the receiver's socket buffer
1683 while True:
1684 self.cli.sendto(self.data, 0, (HOST, self.port))
1685 finally:
1686 # signal the receiver we're done
1687 self.evt.set()
1688 # sendto() should have failed with ENOBUFS
1689 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1690 # and we should have received a congestion notification through poll
1691 r, w, x = select.select([self.serv], [], [], 3.0)
1692 self.assertIn(self.serv, r)
1693
1694
Victor Stinner45df8202010-04-28 22:31:17 +00001695@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001696class BasicTCPTest(SocketConnectedTest):
1697
1698 def __init__(self, methodName='runTest'):
1699 SocketConnectedTest.__init__(self, methodName=methodName)
1700
1701 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001702 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001703 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001704 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001705
1706 def _testRecv(self):
1707 self.serv_conn.send(MSG)
1708
1709 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001710 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001711 seg1 = self.cli_conn.recv(len(MSG) - 3)
1712 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001713 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001714 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001715
1716 def _testOverFlowRecv(self):
1717 self.serv_conn.send(MSG)
1718
1719 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001720 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001721 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001722 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001723
1724 def _testRecvFrom(self):
1725 self.serv_conn.send(MSG)
1726
1727 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001728 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001729 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1730 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001731 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001732 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001733
1734 def _testOverFlowRecvFrom(self):
1735 self.serv_conn.send(MSG)
1736
1737 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001738 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001739 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001740 while 1:
1741 read = self.cli_conn.recv(1024)
1742 if not read:
1743 break
Guido van Rossume531e292002-08-08 20:28:34 +00001744 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001745 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001746
1747 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001748 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001749 self.serv_conn.sendall(big_chunk)
1750
1751 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001752 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001753 fd = self.cli_conn.fileno()
1754 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001755 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001756 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001757 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001758 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001759
1760 def _testFromFd(self):
1761 self.serv_conn.send(MSG)
1762
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001763 def testDup(self):
1764 # Testing dup()
1765 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001766 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001767 msg = sock.recv(1024)
1768 self.assertEqual(msg, MSG)
1769
1770 def _testDup(self):
1771 self.serv_conn.send(MSG)
1772
Guido van Rossum24e4af82002-06-12 19:18:08 +00001773 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001774 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001775 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001776 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001777 # wait for _testShutdown to finish: on OS X, when the server
1778 # closes the connection the client also becomes disconnected,
1779 # and the client's shutdown call will fail. (Issue #4397.)
1780 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001781
1782 def _testShutdown(self):
1783 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001784 self.serv_conn.shutdown(2)
1785
1786 testShutdown_overflow = support.cpython_only(testShutdown)
1787
1788 @support.cpython_only
1789 def _testShutdown_overflow(self):
1790 import _testcapi
1791 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001792 # Issue 15989
1793 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1794 _testcapi.INT_MAX + 1)
1795 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1796 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001797 self.serv_conn.shutdown(2)
1798
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001799 def testDetach(self):
1800 # Testing detach()
1801 fileno = self.cli_conn.fileno()
1802 f = self.cli_conn.detach()
1803 self.assertEqual(f, fileno)
1804 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001805 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001806 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001807 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001808 # ...but we can create another socket using the (still open)
1809 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001810 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001811 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001812 msg = sock.recv(1024)
1813 self.assertEqual(msg, MSG)
1814
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001815 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001816 self.serv_conn.send(MSG)
1817
Victor Stinner45df8202010-04-28 22:31:17 +00001818@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001819class BasicUDPTest(ThreadedUDPSocketTest):
1820
1821 def __init__(self, methodName='runTest'):
1822 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1823
1824 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001825 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001826 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001827 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001828
1829 def _testSendtoAndRecv(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 Rossum1c938012002-06-12 21:17:20 +00001832 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001833 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001834 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001835 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001836
Guido van Rossum1c938012002-06-12 21:17:20 +00001837 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001838 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001839
Guido van Rossumd8faa362007-04-27 19:54:29 +00001840 def testRecvFromNegative(self):
1841 # Negative lengths passed to recvfrom should give ValueError.
1842 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1843
1844 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001845 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001846
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001847# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1848# same test code is used with different families and types of socket
1849# (e.g. stream, datagram), and tests using recvmsg() are repeated
1850# using recvmsg_into().
1851#
1852# The generic test classes such as SendmsgTests and
1853# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1854# supplied with sockets cli_sock and serv_sock representing the
1855# client's and the server's end of the connection respectively, and
1856# attributes cli_addr and serv_addr holding their (numeric where
1857# appropriate) addresses.
1858#
1859# The final concrete test classes combine these with subclasses of
1860# SocketTestBase which set up client and server sockets of a specific
1861# type, and with subclasses of SendrecvmsgBase such as
1862# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1863# sockets to cli_sock and serv_sock and override the methods and
1864# attributes of SendrecvmsgBase to fill in destination addresses if
1865# needed when sending, check for specific flags in msg_flags, etc.
1866#
1867# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1868# recvmsg_into().
1869
1870# XXX: like the other datagram (UDP) tests in this module, the code
1871# here assumes that datagram delivery on the local machine will be
1872# reliable.
1873
1874class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1875 # Base class for sendmsg()/recvmsg() tests.
1876
1877 # Time in seconds to wait before considering a test failed, or
1878 # None for no timeout. Not all tests actually set a timeout.
1879 fail_timeout = 3.0
1880
1881 def setUp(self):
1882 self.misc_event = threading.Event()
1883 super().setUp()
1884
1885 def sendToServer(self, msg):
1886 # Send msg to the server.
1887 return self.cli_sock.send(msg)
1888
1889 # Tuple of alternative default arguments for sendmsg() when called
1890 # via sendmsgToServer() (e.g. to include a destination address).
1891 sendmsg_to_server_defaults = ()
1892
1893 def sendmsgToServer(self, *args):
1894 # Call sendmsg() on self.cli_sock with the given arguments,
1895 # filling in any arguments which are not supplied with the
1896 # corresponding items of self.sendmsg_to_server_defaults, if
1897 # any.
1898 return self.cli_sock.sendmsg(
1899 *(args + self.sendmsg_to_server_defaults[len(args):]))
1900
1901 def doRecvmsg(self, sock, bufsize, *args):
1902 # Call recvmsg() on sock with given arguments and return its
1903 # result. Should be used for tests which can use either
1904 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1905 # this method with one which emulates it using recvmsg_into(),
1906 # thus allowing the same test to be used for both methods.
1907 result = sock.recvmsg(bufsize, *args)
1908 self.registerRecvmsgResult(result)
1909 return result
1910
1911 def registerRecvmsgResult(self, result):
1912 # Called by doRecvmsg() with the return value of recvmsg() or
1913 # recvmsg_into(). Can be overridden to arrange cleanup based
1914 # on the returned ancillary data, for instance.
1915 pass
1916
1917 def checkRecvmsgAddress(self, addr1, addr2):
1918 # Called to compare the received address with the address of
1919 # the peer.
1920 self.assertEqual(addr1, addr2)
1921
1922 # Flags that are normally unset in msg_flags
1923 msg_flags_common_unset = 0
1924 for name in ("MSG_CTRUNC", "MSG_OOB"):
1925 msg_flags_common_unset |= getattr(socket, name, 0)
1926
1927 # Flags that are normally set
1928 msg_flags_common_set = 0
1929
1930 # Flags set when a complete record has been received (e.g. MSG_EOR
1931 # for SCTP)
1932 msg_flags_eor_indicator = 0
1933
1934 # Flags set when a complete record has not been received
1935 # (e.g. MSG_TRUNC for datagram sockets)
1936 msg_flags_non_eor_indicator = 0
1937
1938 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1939 # Method to check the value of msg_flags returned by recvmsg[_into]().
1940 #
1941 # Checks that all bits in msg_flags_common_set attribute are
1942 # set in "flags" and all bits in msg_flags_common_unset are
1943 # unset.
1944 #
1945 # The "eor" argument specifies whether the flags should
1946 # indicate that a full record (or datagram) has been received.
1947 # If "eor" is None, no checks are done; otherwise, checks
1948 # that:
1949 #
1950 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1951 # set and all bits in msg_flags_non_eor_indicator are unset
1952 #
1953 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1954 # are set and all bits in msg_flags_eor_indicator are unset
1955 #
1956 # If "checkset" and/or "checkunset" are supplied, they require
1957 # the given bits to be set or unset respectively, overriding
1958 # what the attributes require for those bits.
1959 #
1960 # If any bits are set in "ignore", they will not be checked,
1961 # regardless of the other inputs.
1962 #
1963 # Will raise Exception if the inputs require a bit to be both
1964 # set and unset, and it is not ignored.
1965
1966 defaultset = self.msg_flags_common_set
1967 defaultunset = self.msg_flags_common_unset
1968
1969 if eor:
1970 defaultset |= self.msg_flags_eor_indicator
1971 defaultunset |= self.msg_flags_non_eor_indicator
1972 elif eor is not None:
1973 defaultset |= self.msg_flags_non_eor_indicator
1974 defaultunset |= self.msg_flags_eor_indicator
1975
1976 # Function arguments override defaults
1977 defaultset &= ~checkunset
1978 defaultunset &= ~checkset
1979
1980 # Merge arguments with remaining defaults, and check for conflicts
1981 checkset |= defaultset
1982 checkunset |= defaultunset
1983 inboth = checkset & checkunset & ~ignore
1984 if inboth:
1985 raise Exception("contradictory set, unset requirements for flags "
1986 "{0:#x}".format(inboth))
1987
1988 # Compare with given msg_flags value
1989 mask = (checkset | checkunset) & ~ignore
1990 self.assertEqual(flags & mask, checkset & mask)
1991
1992
1993class RecvmsgIntoMixin(SendrecvmsgBase):
1994 # Mixin to implement doRecvmsg() using recvmsg_into().
1995
1996 def doRecvmsg(self, sock, bufsize, *args):
1997 buf = bytearray(bufsize)
1998 result = sock.recvmsg_into([buf], *args)
1999 self.registerRecvmsgResult(result)
2000 self.assertGreaterEqual(result[0], 0)
2001 self.assertLessEqual(result[0], bufsize)
2002 return (bytes(buf[:result[0]]),) + result[1:]
2003
2004
2005class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2006 # Defines flags to be checked in msg_flags for datagram sockets.
2007
2008 @property
2009 def msg_flags_non_eor_indicator(self):
2010 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2011
2012
2013class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2014 # Defines flags to be checked in msg_flags for SCTP sockets.
2015
2016 @property
2017 def msg_flags_eor_indicator(self):
2018 return super().msg_flags_eor_indicator | socket.MSG_EOR
2019
2020
2021class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2022 # Base class for tests on connectionless-mode sockets. Users must
2023 # supply sockets on attributes cli and serv to be mapped to
2024 # cli_sock and serv_sock respectively.
2025
2026 @property
2027 def serv_sock(self):
2028 return self.serv
2029
2030 @property
2031 def cli_sock(self):
2032 return self.cli
2033
2034 @property
2035 def sendmsg_to_server_defaults(self):
2036 return ([], [], 0, self.serv_addr)
2037
2038 def sendToServer(self, msg):
2039 return self.cli_sock.sendto(msg, self.serv_addr)
2040
2041
2042class SendrecvmsgConnectedBase(SendrecvmsgBase):
2043 # Base class for tests on connected sockets. Users must supply
2044 # sockets on attributes serv_conn and cli_conn (representing the
2045 # connections *to* the server and the client), to be mapped to
2046 # cli_sock and serv_sock respectively.
2047
2048 @property
2049 def serv_sock(self):
2050 return self.cli_conn
2051
2052 @property
2053 def cli_sock(self):
2054 return self.serv_conn
2055
2056 def checkRecvmsgAddress(self, addr1, addr2):
2057 # Address is currently "unspecified" for a connected socket,
2058 # so we don't examine it
2059 pass
2060
2061
2062class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2063 # Base class to set a timeout on server's socket.
2064
2065 def setUp(self):
2066 super().setUp()
2067 self.serv_sock.settimeout(self.fail_timeout)
2068
2069
2070class SendmsgTests(SendrecvmsgServerTimeoutBase):
2071 # Tests for sendmsg() which can use any socket type and do not
2072 # involve recvmsg() or recvmsg_into().
2073
2074 def testSendmsg(self):
2075 # Send a simple message with sendmsg().
2076 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2077
2078 def _testSendmsg(self):
2079 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2080
2081 def testSendmsgDataGenerator(self):
2082 # Send from buffer obtained from a generator (not a sequence).
2083 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2084
2085 def _testSendmsgDataGenerator(self):
2086 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2087 len(MSG))
2088
2089 def testSendmsgAncillaryGenerator(self):
2090 # Gather (empty) ancillary data from a generator.
2091 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2092
2093 def _testSendmsgAncillaryGenerator(self):
2094 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2095 len(MSG))
2096
2097 def testSendmsgArray(self):
2098 # Send data from an array instead of the usual bytes object.
2099 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2100
2101 def _testSendmsgArray(self):
2102 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2103 len(MSG))
2104
2105 def testSendmsgGather(self):
2106 # Send message data from more than one buffer (gather write).
2107 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2108
2109 def _testSendmsgGather(self):
2110 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2111
2112 def testSendmsgBadArgs(self):
2113 # Check that sendmsg() rejects invalid arguments.
2114 self.assertEqual(self.serv_sock.recv(1000), b"done")
2115
2116 def _testSendmsgBadArgs(self):
2117 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2118 self.assertRaises(TypeError, self.sendmsgToServer,
2119 b"not in an iterable")
2120 self.assertRaises(TypeError, self.sendmsgToServer,
2121 object())
2122 self.assertRaises(TypeError, self.sendmsgToServer,
2123 [object()])
2124 self.assertRaises(TypeError, self.sendmsgToServer,
2125 [MSG, object()])
2126 self.assertRaises(TypeError, self.sendmsgToServer,
2127 [MSG], object())
2128 self.assertRaises(TypeError, self.sendmsgToServer,
2129 [MSG], [], object())
2130 self.assertRaises(TypeError, self.sendmsgToServer,
2131 [MSG], [], 0, object())
2132 self.sendToServer(b"done")
2133
2134 def testSendmsgBadCmsg(self):
2135 # Check that invalid ancillary data items are rejected.
2136 self.assertEqual(self.serv_sock.recv(1000), b"done")
2137
2138 def _testSendmsgBadCmsg(self):
2139 self.assertRaises(TypeError, self.sendmsgToServer,
2140 [MSG], [object()])
2141 self.assertRaises(TypeError, self.sendmsgToServer,
2142 [MSG], [(object(), 0, b"data")])
2143 self.assertRaises(TypeError, self.sendmsgToServer,
2144 [MSG], [(0, object(), b"data")])
2145 self.assertRaises(TypeError, self.sendmsgToServer,
2146 [MSG], [(0, 0, object())])
2147 self.assertRaises(TypeError, self.sendmsgToServer,
2148 [MSG], [(0, 0)])
2149 self.assertRaises(TypeError, self.sendmsgToServer,
2150 [MSG], [(0, 0, b"data", 42)])
2151 self.sendToServer(b"done")
2152
2153 @requireAttrs(socket, "CMSG_SPACE")
2154 def testSendmsgBadMultiCmsg(self):
2155 # Check that invalid ancillary data items are rejected when
2156 # more than one item is present.
2157 self.assertEqual(self.serv_sock.recv(1000), b"done")
2158
2159 @testSendmsgBadMultiCmsg.client_skip
2160 def _testSendmsgBadMultiCmsg(self):
2161 self.assertRaises(TypeError, self.sendmsgToServer,
2162 [MSG], [0, 0, b""])
2163 self.assertRaises(TypeError, self.sendmsgToServer,
2164 [MSG], [(0, 0, b""), object()])
2165 self.sendToServer(b"done")
2166
2167 def testSendmsgExcessCmsgReject(self):
2168 # Check that sendmsg() rejects excess ancillary data items
2169 # when the number that can be sent is limited.
2170 self.assertEqual(self.serv_sock.recv(1000), b"done")
2171
2172 def _testSendmsgExcessCmsgReject(self):
2173 if not hasattr(socket, "CMSG_SPACE"):
2174 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002175 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002176 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2177 self.assertIsNone(cm.exception.errno)
2178 self.sendToServer(b"done")
2179
2180 def testSendmsgAfterClose(self):
2181 # Check that sendmsg() fails on a closed socket.
2182 pass
2183
2184 def _testSendmsgAfterClose(self):
2185 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002186 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002187
2188
2189class SendmsgStreamTests(SendmsgTests):
2190 # Tests for sendmsg() which require a stream socket and do not
2191 # involve recvmsg() or recvmsg_into().
2192
2193 def testSendmsgExplicitNoneAddr(self):
2194 # Check that peer address can be specified as None.
2195 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2196
2197 def _testSendmsgExplicitNoneAddr(self):
2198 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2199
2200 def testSendmsgTimeout(self):
2201 # Check that timeout works with sendmsg().
2202 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2203 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2204
2205 def _testSendmsgTimeout(self):
2206 try:
2207 self.cli_sock.settimeout(0.03)
2208 with self.assertRaises(socket.timeout):
2209 while True:
2210 self.sendmsgToServer([b"a"*512])
2211 finally:
2212 self.misc_event.set()
2213
2214 # XXX: would be nice to have more tests for sendmsg flags argument.
2215
2216 # Linux supports MSG_DONTWAIT when sending, but in general, it
2217 # only works when receiving. Could add other platforms if they
2218 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002219 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002220 "MSG_DONTWAIT not known to work on this platform when "
2221 "sending")
2222 def testSendmsgDontWait(self):
2223 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2224 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2225 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2226
2227 @testSendmsgDontWait.client_skip
2228 def _testSendmsgDontWait(self):
2229 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002230 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002231 while True:
2232 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2233 self.assertIn(cm.exception.errno,
2234 (errno.EAGAIN, errno.EWOULDBLOCK))
2235 finally:
2236 self.misc_event.set()
2237
2238
2239class SendmsgConnectionlessTests(SendmsgTests):
2240 # Tests for sendmsg() which require a connectionless-mode
2241 # (e.g. datagram) socket, and do not involve recvmsg() or
2242 # recvmsg_into().
2243
2244 def testSendmsgNoDestAddr(self):
2245 # Check that sendmsg() fails when no destination address is
2246 # given for unconnected socket.
2247 pass
2248
2249 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002250 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002251 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002252 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002253 [MSG], [], 0, None)
2254
2255
2256class RecvmsgGenericTests(SendrecvmsgBase):
2257 # Tests for recvmsg() which can also be emulated using
2258 # recvmsg_into(), and can use any socket type.
2259
2260 def testRecvmsg(self):
2261 # Receive a simple message with recvmsg[_into]().
2262 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2263 self.assertEqual(msg, MSG)
2264 self.checkRecvmsgAddress(addr, self.cli_addr)
2265 self.assertEqual(ancdata, [])
2266 self.checkFlags(flags, eor=True)
2267
2268 def _testRecvmsg(self):
2269 self.sendToServer(MSG)
2270
2271 def testRecvmsgExplicitDefaults(self):
2272 # Test recvmsg[_into]() with default arguments provided explicitly.
2273 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2274 len(MSG), 0, 0)
2275 self.assertEqual(msg, MSG)
2276 self.checkRecvmsgAddress(addr, self.cli_addr)
2277 self.assertEqual(ancdata, [])
2278 self.checkFlags(flags, eor=True)
2279
2280 def _testRecvmsgExplicitDefaults(self):
2281 self.sendToServer(MSG)
2282
2283 def testRecvmsgShorter(self):
2284 # Receive a message smaller than buffer.
2285 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2286 len(MSG) + 42)
2287 self.assertEqual(msg, MSG)
2288 self.checkRecvmsgAddress(addr, self.cli_addr)
2289 self.assertEqual(ancdata, [])
2290 self.checkFlags(flags, eor=True)
2291
2292 def _testRecvmsgShorter(self):
2293 self.sendToServer(MSG)
2294
Charles-François Natali8619cd72011-10-03 19:43:15 +02002295 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2296 # datagram is received (issue #13001).
2297 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002298 def testRecvmsgTrunc(self):
2299 # Receive part of message, check for truncation indicators.
2300 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2301 len(MSG) - 3)
2302 self.assertEqual(msg, MSG[:-3])
2303 self.checkRecvmsgAddress(addr, self.cli_addr)
2304 self.assertEqual(ancdata, [])
2305 self.checkFlags(flags, eor=False)
2306
Charles-François Natali8619cd72011-10-03 19:43:15 +02002307 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002308 def _testRecvmsgTrunc(self):
2309 self.sendToServer(MSG)
2310
2311 def testRecvmsgShortAncillaryBuf(self):
2312 # Test ancillary data buffer too small to hold any ancillary data.
2313 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2314 len(MSG), 1)
2315 self.assertEqual(msg, MSG)
2316 self.checkRecvmsgAddress(addr, self.cli_addr)
2317 self.assertEqual(ancdata, [])
2318 self.checkFlags(flags, eor=True)
2319
2320 def _testRecvmsgShortAncillaryBuf(self):
2321 self.sendToServer(MSG)
2322
2323 def testRecvmsgLongAncillaryBuf(self):
2324 # Test large ancillary data buffer.
2325 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2326 len(MSG), 10240)
2327 self.assertEqual(msg, MSG)
2328 self.checkRecvmsgAddress(addr, self.cli_addr)
2329 self.assertEqual(ancdata, [])
2330 self.checkFlags(flags, eor=True)
2331
2332 def _testRecvmsgLongAncillaryBuf(self):
2333 self.sendToServer(MSG)
2334
2335 def testRecvmsgAfterClose(self):
2336 # Check that recvmsg[_into]() fails on a closed socket.
2337 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002338 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002339
2340 def _testRecvmsgAfterClose(self):
2341 pass
2342
2343 def testRecvmsgTimeout(self):
2344 # Check that timeout works.
2345 try:
2346 self.serv_sock.settimeout(0.03)
2347 self.assertRaises(socket.timeout,
2348 self.doRecvmsg, self.serv_sock, len(MSG))
2349 finally:
2350 self.misc_event.set()
2351
2352 def _testRecvmsgTimeout(self):
2353 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2354
2355 @requireAttrs(socket, "MSG_PEEK")
2356 def testRecvmsgPeek(self):
2357 # Check that MSG_PEEK in flags enables examination of pending
2358 # data without consuming it.
2359
2360 # Receive part of data with MSG_PEEK.
2361 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2362 len(MSG) - 3, 0,
2363 socket.MSG_PEEK)
2364 self.assertEqual(msg, MSG[:-3])
2365 self.checkRecvmsgAddress(addr, self.cli_addr)
2366 self.assertEqual(ancdata, [])
2367 # Ignoring MSG_TRUNC here (so this test is the same for stream
2368 # and datagram sockets). Some wording in POSIX seems to
2369 # suggest that it needn't be set when peeking, but that may
2370 # just be a slip.
2371 self.checkFlags(flags, eor=False,
2372 ignore=getattr(socket, "MSG_TRUNC", 0))
2373
2374 # Receive all data with MSG_PEEK.
2375 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2376 len(MSG), 0,
2377 socket.MSG_PEEK)
2378 self.assertEqual(msg, MSG)
2379 self.checkRecvmsgAddress(addr, self.cli_addr)
2380 self.assertEqual(ancdata, [])
2381 self.checkFlags(flags, eor=True)
2382
2383 # Check that the same data can still be received normally.
2384 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2385 self.assertEqual(msg, MSG)
2386 self.checkRecvmsgAddress(addr, self.cli_addr)
2387 self.assertEqual(ancdata, [])
2388 self.checkFlags(flags, eor=True)
2389
2390 @testRecvmsgPeek.client_skip
2391 def _testRecvmsgPeek(self):
2392 self.sendToServer(MSG)
2393
2394 @requireAttrs(socket.socket, "sendmsg")
2395 def testRecvmsgFromSendmsg(self):
2396 # Test receiving with recvmsg[_into]() when message is sent
2397 # using sendmsg().
2398 self.serv_sock.settimeout(self.fail_timeout)
2399 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2400 self.assertEqual(msg, MSG)
2401 self.checkRecvmsgAddress(addr, self.cli_addr)
2402 self.assertEqual(ancdata, [])
2403 self.checkFlags(flags, eor=True)
2404
2405 @testRecvmsgFromSendmsg.client_skip
2406 def _testRecvmsgFromSendmsg(self):
2407 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2408
2409
2410class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2411 # Tests which require a stream socket and can use either recvmsg()
2412 # or recvmsg_into().
2413
2414 def testRecvmsgEOF(self):
2415 # Receive end-of-stream indicator (b"", peer socket closed).
2416 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2417 self.assertEqual(msg, b"")
2418 self.checkRecvmsgAddress(addr, self.cli_addr)
2419 self.assertEqual(ancdata, [])
2420 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2421
2422 def _testRecvmsgEOF(self):
2423 self.cli_sock.close()
2424
2425 def testRecvmsgOverflow(self):
2426 # Receive a message in more than one chunk.
2427 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2428 len(MSG) - 3)
2429 self.checkRecvmsgAddress(addr, self.cli_addr)
2430 self.assertEqual(ancdata, [])
2431 self.checkFlags(flags, eor=False)
2432
2433 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2434 self.checkRecvmsgAddress(addr, self.cli_addr)
2435 self.assertEqual(ancdata, [])
2436 self.checkFlags(flags, eor=True)
2437
2438 msg = seg1 + seg2
2439 self.assertEqual(msg, MSG)
2440
2441 def _testRecvmsgOverflow(self):
2442 self.sendToServer(MSG)
2443
2444
2445class RecvmsgTests(RecvmsgGenericTests):
2446 # Tests for recvmsg() which can use any socket type.
2447
2448 def testRecvmsgBadArgs(self):
2449 # Check that recvmsg() rejects invalid arguments.
2450 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2451 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2452 -1, 0, 0)
2453 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2454 len(MSG), -1, 0)
2455 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2456 [bytearray(10)], 0, 0)
2457 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2458 object(), 0, 0)
2459 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2460 len(MSG), object(), 0)
2461 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2462 len(MSG), 0, object())
2463
2464 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2465 self.assertEqual(msg, MSG)
2466 self.checkRecvmsgAddress(addr, self.cli_addr)
2467 self.assertEqual(ancdata, [])
2468 self.checkFlags(flags, eor=True)
2469
2470 def _testRecvmsgBadArgs(self):
2471 self.sendToServer(MSG)
2472
2473
2474class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2475 # Tests for recvmsg_into() which can use any socket type.
2476
2477 def testRecvmsgIntoBadArgs(self):
2478 # Check that recvmsg_into() rejects invalid arguments.
2479 buf = bytearray(len(MSG))
2480 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2481 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2482 len(MSG), 0, 0)
2483 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2484 buf, 0, 0)
2485 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2486 [object()], 0, 0)
2487 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2488 [b"I'm not writable"], 0, 0)
2489 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2490 [buf, object()], 0, 0)
2491 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2492 [buf], -1, 0)
2493 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2494 [buf], object(), 0)
2495 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2496 [buf], 0, object())
2497
2498 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2499 self.assertEqual(nbytes, len(MSG))
2500 self.assertEqual(buf, bytearray(MSG))
2501 self.checkRecvmsgAddress(addr, self.cli_addr)
2502 self.assertEqual(ancdata, [])
2503 self.checkFlags(flags, eor=True)
2504
2505 def _testRecvmsgIntoBadArgs(self):
2506 self.sendToServer(MSG)
2507
2508 def testRecvmsgIntoGenerator(self):
2509 # Receive into buffer obtained from a generator (not a sequence).
2510 buf = bytearray(len(MSG))
2511 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2512 (o for o in [buf]))
2513 self.assertEqual(nbytes, len(MSG))
2514 self.assertEqual(buf, bytearray(MSG))
2515 self.checkRecvmsgAddress(addr, self.cli_addr)
2516 self.assertEqual(ancdata, [])
2517 self.checkFlags(flags, eor=True)
2518
2519 def _testRecvmsgIntoGenerator(self):
2520 self.sendToServer(MSG)
2521
2522 def testRecvmsgIntoArray(self):
2523 # Receive into an array rather than the usual bytearray.
2524 buf = array.array("B", [0] * len(MSG))
2525 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2526 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002527 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002528 self.checkRecvmsgAddress(addr, self.cli_addr)
2529 self.assertEqual(ancdata, [])
2530 self.checkFlags(flags, eor=True)
2531
2532 def _testRecvmsgIntoArray(self):
2533 self.sendToServer(MSG)
2534
2535 def testRecvmsgIntoScatter(self):
2536 # Receive into multiple buffers (scatter write).
2537 b1 = bytearray(b"----")
2538 b2 = bytearray(b"0123456789")
2539 b3 = bytearray(b"--------------")
2540 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2541 [b1, memoryview(b2)[2:9], b3])
2542 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2543 self.assertEqual(b1, bytearray(b"Mary"))
2544 self.assertEqual(b2, bytearray(b"01 had a 9"))
2545 self.assertEqual(b3, bytearray(b"little lamb---"))
2546 self.checkRecvmsgAddress(addr, self.cli_addr)
2547 self.assertEqual(ancdata, [])
2548 self.checkFlags(flags, eor=True)
2549
2550 def _testRecvmsgIntoScatter(self):
2551 self.sendToServer(b"Mary had a little lamb")
2552
2553
2554class CmsgMacroTests(unittest.TestCase):
2555 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2556 # assumptions used by sendmsg() and recvmsg[_into](), which share
2557 # code with these functions.
2558
2559 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002560 try:
2561 import _testcapi
2562 except ImportError:
2563 socklen_t_limit = 0x7fffffff
2564 else:
2565 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002566
2567 @requireAttrs(socket, "CMSG_LEN")
2568 def testCMSG_LEN(self):
2569 # Test CMSG_LEN() with various valid and invalid values,
2570 # checking the assumptions used by recvmsg() and sendmsg().
2571 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2572 values = list(range(257)) + list(range(toobig - 257, toobig))
2573
2574 # struct cmsghdr has at least three members, two of which are ints
2575 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2576 for n in values:
2577 ret = socket.CMSG_LEN(n)
2578 # This is how recvmsg() calculates the data size
2579 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2580 self.assertLessEqual(ret, self.socklen_t_limit)
2581
2582 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2583 # sendmsg() shares code with these functions, and requires
2584 # that it reject values over the limit.
2585 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2586 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2587
2588 @requireAttrs(socket, "CMSG_SPACE")
2589 def testCMSG_SPACE(self):
2590 # Test CMSG_SPACE() with various valid and invalid values,
2591 # checking the assumptions used by sendmsg().
2592 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2593 values = list(range(257)) + list(range(toobig - 257, toobig))
2594
2595 last = socket.CMSG_SPACE(0)
2596 # struct cmsghdr has at least three members, two of which are ints
2597 self.assertGreater(last, array.array("i").itemsize * 2)
2598 for n in values:
2599 ret = socket.CMSG_SPACE(n)
2600 self.assertGreaterEqual(ret, last)
2601 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2602 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2603 self.assertLessEqual(ret, self.socklen_t_limit)
2604 last = ret
2605
2606 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2607 # sendmsg() shares code with these functions, and requires
2608 # that it reject values over the limit.
2609 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2610 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2611
2612
2613class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2614 # Tests for file descriptor passing on Unix-domain sockets.
2615
2616 # Invalid file descriptor value that's unlikely to evaluate to a
2617 # real FD even if one of its bytes is replaced with a different
2618 # value (which shouldn't actually happen).
2619 badfd = -0x5555
2620
2621 def newFDs(self, n):
2622 # Return a list of n file descriptors for newly-created files
2623 # containing their list indices as ASCII numbers.
2624 fds = []
2625 for i in range(n):
2626 fd, path = tempfile.mkstemp()
2627 self.addCleanup(os.unlink, path)
2628 self.addCleanup(os.close, fd)
2629 os.write(fd, str(i).encode())
2630 fds.append(fd)
2631 return fds
2632
2633 def checkFDs(self, fds):
2634 # Check that the file descriptors in the given list contain
2635 # their correct list indices as ASCII numbers.
2636 for n, fd in enumerate(fds):
2637 os.lseek(fd, 0, os.SEEK_SET)
2638 self.assertEqual(os.read(fd, 1024), str(n).encode())
2639
2640 def registerRecvmsgResult(self, result):
2641 self.addCleanup(self.closeRecvmsgFDs, result)
2642
2643 def closeRecvmsgFDs(self, recvmsg_result):
2644 # Close all file descriptors specified in the ancillary data
2645 # of the given return value from recvmsg() or recvmsg_into().
2646 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2647 if (cmsg_level == socket.SOL_SOCKET and
2648 cmsg_type == socket.SCM_RIGHTS):
2649 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002650 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002651 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2652 for fd in fds:
2653 os.close(fd)
2654
2655 def createAndSendFDs(self, n):
2656 # Send n new file descriptors created by newFDs() to the
2657 # server, with the constant MSG as the non-ancillary data.
2658 self.assertEqual(
2659 self.sendmsgToServer([MSG],
2660 [(socket.SOL_SOCKET,
2661 socket.SCM_RIGHTS,
2662 array.array("i", self.newFDs(n)))]),
2663 len(MSG))
2664
2665 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2666 # Check that constant MSG was received with numfds file
2667 # descriptors in a maximum of maxcmsgs control messages (which
2668 # must contain only complete integers). By default, check
2669 # that MSG_CTRUNC is unset, but ignore any flags in
2670 # ignoreflags.
2671 msg, ancdata, flags, addr = result
2672 self.assertEqual(msg, MSG)
2673 self.checkRecvmsgAddress(addr, self.cli_addr)
2674 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2675 ignore=ignoreflags)
2676
2677 self.assertIsInstance(ancdata, list)
2678 self.assertLessEqual(len(ancdata), maxcmsgs)
2679 fds = array.array("i")
2680 for item in ancdata:
2681 self.assertIsInstance(item, tuple)
2682 cmsg_level, cmsg_type, cmsg_data = item
2683 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2684 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2685 self.assertIsInstance(cmsg_data, bytes)
2686 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002687 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002688
2689 self.assertEqual(len(fds), numfds)
2690 self.checkFDs(fds)
2691
2692 def testFDPassSimple(self):
2693 # Pass a single FD (array read from bytes object).
2694 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2695 len(MSG), 10240))
2696
2697 def _testFDPassSimple(self):
2698 self.assertEqual(
2699 self.sendmsgToServer(
2700 [MSG],
2701 [(socket.SOL_SOCKET,
2702 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002703 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002704 len(MSG))
2705
2706 def testMultipleFDPass(self):
2707 # Pass multiple FDs in a single array.
2708 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2709 len(MSG), 10240))
2710
2711 def _testMultipleFDPass(self):
2712 self.createAndSendFDs(4)
2713
2714 @requireAttrs(socket, "CMSG_SPACE")
2715 def testFDPassCMSG_SPACE(self):
2716 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2717 self.checkRecvmsgFDs(
2718 4, self.doRecvmsg(self.serv_sock, len(MSG),
2719 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2720
2721 @testFDPassCMSG_SPACE.client_skip
2722 def _testFDPassCMSG_SPACE(self):
2723 self.createAndSendFDs(4)
2724
2725 def testFDPassCMSG_LEN(self):
2726 # Test using CMSG_LEN() to calculate ancillary buffer size.
2727 self.checkRecvmsgFDs(1,
2728 self.doRecvmsg(self.serv_sock, len(MSG),
2729 socket.CMSG_LEN(4 * SIZEOF_INT)),
2730 # RFC 3542 says implementations may set
2731 # MSG_CTRUNC if there isn't enough space
2732 # for trailing padding.
2733 ignoreflags=socket.MSG_CTRUNC)
2734
2735 def _testFDPassCMSG_LEN(self):
2736 self.createAndSendFDs(1)
2737
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002738 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002739 @requireAttrs(socket, "CMSG_SPACE")
2740 def testFDPassSeparate(self):
2741 # Pass two FDs in two separate arrays. Arrays may be combined
2742 # into a single control message by the OS.
2743 self.checkRecvmsgFDs(2,
2744 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2745 maxcmsgs=2)
2746
2747 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002748 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002749 def _testFDPassSeparate(self):
2750 fd0, fd1 = self.newFDs(2)
2751 self.assertEqual(
2752 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2753 socket.SCM_RIGHTS,
2754 array.array("i", [fd0])),
2755 (socket.SOL_SOCKET,
2756 socket.SCM_RIGHTS,
2757 array.array("i", [fd1]))]),
2758 len(MSG))
2759
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002760 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002761 @requireAttrs(socket, "CMSG_SPACE")
2762 def testFDPassSeparateMinSpace(self):
2763 # Pass two FDs in two separate arrays, receiving them into the
2764 # minimum space for two arrays.
2765 self.checkRecvmsgFDs(2,
2766 self.doRecvmsg(self.serv_sock, len(MSG),
2767 socket.CMSG_SPACE(SIZEOF_INT) +
2768 socket.CMSG_LEN(SIZEOF_INT)),
2769 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2770
2771 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002772 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002773 def _testFDPassSeparateMinSpace(self):
2774 fd0, fd1 = self.newFDs(2)
2775 self.assertEqual(
2776 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2777 socket.SCM_RIGHTS,
2778 array.array("i", [fd0])),
2779 (socket.SOL_SOCKET,
2780 socket.SCM_RIGHTS,
2781 array.array("i", [fd1]))]),
2782 len(MSG))
2783
2784 def sendAncillaryIfPossible(self, msg, ancdata):
2785 # Try to send msg and ancdata to server, but if the system
2786 # call fails, just send msg with no ancillary data.
2787 try:
2788 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002789 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002790 # Check that it was the system call that failed
2791 self.assertIsInstance(e.errno, int)
2792 nbytes = self.sendmsgToServer([msg])
2793 self.assertEqual(nbytes, len(msg))
2794
2795 def testFDPassEmpty(self):
2796 # Try to pass an empty FD array. Can receive either no array
2797 # or an empty array.
2798 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2799 len(MSG), 10240),
2800 ignoreflags=socket.MSG_CTRUNC)
2801
2802 def _testFDPassEmpty(self):
2803 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2804 socket.SCM_RIGHTS,
2805 b"")])
2806
2807 def testFDPassPartialInt(self):
2808 # Try to pass a truncated FD array.
2809 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2810 len(MSG), 10240)
2811 self.assertEqual(msg, MSG)
2812 self.checkRecvmsgAddress(addr, self.cli_addr)
2813 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2814 self.assertLessEqual(len(ancdata), 1)
2815 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2816 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2817 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2818 self.assertLess(len(cmsg_data), SIZEOF_INT)
2819
2820 def _testFDPassPartialInt(self):
2821 self.sendAncillaryIfPossible(
2822 MSG,
2823 [(socket.SOL_SOCKET,
2824 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002825 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002826
2827 @requireAttrs(socket, "CMSG_SPACE")
2828 def testFDPassPartialIntInMiddle(self):
2829 # Try to pass two FD arrays, the first of which is truncated.
2830 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2831 len(MSG), 10240)
2832 self.assertEqual(msg, MSG)
2833 self.checkRecvmsgAddress(addr, self.cli_addr)
2834 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2835 self.assertLessEqual(len(ancdata), 2)
2836 fds = array.array("i")
2837 # Arrays may have been combined in a single control message
2838 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2839 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2840 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002841 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002842 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2843 self.assertLessEqual(len(fds), 2)
2844 self.checkFDs(fds)
2845
2846 @testFDPassPartialIntInMiddle.client_skip
2847 def _testFDPassPartialIntInMiddle(self):
2848 fd0, fd1 = self.newFDs(2)
2849 self.sendAncillaryIfPossible(
2850 MSG,
2851 [(socket.SOL_SOCKET,
2852 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002853 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002854 (socket.SOL_SOCKET,
2855 socket.SCM_RIGHTS,
2856 array.array("i", [fd1]))])
2857
2858 def checkTruncatedHeader(self, result, ignoreflags=0):
2859 # Check that no ancillary data items are returned when data is
2860 # truncated inside the cmsghdr structure.
2861 msg, ancdata, flags, addr = result
2862 self.assertEqual(msg, MSG)
2863 self.checkRecvmsgAddress(addr, self.cli_addr)
2864 self.assertEqual(ancdata, [])
2865 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2866 ignore=ignoreflags)
2867
2868 def testCmsgTruncNoBufSize(self):
2869 # Check that no ancillary data is received when no buffer size
2870 # is specified.
2871 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2872 # BSD seems to set MSG_CTRUNC only
2873 # if an item has been partially
2874 # received.
2875 ignoreflags=socket.MSG_CTRUNC)
2876
2877 def _testCmsgTruncNoBufSize(self):
2878 self.createAndSendFDs(1)
2879
2880 def testCmsgTrunc0(self):
2881 # Check that no ancillary data is received when buffer size is 0.
2882 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2883 ignoreflags=socket.MSG_CTRUNC)
2884
2885 def _testCmsgTrunc0(self):
2886 self.createAndSendFDs(1)
2887
2888 # Check that no ancillary data is returned for various non-zero
2889 # (but still too small) buffer sizes.
2890
2891 def testCmsgTrunc1(self):
2892 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2893
2894 def _testCmsgTrunc1(self):
2895 self.createAndSendFDs(1)
2896
2897 def testCmsgTrunc2Int(self):
2898 # The cmsghdr structure has at least three members, two of
2899 # which are ints, so we still shouldn't see any ancillary
2900 # data.
2901 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2902 SIZEOF_INT * 2))
2903
2904 def _testCmsgTrunc2Int(self):
2905 self.createAndSendFDs(1)
2906
2907 def testCmsgTruncLen0Minus1(self):
2908 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2909 socket.CMSG_LEN(0) - 1))
2910
2911 def _testCmsgTruncLen0Minus1(self):
2912 self.createAndSendFDs(1)
2913
2914 # The following tests try to truncate the control message in the
2915 # middle of the FD array.
2916
2917 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2918 # Check that file descriptor data is truncated to between
2919 # mindata and maxdata bytes when received with buffer size
2920 # ancbuf, and that any complete file descriptor numbers are
2921 # valid.
2922 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2923 len(MSG), ancbuf)
2924 self.assertEqual(msg, MSG)
2925 self.checkRecvmsgAddress(addr, self.cli_addr)
2926 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2927
2928 if mindata == 0 and ancdata == []:
2929 return
2930 self.assertEqual(len(ancdata), 1)
2931 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2932 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2933 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2934 self.assertGreaterEqual(len(cmsg_data), mindata)
2935 self.assertLessEqual(len(cmsg_data), maxdata)
2936 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002937 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002938 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2939 self.checkFDs(fds)
2940
2941 def testCmsgTruncLen0(self):
2942 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2943
2944 def _testCmsgTruncLen0(self):
2945 self.createAndSendFDs(1)
2946
2947 def testCmsgTruncLen0Plus1(self):
2948 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2949
2950 def _testCmsgTruncLen0Plus1(self):
2951 self.createAndSendFDs(2)
2952
2953 def testCmsgTruncLen1(self):
2954 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2955 maxdata=SIZEOF_INT)
2956
2957 def _testCmsgTruncLen1(self):
2958 self.createAndSendFDs(2)
2959
2960 def testCmsgTruncLen2Minus1(self):
2961 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2962 maxdata=(2 * SIZEOF_INT) - 1)
2963
2964 def _testCmsgTruncLen2Minus1(self):
2965 self.createAndSendFDs(2)
2966
2967
2968class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2969 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2970 # features of the RFC 3542 Advanced Sockets API for IPv6.
2971 # Currently we can only handle certain data items (e.g. traffic
2972 # class, hop limit, MTU discovery and fragmentation settings)
2973 # without resorting to unportable means such as the struct module,
2974 # but the tests here are aimed at testing the ancillary data
2975 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2976 # itself.
2977
2978 # Test value to use when setting hop limit of packet
2979 hop_limit = 2
2980
2981 # Test value to use when setting traffic class of packet.
2982 # -1 means "use kernel default".
2983 traffic_class = -1
2984
2985 def ancillaryMapping(self, ancdata):
2986 # Given ancillary data list ancdata, return a mapping from
2987 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2988 # Check that no (level, type) pair appears more than once.
2989 d = {}
2990 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2991 self.assertNotIn((cmsg_level, cmsg_type), d)
2992 d[(cmsg_level, cmsg_type)] = cmsg_data
2993 return d
2994
2995 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2996 # Receive hop limit into ancbufsize bytes of ancillary data
2997 # space. Check that data is MSG, ancillary data is not
2998 # truncated (but ignore any flags in ignoreflags), and hop
2999 # limit is between 0 and maxhop inclusive.
3000 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3001 socket.IPV6_RECVHOPLIMIT, 1)
3002 self.misc_event.set()
3003 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3004 len(MSG), ancbufsize)
3005
3006 self.assertEqual(msg, MSG)
3007 self.checkRecvmsgAddress(addr, self.cli_addr)
3008 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3009 ignore=ignoreflags)
3010
3011 self.assertEqual(len(ancdata), 1)
3012 self.assertIsInstance(ancdata[0], tuple)
3013 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3014 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3015 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3016 self.assertIsInstance(cmsg_data, bytes)
3017 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3018 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003019 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003020 self.assertGreaterEqual(a[0], 0)
3021 self.assertLessEqual(a[0], maxhop)
3022
3023 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3024 def testRecvHopLimit(self):
3025 # Test receiving the packet hop limit as ancillary data.
3026 self.checkHopLimit(ancbufsize=10240)
3027
3028 @testRecvHopLimit.client_skip
3029 def _testRecvHopLimit(self):
3030 # Need to wait until server has asked to receive ancillary
3031 # data, as implementations are not required to buffer it
3032 # otherwise.
3033 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3034 self.sendToServer(MSG)
3035
3036 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3037 def testRecvHopLimitCMSG_SPACE(self):
3038 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3039 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3040
3041 @testRecvHopLimitCMSG_SPACE.client_skip
3042 def _testRecvHopLimitCMSG_SPACE(self):
3043 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3044 self.sendToServer(MSG)
3045
3046 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3047 # 3542 says portable applications must provide space for trailing
3048 # padding. Implementations may set MSG_CTRUNC if there isn't
3049 # enough space for the padding.
3050
3051 @requireAttrs(socket.socket, "sendmsg")
3052 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3053 def testSetHopLimit(self):
3054 # Test setting hop limit on outgoing packet and receiving it
3055 # at the other end.
3056 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3057
3058 @testSetHopLimit.client_skip
3059 def _testSetHopLimit(self):
3060 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3061 self.assertEqual(
3062 self.sendmsgToServer([MSG],
3063 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3064 array.array("i", [self.hop_limit]))]),
3065 len(MSG))
3066
3067 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3068 ignoreflags=0):
3069 # Receive traffic class and hop limit into ancbufsize bytes of
3070 # ancillary data space. Check that data is MSG, ancillary
3071 # data is not truncated (but ignore any flags in ignoreflags),
3072 # and traffic class and hop limit are in range (hop limit no
3073 # more than maxhop).
3074 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3075 socket.IPV6_RECVHOPLIMIT, 1)
3076 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3077 socket.IPV6_RECVTCLASS, 1)
3078 self.misc_event.set()
3079 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3080 len(MSG), ancbufsize)
3081
3082 self.assertEqual(msg, MSG)
3083 self.checkRecvmsgAddress(addr, self.cli_addr)
3084 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3085 ignore=ignoreflags)
3086 self.assertEqual(len(ancdata), 2)
3087 ancmap = self.ancillaryMapping(ancdata)
3088
3089 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3090 self.assertEqual(len(tcdata), SIZEOF_INT)
3091 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003092 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003093 self.assertGreaterEqual(a[0], 0)
3094 self.assertLessEqual(a[0], 255)
3095
3096 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3097 self.assertEqual(len(hldata), SIZEOF_INT)
3098 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003099 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003100 self.assertGreaterEqual(a[0], 0)
3101 self.assertLessEqual(a[0], maxhop)
3102
3103 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3104 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3105 def testRecvTrafficClassAndHopLimit(self):
3106 # Test receiving traffic class and hop limit as ancillary data.
3107 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3108
3109 @testRecvTrafficClassAndHopLimit.client_skip
3110 def _testRecvTrafficClassAndHopLimit(self):
3111 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3112 self.sendToServer(MSG)
3113
3114 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3115 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3116 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3117 # Test receiving traffic class and hop limit, using
3118 # CMSG_SPACE() to calculate buffer size.
3119 self.checkTrafficClassAndHopLimit(
3120 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3121
3122 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3123 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3124 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3125 self.sendToServer(MSG)
3126
3127 @requireAttrs(socket.socket, "sendmsg")
3128 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3129 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3130 def testSetTrafficClassAndHopLimit(self):
3131 # Test setting traffic class and hop limit on outgoing packet,
3132 # and receiving them at the other end.
3133 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3134 maxhop=self.hop_limit)
3135
3136 @testSetTrafficClassAndHopLimit.client_skip
3137 def _testSetTrafficClassAndHopLimit(self):
3138 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3139 self.assertEqual(
3140 self.sendmsgToServer([MSG],
3141 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3142 array.array("i", [self.traffic_class])),
3143 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3144 array.array("i", [self.hop_limit]))]),
3145 len(MSG))
3146
3147 @requireAttrs(socket.socket, "sendmsg")
3148 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3149 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3150 def testOddCmsgSize(self):
3151 # Try to send ancillary data with first item one byte too
3152 # long. Fall back to sending with correct size if this fails,
3153 # and check that second item was handled correctly.
3154 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3155 maxhop=self.hop_limit)
3156
3157 @testOddCmsgSize.client_skip
3158 def _testOddCmsgSize(self):
3159 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3160 try:
3161 nbytes = self.sendmsgToServer(
3162 [MSG],
3163 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003164 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003165 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3166 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003167 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003168 self.assertIsInstance(e.errno, int)
3169 nbytes = self.sendmsgToServer(
3170 [MSG],
3171 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3172 array.array("i", [self.traffic_class])),
3173 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3174 array.array("i", [self.hop_limit]))])
3175 self.assertEqual(nbytes, len(MSG))
3176
3177 # Tests for proper handling of truncated ancillary data
3178
3179 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3180 # Receive hop limit into ancbufsize bytes of ancillary data
3181 # space, which should be too small to contain the ancillary
3182 # data header (if ancbufsize is None, pass no second argument
3183 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3184 # (unless included in ignoreflags), and no ancillary data is
3185 # returned.
3186 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3187 socket.IPV6_RECVHOPLIMIT, 1)
3188 self.misc_event.set()
3189 args = () if ancbufsize is None else (ancbufsize,)
3190 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3191 len(MSG), *args)
3192
3193 self.assertEqual(msg, MSG)
3194 self.checkRecvmsgAddress(addr, self.cli_addr)
3195 self.assertEqual(ancdata, [])
3196 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3197 ignore=ignoreflags)
3198
3199 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3200 def testCmsgTruncNoBufSize(self):
3201 # Check that no ancillary data is received when no ancillary
3202 # buffer size is provided.
3203 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3204 # BSD seems to set
3205 # MSG_CTRUNC only if an item
3206 # has been partially
3207 # received.
3208 ignoreflags=socket.MSG_CTRUNC)
3209
3210 @testCmsgTruncNoBufSize.client_skip
3211 def _testCmsgTruncNoBufSize(self):
3212 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3213 self.sendToServer(MSG)
3214
3215 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3216 def testSingleCmsgTrunc0(self):
3217 # Check that no ancillary data is received when ancillary
3218 # buffer size is zero.
3219 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3220 ignoreflags=socket.MSG_CTRUNC)
3221
3222 @testSingleCmsgTrunc0.client_skip
3223 def _testSingleCmsgTrunc0(self):
3224 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3225 self.sendToServer(MSG)
3226
3227 # Check that no ancillary data is returned for various non-zero
3228 # (but still too small) buffer sizes.
3229
3230 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3231 def testSingleCmsgTrunc1(self):
3232 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3233
3234 @testSingleCmsgTrunc1.client_skip
3235 def _testSingleCmsgTrunc1(self):
3236 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3237 self.sendToServer(MSG)
3238
3239 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3240 def testSingleCmsgTrunc2Int(self):
3241 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3242
3243 @testSingleCmsgTrunc2Int.client_skip
3244 def _testSingleCmsgTrunc2Int(self):
3245 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3246 self.sendToServer(MSG)
3247
3248 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3249 def testSingleCmsgTruncLen0Minus1(self):
3250 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3251
3252 @testSingleCmsgTruncLen0Minus1.client_skip
3253 def _testSingleCmsgTruncLen0Minus1(self):
3254 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3255 self.sendToServer(MSG)
3256
3257 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3258 def testSingleCmsgTruncInData(self):
3259 # Test truncation of a control message inside its associated
3260 # data. The message may be returned with its data truncated,
3261 # or not returned at all.
3262 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3263 socket.IPV6_RECVHOPLIMIT, 1)
3264 self.misc_event.set()
3265 msg, ancdata, flags, addr = self.doRecvmsg(
3266 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3267
3268 self.assertEqual(msg, MSG)
3269 self.checkRecvmsgAddress(addr, self.cli_addr)
3270 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3271
3272 self.assertLessEqual(len(ancdata), 1)
3273 if ancdata:
3274 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3275 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3276 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3277 self.assertLess(len(cmsg_data), SIZEOF_INT)
3278
3279 @testSingleCmsgTruncInData.client_skip
3280 def _testSingleCmsgTruncInData(self):
3281 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3282 self.sendToServer(MSG)
3283
3284 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3285 # Receive traffic class and hop limit into ancbufsize bytes of
3286 # ancillary data space, which should be large enough to
3287 # contain the first item, but too small to contain the header
3288 # of the second. Check that data is MSG, MSG_CTRUNC is set
3289 # (unless included in ignoreflags), and only one ancillary
3290 # data item is returned.
3291 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3292 socket.IPV6_RECVHOPLIMIT, 1)
3293 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3294 socket.IPV6_RECVTCLASS, 1)
3295 self.misc_event.set()
3296 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3297 len(MSG), ancbufsize)
3298
3299 self.assertEqual(msg, MSG)
3300 self.checkRecvmsgAddress(addr, self.cli_addr)
3301 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3302 ignore=ignoreflags)
3303
3304 self.assertEqual(len(ancdata), 1)
3305 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3306 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3307 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3308 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3309 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003310 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003311 self.assertGreaterEqual(a[0], 0)
3312 self.assertLessEqual(a[0], 255)
3313
3314 # Try the above test with various buffer sizes.
3315
3316 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3317 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3318 def testSecondCmsgTrunc0(self):
3319 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3320 ignoreflags=socket.MSG_CTRUNC)
3321
3322 @testSecondCmsgTrunc0.client_skip
3323 def _testSecondCmsgTrunc0(self):
3324 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3325 self.sendToServer(MSG)
3326
3327 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3328 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3329 def testSecondCmsgTrunc1(self):
3330 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3331
3332 @testSecondCmsgTrunc1.client_skip
3333 def _testSecondCmsgTrunc1(self):
3334 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3335 self.sendToServer(MSG)
3336
3337 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3338 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3339 def testSecondCmsgTrunc2Int(self):
3340 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3341 2 * SIZEOF_INT)
3342
3343 @testSecondCmsgTrunc2Int.client_skip
3344 def _testSecondCmsgTrunc2Int(self):
3345 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3346 self.sendToServer(MSG)
3347
3348 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3349 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3350 def testSecondCmsgTruncLen0Minus1(self):
3351 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3352 socket.CMSG_LEN(0) - 1)
3353
3354 @testSecondCmsgTruncLen0Minus1.client_skip
3355 def _testSecondCmsgTruncLen0Minus1(self):
3356 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3357 self.sendToServer(MSG)
3358
3359 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3360 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3361 def testSecomdCmsgTruncInData(self):
3362 # Test truncation of the second of two control messages inside
3363 # its associated data.
3364 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3365 socket.IPV6_RECVHOPLIMIT, 1)
3366 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3367 socket.IPV6_RECVTCLASS, 1)
3368 self.misc_event.set()
3369 msg, ancdata, flags, addr = self.doRecvmsg(
3370 self.serv_sock, len(MSG),
3371 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3372
3373 self.assertEqual(msg, MSG)
3374 self.checkRecvmsgAddress(addr, self.cli_addr)
3375 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3376
3377 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3378
3379 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3380 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3381 cmsg_types.remove(cmsg_type)
3382 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3383 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003384 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003385 self.assertGreaterEqual(a[0], 0)
3386 self.assertLessEqual(a[0], 255)
3387
3388 if ancdata:
3389 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3390 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3391 cmsg_types.remove(cmsg_type)
3392 self.assertLess(len(cmsg_data), SIZEOF_INT)
3393
3394 self.assertEqual(ancdata, [])
3395
3396 @testSecomdCmsgTruncInData.client_skip
3397 def _testSecomdCmsgTruncInData(self):
3398 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3399 self.sendToServer(MSG)
3400
3401
3402# Derive concrete test classes for different socket types.
3403
3404class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3405 SendrecvmsgConnectionlessBase,
3406 ThreadedSocketTestMixin, UDPTestBase):
3407 pass
3408
3409@requireAttrs(socket.socket, "sendmsg")
3410@unittest.skipUnless(thread, 'Threading required for this test.')
3411class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3412 pass
3413
3414@requireAttrs(socket.socket, "recvmsg")
3415@unittest.skipUnless(thread, 'Threading required for this test.')
3416class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3417 pass
3418
3419@requireAttrs(socket.socket, "recvmsg_into")
3420@unittest.skipUnless(thread, 'Threading required for this test.')
3421class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3422 pass
3423
3424
3425class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3426 SendrecvmsgConnectionlessBase,
3427 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003428
3429 def checkRecvmsgAddress(self, addr1, addr2):
3430 # Called to compare the received address with the address of
3431 # the peer, ignoring scope ID
3432 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003433
3434@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003435@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003436@requireSocket("AF_INET6", "SOCK_DGRAM")
3437@unittest.skipUnless(thread, 'Threading required for this test.')
3438class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3439 pass
3440
3441@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003442@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003443@requireSocket("AF_INET6", "SOCK_DGRAM")
3444@unittest.skipUnless(thread, 'Threading required for this test.')
3445class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3446 pass
3447
3448@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003449@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003450@requireSocket("AF_INET6", "SOCK_DGRAM")
3451@unittest.skipUnless(thread, 'Threading required for this test.')
3452class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3453 pass
3454
3455@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003456@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003457@requireAttrs(socket, "IPPROTO_IPV6")
3458@requireSocket("AF_INET6", "SOCK_DGRAM")
3459@unittest.skipUnless(thread, 'Threading required for this test.')
3460class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3461 SendrecvmsgUDP6TestBase):
3462 pass
3463
3464@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003465@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003466@requireAttrs(socket, "IPPROTO_IPV6")
3467@requireSocket("AF_INET6", "SOCK_DGRAM")
3468@unittest.skipUnless(thread, 'Threading required for this test.')
3469class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3470 RFC3542AncillaryTest,
3471 SendrecvmsgUDP6TestBase):
3472 pass
3473
3474
3475class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3476 ConnectedStreamTestMixin, TCPTestBase):
3477 pass
3478
3479@requireAttrs(socket.socket, "sendmsg")
3480@unittest.skipUnless(thread, 'Threading required for this test.')
3481class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3482 pass
3483
3484@requireAttrs(socket.socket, "recvmsg")
3485@unittest.skipUnless(thread, 'Threading required for this test.')
3486class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3487 SendrecvmsgTCPTestBase):
3488 pass
3489
3490@requireAttrs(socket.socket, "recvmsg_into")
3491@unittest.skipUnless(thread, 'Threading required for this test.')
3492class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3493 SendrecvmsgTCPTestBase):
3494 pass
3495
3496
3497class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3498 SendrecvmsgConnectedBase,
3499 ConnectedStreamTestMixin, SCTPStreamBase):
3500 pass
3501
3502@requireAttrs(socket.socket, "sendmsg")
3503@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3504@unittest.skipUnless(thread, 'Threading required for this test.')
3505class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3506 pass
3507
3508@requireAttrs(socket.socket, "recvmsg")
3509@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3510@unittest.skipUnless(thread, 'Threading required for this test.')
3511class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3512 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003513
3514 def testRecvmsgEOF(self):
3515 try:
3516 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3517 except OSError as e:
3518 if e.errno != errno.ENOTCONN:
3519 raise
3520 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003521
3522@requireAttrs(socket.socket, "recvmsg_into")
3523@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3524@unittest.skipUnless(thread, 'Threading required for this test.')
3525class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3526 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003527
3528 def testRecvmsgEOF(self):
3529 try:
3530 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3531 except OSError as e:
3532 if e.errno != errno.ENOTCONN:
3533 raise
3534 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003535
3536
3537class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3538 ConnectedStreamTestMixin, UnixStreamBase):
3539 pass
3540
3541@requireAttrs(socket.socket, "sendmsg")
3542@requireAttrs(socket, "AF_UNIX")
3543@unittest.skipUnless(thread, 'Threading required for this test.')
3544class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3545 pass
3546
3547@requireAttrs(socket.socket, "recvmsg")
3548@requireAttrs(socket, "AF_UNIX")
3549@unittest.skipUnless(thread, 'Threading required for this test.')
3550class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3551 SendrecvmsgUnixStreamTestBase):
3552 pass
3553
3554@requireAttrs(socket.socket, "recvmsg_into")
3555@requireAttrs(socket, "AF_UNIX")
3556@unittest.skipUnless(thread, 'Threading required for this test.')
3557class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3558 SendrecvmsgUnixStreamTestBase):
3559 pass
3560
3561@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3562@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3563@unittest.skipUnless(thread, 'Threading required for this test.')
3564class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3565 pass
3566
3567@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3568@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3569@unittest.skipUnless(thread, 'Threading required for this test.')
3570class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3571 SendrecvmsgUnixStreamTestBase):
3572 pass
3573
3574
3575# Test interrupting the interruptible send/receive methods with a
3576# signal when a timeout is set. These tests avoid having multiple
3577# threads alive during the test so that the OS cannot deliver the
3578# signal to the wrong one.
3579
3580class InterruptedTimeoutBase(unittest.TestCase):
3581 # Base class for interrupted send/receive tests. Installs an
3582 # empty handler for SIGALRM and removes it on teardown, along with
3583 # any scheduled alarms.
3584
3585 def setUp(self):
3586 super().setUp()
3587 orig_alrm_handler = signal.signal(signal.SIGALRM,
3588 lambda signum, frame: None)
3589 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3590 self.addCleanup(self.setAlarm, 0)
3591
3592 # Timeout for socket operations
3593 timeout = 4.0
3594
3595 # Provide setAlarm() method to schedule delivery of SIGALRM after
3596 # given number of seconds, or cancel it if zero, and an
3597 # appropriate time value to use. Use setitimer() if available.
3598 if hasattr(signal, "setitimer"):
3599 alarm_time = 0.05
3600
3601 def setAlarm(self, seconds):
3602 signal.setitimer(signal.ITIMER_REAL, seconds)
3603 else:
3604 # Old systems may deliver the alarm up to one second early
3605 alarm_time = 2
3606
3607 def setAlarm(self, seconds):
3608 signal.alarm(seconds)
3609
3610
3611# Require siginterrupt() in order to ensure that system calls are
3612# interrupted by default.
3613@requireAttrs(signal, "siginterrupt")
3614@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3615 "Don't have signal.alarm or signal.setitimer")
3616class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3617 # Test interrupting the recv*() methods with signals when a
3618 # timeout is set.
3619
3620 def setUp(self):
3621 super().setUp()
3622 self.serv.settimeout(self.timeout)
3623
3624 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003625 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003626 # errno of EINTR when interrupted by a signal.
3627 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003628 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003629 func(*args, **kwargs)
3630 self.assertNotIsInstance(cm.exception, socket.timeout)
3631 self.assertEqual(cm.exception.errno, errno.EINTR)
3632
3633 def testInterruptedRecvTimeout(self):
3634 self.checkInterruptedRecv(self.serv.recv, 1024)
3635
3636 def testInterruptedRecvIntoTimeout(self):
3637 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3638
3639 def testInterruptedRecvfromTimeout(self):
3640 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3641
3642 def testInterruptedRecvfromIntoTimeout(self):
3643 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3644
3645 @requireAttrs(socket.socket, "recvmsg")
3646 def testInterruptedRecvmsgTimeout(self):
3647 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3648
3649 @requireAttrs(socket.socket, "recvmsg_into")
3650 def testInterruptedRecvmsgIntoTimeout(self):
3651 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3652
3653
3654# Require siginterrupt() in order to ensure that system calls are
3655# interrupted by default.
3656@requireAttrs(signal, "siginterrupt")
3657@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3658 "Don't have signal.alarm or signal.setitimer")
3659@unittest.skipUnless(thread, 'Threading required for this test.')
3660class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3661 ThreadSafeCleanupTestCase,
3662 SocketListeningTestMixin, TCPTestBase):
3663 # Test interrupting the interruptible send*() methods with signals
3664 # when a timeout is set.
3665
3666 def setUp(self):
3667 super().setUp()
3668 self.serv_conn = self.newSocket()
3669 self.addCleanup(self.serv_conn.close)
3670 # Use a thread to complete the connection, but wait for it to
3671 # terminate before running the test, so that there is only one
3672 # thread to accept the signal.
3673 cli_thread = threading.Thread(target=self.doConnect)
3674 cli_thread.start()
3675 self.cli_conn, addr = self.serv.accept()
3676 self.addCleanup(self.cli_conn.close)
3677 cli_thread.join()
3678 self.serv_conn.settimeout(self.timeout)
3679
3680 def doConnect(self):
3681 self.serv_conn.connect(self.serv_addr)
3682
3683 def checkInterruptedSend(self, func, *args, **kwargs):
3684 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003685 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003686 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003687 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003688 while True:
3689 self.setAlarm(self.alarm_time)
3690 func(*args, **kwargs)
3691 self.assertNotIsInstance(cm.exception, socket.timeout)
3692 self.assertEqual(cm.exception.errno, errno.EINTR)
3693
Ned Deilyc5640382014-02-03 13:58:31 -08003694 # Issue #12958: The following tests have problems on OS X prior to 10.7
3695 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003696 def testInterruptedSendTimeout(self):
3697 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3698
Ned Deilyc5640382014-02-03 13:58:31 -08003699 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003700 def testInterruptedSendtoTimeout(self):
3701 # Passing an actual address here as Python's wrapper for
3702 # sendto() doesn't allow passing a zero-length one; POSIX
3703 # requires that the address is ignored since the socket is
3704 # connection-mode, however.
3705 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3706 self.serv_addr)
3707
Ned Deilyc5640382014-02-03 13:58:31 -08003708 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003709 @requireAttrs(socket.socket, "sendmsg")
3710 def testInterruptedSendmsgTimeout(self):
3711 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3712
3713
Victor Stinner45df8202010-04-28 22:31:17 +00003714@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003715class TCPCloserTest(ThreadedTCPSocketTest):
3716
3717 def testClose(self):
3718 conn, addr = self.serv.accept()
3719 conn.close()
3720
3721 sd = self.cli
3722 read, write, err = select.select([sd], [], [], 1.0)
3723 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003724 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003725
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003726 # Calling close() many times should be safe.
3727 conn.close()
3728 conn.close()
3729
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003730 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003731 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003732 time.sleep(1.0)
3733
Serhiy Storchaka43767632013-11-03 21:31:38 +02003734@unittest.skipUnless(hasattr(socket, 'socketpair'),
3735 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003736@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003737class BasicSocketPairTest(SocketPairTest):
3738
3739 def __init__(self, methodName='runTest'):
3740 SocketPairTest.__init__(self, methodName=methodName)
3741
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003742 def _check_defaults(self, sock):
3743 self.assertIsInstance(sock, socket.socket)
3744 if hasattr(socket, 'AF_UNIX'):
3745 self.assertEqual(sock.family, socket.AF_UNIX)
3746 else:
3747 self.assertEqual(sock.family, socket.AF_INET)
3748 self.assertEqual(sock.type, socket.SOCK_STREAM)
3749 self.assertEqual(sock.proto, 0)
3750
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003751 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003752 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003753
3754 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003755 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003756
Dave Cole331708b2004-08-09 04:51:41 +00003757 def testRecv(self):
3758 msg = self.serv.recv(1024)
3759 self.assertEqual(msg, MSG)
3760
3761 def _testRecv(self):
3762 self.cli.send(MSG)
3763
3764 def testSend(self):
3765 self.serv.send(MSG)
3766
3767 def _testSend(self):
3768 msg = self.cli.recv(1024)
3769 self.assertEqual(msg, MSG)
3770
Victor Stinner45df8202010-04-28 22:31:17 +00003771@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003772class NonBlockingTCPTests(ThreadedTCPSocketTest):
3773
3774 def __init__(self, methodName='runTest'):
3775 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3776
3777 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003778 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003779 self.serv.setblocking(True)
3780 self.assertIsNone(self.serv.gettimeout())
3781 self.serv.setblocking(False)
3782 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003783 start = time.time()
3784 try:
3785 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003786 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003787 pass
3788 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003789 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003790
3791 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003792 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003793
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003794 @support.cpython_only
3795 def testSetBlocking_overflow(self):
3796 # Issue 15989
3797 import _testcapi
3798 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3799 self.skipTest('needs UINT_MAX < ULONG_MAX')
3800 self.serv.setblocking(False)
3801 self.assertEqual(self.serv.gettimeout(), 0.0)
3802 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3803 self.assertIsNone(self.serv.gettimeout())
3804
3805 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3806
Serhiy Storchaka43767632013-11-03 21:31:38 +02003807 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3808 'test needs socket.SOCK_NONBLOCK')
3809 @support.requires_linux_version(2, 6, 28)
3810 def testInitNonBlocking(self):
3811 # reinit server socket
3812 self.serv.close()
3813 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3814 socket.SOCK_NONBLOCK)
3815 self.port = support.bind_port(self.serv)
3816 self.serv.listen(1)
3817 # actual testing
3818 start = time.time()
3819 try:
3820 self.serv.accept()
3821 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003822 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003823 end = time.time()
3824 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3825
3826 def _testInitNonBlocking(self):
3827 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003828
Antoine Pitrou600232b2011-01-05 21:03:42 +00003829 def testInheritFlags(self):
3830 # Issue #7995: when calling accept() on a listening socket with a
3831 # timeout, the resulting socket should not be non-blocking.
3832 self.serv.settimeout(10)
3833 try:
3834 conn, addr = self.serv.accept()
3835 message = conn.recv(len(MSG))
3836 finally:
3837 conn.close()
3838 self.serv.settimeout(None)
3839
3840 def _testInheritFlags(self):
3841 time.sleep(0.1)
3842 self.cli.connect((HOST, self.port))
3843 time.sleep(0.5)
3844 self.cli.send(MSG)
3845
Guido van Rossum24e4af82002-06-12 19:18:08 +00003846 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003847 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003848 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003849 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003850 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003851 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003852 pass
3853 else:
3854 self.fail("Error trying to do non-blocking accept.")
3855 read, write, err = select.select([self.serv], [], [])
3856 if self.serv in read:
3857 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003858 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003859 else:
3860 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003861
Guido van Rossum24e4af82002-06-12 19:18:08 +00003862 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003863 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003864 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003865
3866 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003867 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003868 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003869 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003870
3871 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003872 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003873 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003874
3875 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003876 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003877 conn, addr = self.serv.accept()
3878 conn.setblocking(0)
3879 try:
3880 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003881 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003882 pass
3883 else:
3884 self.fail("Error trying to do non-blocking recv.")
3885 read, write, err = select.select([conn], [], [])
3886 if conn in read:
3887 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003888 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003889 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003890 else:
3891 self.fail("Error during select call to non-blocking socket.")
3892
3893 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003894 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003895 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003896 self.cli.send(MSG)
3897
Victor Stinner45df8202010-04-28 22:31:17 +00003898@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003899class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003900 """Unit tests for the object returned by socket.makefile()
3901
Antoine Pitrou834bd812010-10-13 16:17:14 +00003902 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003903 the client connection. You can read from this file to
3904 get output from the server.
3905
Antoine Pitrou834bd812010-10-13 16:17:14 +00003906 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003907 server connection. You can write to this file to send output
3908 to the client.
3909 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003910
Guido van Rossume9f66142002-08-07 15:46:19 +00003911 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003912 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003913 errors = 'strict'
3914 newline = None
3915
3916 read_mode = 'rb'
3917 read_msg = MSG
3918 write_mode = 'wb'
3919 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003920
Guido van Rossum24e4af82002-06-12 19:18:08 +00003921 def __init__(self, methodName='runTest'):
3922 SocketConnectedTest.__init__(self, methodName=methodName)
3923
3924 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003925 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3926 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003927 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003928 self.read_file = self.cli_conn.makefile(
3929 self.read_mode, self.bufsize,
3930 encoding = self.encoding,
3931 errors = self.errors,
3932 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003933
3934 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003935 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003936 self.read_file.close()
3937 self.assertTrue(self.read_file.closed)
3938 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003939 SocketConnectedTest.tearDown(self)
3940
3941 def clientSetUp(self):
3942 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003943 self.write_file = self.serv_conn.makefile(
3944 self.write_mode, self.bufsize,
3945 encoding = self.encoding,
3946 errors = self.errors,
3947 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003948
3949 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003950 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003951 self.write_file.close()
3952 self.assertTrue(self.write_file.closed)
3953 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003954 SocketConnectedTest.clientTearDown(self)
3955
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003956 def testReadAfterTimeout(self):
3957 # Issue #7322: A file object must disallow further reads
3958 # after a timeout has occurred.
3959 self.cli_conn.settimeout(1)
3960 self.read_file.read(3)
3961 # First read raises a timeout
3962 self.assertRaises(socket.timeout, self.read_file.read, 1)
3963 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003964 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003965 self.read_file.read(1)
3966 self.assertIn("cannot read from timed out object", str(ctx.exception))
3967
3968 def _testReadAfterTimeout(self):
3969 self.write_file.write(self.write_msg[0:3])
3970 self.write_file.flush()
3971 self.serv_finished.wait()
3972
Guido van Rossum24e4af82002-06-12 19:18:08 +00003973 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003974 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003975 first_seg = self.read_file.read(len(self.read_msg)-3)
3976 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003977 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003978 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003979
3980 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003981 self.write_file.write(self.write_msg)
3982 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003983
Guido van Rossum8c943832002-08-08 01:00:28 +00003984 def testFullRead(self):
3985 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003986 msg = self.read_file.read()
3987 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003988
3989 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003990 self.write_file.write(self.write_msg)
3991 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003992
Guido van Rossum24e4af82002-06-12 19:18:08 +00003993 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003994 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003995 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003996 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003997 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003998 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003999 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004000 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004001 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004002
4003 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004004 self.write_file.write(self.write_msg)
4005 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004006
4007 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004008 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004009 line = self.read_file.readline()
4010 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004011
4012 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004013 self.write_file.write(self.write_msg)
4014 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004015
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004016 def testCloseAfterMakefile(self):
4017 # The file returned by makefile should keep the socket open.
4018 self.cli_conn.close()
4019 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004020 msg = self.read_file.read()
4021 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004022
4023 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004024 self.write_file.write(self.write_msg)
4025 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004026
4027 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004029 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004030 if isinstance(self.read_msg, str):
4031 msg = msg.decode()
4032 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004033
4034 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004035 self.write_file.write(self.write_msg)
4036 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004037
Tim Peters116d83c2004-03-28 02:20:45 +00004038 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004039 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004040
4041 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004042 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004043
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004044 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004045 self.assertEqual(self.read_file.mode, self.read_mode)
4046 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004047
4048 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004049 self.assertEqual(self.write_file.mode, self.write_mode)
4050 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004051
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004052 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004053 self.read_file.close()
4054 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004055 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004056 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004057
4058 def _testRealClose(self):
4059 pass
4060
4061
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004062class FileObjectInterruptedTestCase(unittest.TestCase):
4063 """Test that the file object correctly handles EINTR internally."""
4064
4065 class MockSocket(object):
4066 def __init__(self, recv_funcs=()):
4067 # A generator that returns callables that we'll call for each
4068 # call to recv().
4069 self._recv_step = iter(recv_funcs)
4070
4071 def recv_into(self, buffer):
4072 data = next(self._recv_step)()
4073 assert len(buffer) >= len(data)
4074 buffer[:len(data)] = data
4075 return len(data)
4076
4077 def _decref_socketios(self):
4078 pass
4079
4080 def _textiowrap_for_test(self, buffering=-1):
4081 raw = socket.SocketIO(self, "r")
4082 if buffering < 0:
4083 buffering = io.DEFAULT_BUFFER_SIZE
4084 if buffering == 0:
4085 return raw
4086 buffer = io.BufferedReader(raw, buffering)
4087 text = io.TextIOWrapper(buffer, None, None)
4088 text.mode = "rb"
4089 return text
4090
4091 @staticmethod
4092 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004093 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004094
4095 def _textiowrap_mock_socket(self, mock, buffering=-1):
4096 raw = socket.SocketIO(mock, "r")
4097 if buffering < 0:
4098 buffering = io.DEFAULT_BUFFER_SIZE
4099 if buffering == 0:
4100 return raw
4101 buffer = io.BufferedReader(raw, buffering)
4102 text = io.TextIOWrapper(buffer, None, None)
4103 text.mode = "rb"
4104 return text
4105
4106 def _test_readline(self, size=-1, buffering=-1):
4107 mock_sock = self.MockSocket(recv_funcs=[
4108 lambda : b"This is the first line\nAnd the sec",
4109 self._raise_eintr,
4110 lambda : b"ond line is here\n",
4111 lambda : b"",
4112 lambda : b"", # XXX(gps): io library does an extra EOF read
4113 ])
4114 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004115 self.assertEqual(fo.readline(size), "This is the first line\n")
4116 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004117
4118 def _test_read(self, size=-1, buffering=-1):
4119 mock_sock = self.MockSocket(recv_funcs=[
4120 lambda : b"This is the first line\nAnd the sec",
4121 self._raise_eintr,
4122 lambda : b"ond line is here\n",
4123 lambda : b"",
4124 lambda : b"", # XXX(gps): io library does an extra EOF read
4125 ])
4126 expecting = (b"This is the first line\n"
4127 b"And the second line is here\n")
4128 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4129 if buffering == 0:
4130 data = b''
4131 else:
4132 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004133 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004134 while len(data) != len(expecting):
4135 part = fo.read(size)
4136 if not part:
4137 break
4138 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004139 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004140
4141 def test_default(self):
4142 self._test_readline()
4143 self._test_readline(size=100)
4144 self._test_read()
4145 self._test_read(size=100)
4146
4147 def test_with_1k_buffer(self):
4148 self._test_readline(buffering=1024)
4149 self._test_readline(size=100, buffering=1024)
4150 self._test_read(buffering=1024)
4151 self._test_read(size=100, buffering=1024)
4152
4153 def _test_readline_no_buffer(self, size=-1):
4154 mock_sock = self.MockSocket(recv_funcs=[
4155 lambda : b"a",
4156 lambda : b"\n",
4157 lambda : b"B",
4158 self._raise_eintr,
4159 lambda : b"b",
4160 lambda : b"",
4161 ])
4162 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004163 self.assertEqual(fo.readline(size), b"a\n")
4164 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004165
4166 def test_no_buffer(self):
4167 self._test_readline_no_buffer()
4168 self._test_readline_no_buffer(size=4)
4169 self._test_read(buffering=0)
4170 self._test_read(size=100, buffering=0)
4171
4172
Guido van Rossume9f66142002-08-07 15:46:19 +00004173class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4174
4175 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004176
Guido van Rossume9f66142002-08-07 15:46:19 +00004177 In this case (and in this case only), it should be possible to
4178 create a file object, read a line from it, create another file
4179 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004180 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004181 when reading multiple requests from the same socket."""
4182
4183 bufsize = 0 # Use unbuffered mode
4184
4185 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004186 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004187 line = self.read_file.readline() # first line
4188 self.assertEqual(line, b"A. " + self.write_msg) # first line
4189 self.read_file = self.cli_conn.makefile('rb', 0)
4190 line = self.read_file.readline() # second line
4191 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004192
4193 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004194 self.write_file.write(b"A. " + self.write_msg)
4195 self.write_file.write(b"B. " + self.write_msg)
4196 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004197
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004198 def testMakefileClose(self):
4199 # The file returned by makefile should keep the socket open...
4200 self.cli_conn.close()
4201 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004202 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004203 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004204 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004205 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004206
4207 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004208 self.write_file.write(self.write_msg)
4209 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004210
4211 def testMakefileCloseSocketDestroy(self):
4212 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004213 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004214 refcount_after = sys.getrefcount(self.cli_conn)
4215 self.assertEqual(refcount_before - 1, refcount_after)
4216
4217 def _testMakefileCloseSocketDestroy(self):
4218 pass
4219
Antoine Pitrou98b46702010-09-18 22:59:00 +00004220 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004221 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004222 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4223
4224 def testSmallReadNonBlocking(self):
4225 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004226 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4227 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004228 self.evt1.set()
4229 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004230 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004231 if first_seg is None:
4232 # Data not arrived (can happen under Windows), wait a bit
4233 time.sleep(0.5)
4234 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004235 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004236 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004237 self.assertEqual(n, 3)
4238 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004239 self.assertEqual(msg, self.read_msg)
4240 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4241 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004242
4243 def _testSmallReadNonBlocking(self):
4244 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004245 self.write_file.write(self.write_msg)
4246 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004247 self.evt2.set()
4248 # Avoid cloding the socket before the server test has finished,
4249 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4250 self.serv_finished.wait(5.0)
4251
4252 def testWriteNonBlocking(self):
4253 self.cli_finished.wait(5.0)
4254 # The client thread can't skip directly - the SkipTest exception
4255 # would appear as a failure.
4256 if self.serv_skipped:
4257 self.skipTest(self.serv_skipped)
4258
4259 def _testWriteNonBlocking(self):
4260 self.serv_skipped = None
4261 self.serv_conn.setblocking(False)
4262 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004263 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004264 LIMIT = 10
4265 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004266 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004267 self.assertGreater(n, 0)
4268 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004269 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004270 if n is None:
4271 # Succeeded
4272 break
4273 self.assertGreater(n, 0)
4274 else:
4275 # Let us know that this test didn't manage to establish
4276 # the expected conditions. This is not a failure in itself but,
4277 # if it happens repeatedly, the test should be fixed.
4278 self.serv_skipped = "failed to saturate the socket buffer"
4279
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004280
Guido van Rossum8c943832002-08-08 01:00:28 +00004281class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4282
4283 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4284
4285
4286class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4287
4288 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004289
Thomas Woutersb2137042007-02-01 18:02:27 +00004290
Antoine Pitrou834bd812010-10-13 16:17:14 +00004291class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4292 """Tests for socket.makefile() in text mode (rather than binary)"""
4293
4294 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004295 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004296 write_mode = 'wb'
4297 write_msg = MSG
4298 newline = ''
4299
4300
4301class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4302 """Tests for socket.makefile() in text mode (rather than binary)"""
4303
4304 read_mode = 'rb'
4305 read_msg = MSG
4306 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004307 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004308 newline = ''
4309
4310
4311class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4312 """Tests for socket.makefile() in text mode (rather than binary)"""
4313
4314 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004315 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004316 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004317 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004318 newline = ''
4319
4320
Guido van Rossumd8faa362007-04-27 19:54:29 +00004321class NetworkConnectionTest(object):
4322 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004323
Guido van Rossumd8faa362007-04-27 19:54:29 +00004324 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004325 # We're inherited below by BasicTCPTest2, which also inherits
4326 # BasicTCPTest, which defines self.port referenced below.
4327 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004328 self.serv_conn = self.cli
4329
4330class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4331 """Tests that NetworkConnection does not break existing TCP functionality.
4332 """
4333
4334class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004335
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004336 class MockSocket(socket.socket):
4337 def connect(self, *args):
4338 raise socket.timeout('timed out')
4339
4340 @contextlib.contextmanager
4341 def mocked_socket_module(self):
4342 """Return a socket which times out on connect"""
4343 old_socket = socket.socket
4344 socket.socket = self.MockSocket
4345 try:
4346 yield
4347 finally:
4348 socket.socket = old_socket
4349
4350 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004351 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004352 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004353 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004354 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004355 cli.connect((HOST, port))
4356 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4357
4358 def test_create_connection(self):
4359 # Issue #9792: errors raised by create_connection() should have
4360 # a proper errno attribute.
4361 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004362 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004363 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004364
4365 # Issue #16257: create_connection() calls getaddrinfo() against
4366 # 'localhost'. This may result in an IPV6 addr being returned
4367 # as well as an IPV4 one:
4368 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4369 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4370 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4371 #
4372 # create_connection() enumerates through all the addresses returned
4373 # and if it doesn't successfully bind to any of them, it propagates
4374 # the last exception it encountered.
4375 #
4376 # On Solaris, ENETUNREACH is returned in this circumstance instead
4377 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4378 # expected errnos.
4379 expected_errnos = [ errno.ECONNREFUSED, ]
4380 if hasattr(errno, 'ENETUNREACH'):
4381 expected_errnos.append(errno.ENETUNREACH)
4382
4383 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004384
4385 def test_create_connection_timeout(self):
4386 # Issue #9792: create_connection() should not recast timeout errors
4387 # as generic socket errors.
4388 with self.mocked_socket_module():
4389 with self.assertRaises(socket.timeout):
4390 socket.create_connection((HOST, 1234))
4391
Guido van Rossumd8faa362007-04-27 19:54:29 +00004392
Victor Stinner45df8202010-04-28 22:31:17 +00004393@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004394class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4395
4396 def __init__(self, methodName='runTest'):
4397 SocketTCPTest.__init__(self, methodName=methodName)
4398 ThreadableTest.__init__(self)
4399
4400 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004401 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004402
4403 def clientTearDown(self):
4404 self.cli.close()
4405 self.cli = None
4406 ThreadableTest.clientTearDown(self)
4407
4408 def _justAccept(self):
4409 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004410 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004411
4412 testFamily = _justAccept
4413 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004414 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004415 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004416 self.assertEqual(self.cli.family, 2)
4417
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004418 testSourceAddress = _justAccept
4419 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004420 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4421 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004422 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004423 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004424 # The port number being used is sufficient to show that the bind()
4425 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004426
Guido van Rossumd8faa362007-04-27 19:54:29 +00004427 testTimeoutDefault = _justAccept
4428 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004429 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004430 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004431 socket.setdefaulttimeout(42)
4432 try:
4433 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004434 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004435 finally:
4436 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004437 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004438
4439 testTimeoutNone = _justAccept
4440 def _testTimeoutNone(self):
4441 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004442 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004443 socket.setdefaulttimeout(30)
4444 try:
4445 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004446 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004447 finally:
4448 socket.setdefaulttimeout(None)
4449 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004450
4451 testTimeoutValueNamed = _justAccept
4452 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004453 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004454 self.assertEqual(self.cli.gettimeout(), 30)
4455
4456 testTimeoutValueNonamed = _justAccept
4457 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004458 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004459 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004460 self.assertEqual(self.cli.gettimeout(), 30)
4461
Victor Stinner45df8202010-04-28 22:31:17 +00004462@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004463class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4464
4465 def __init__(self, methodName='runTest'):
4466 SocketTCPTest.__init__(self, methodName=methodName)
4467 ThreadableTest.__init__(self)
4468
4469 def clientSetUp(self):
4470 pass
4471
4472 def clientTearDown(self):
4473 self.cli.close()
4474 self.cli = None
4475 ThreadableTest.clientTearDown(self)
4476
4477 def testInsideTimeout(self):
4478 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004479 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004480 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004481 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004482 testOutsideTimeout = testInsideTimeout
4483
4484 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004485 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004486 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004487 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004488
4489 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004490 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004491 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004492
4493
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004494class TCPTimeoutTest(SocketTCPTest):
4495
4496 def testTCPTimeout(self):
4497 def raise_timeout(*args, **kwargs):
4498 self.serv.settimeout(1.0)
4499 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004500 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004501 "Error generating a timeout exception (TCP)")
4502
4503 def testTimeoutZero(self):
4504 ok = False
4505 try:
4506 self.serv.settimeout(0.0)
4507 foo = self.serv.accept()
4508 except socket.timeout:
4509 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004510 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004511 ok = True
4512 except:
4513 self.fail("caught unexpected exception (TCP)")
4514 if not ok:
4515 self.fail("accept() returned success when we did not expect it")
4516
Serhiy Storchaka43767632013-11-03 21:31:38 +02004517 @unittest.skipUnless(hasattr(signal, 'alarm'),
4518 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004519 def testInterruptedTimeout(self):
4520 # XXX I don't know how to do this test on MSWindows or any other
4521 # plaform that doesn't support signal.alarm() or os.kill(), though
4522 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004523 self.serv.settimeout(5.0) # must be longer than alarm
4524 class Alarm(Exception):
4525 pass
4526 def alarm_handler(signal, frame):
4527 raise Alarm
4528 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4529 try:
4530 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4531 try:
4532 foo = self.serv.accept()
4533 except socket.timeout:
4534 self.fail("caught timeout instead of Alarm")
4535 except Alarm:
4536 pass
4537 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004538 self.fail("caught other exception instead of Alarm:"
4539 " %s(%s):\n%s" %
4540 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004541 else:
4542 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004543 finally:
4544 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004545 except Alarm:
4546 self.fail("got Alarm in wrong place")
4547 finally:
4548 # no alarm can be pending. Safe to restore old handler.
4549 signal.signal(signal.SIGALRM, old_alarm)
4550
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004551class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004552
4553 def testUDPTimeout(self):
4554 def raise_timeout(*args, **kwargs):
4555 self.serv.settimeout(1.0)
4556 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004557 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004558 "Error generating a timeout exception (UDP)")
4559
4560 def testTimeoutZero(self):
4561 ok = False
4562 try:
4563 self.serv.settimeout(0.0)
4564 foo = self.serv.recv(1024)
4565 except socket.timeout:
4566 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004567 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004568 ok = True
4569 except:
4570 self.fail("caught unexpected exception (UDP)")
4571 if not ok:
4572 self.fail("recv() returned success when we did not expect it")
4573
4574class TestExceptions(unittest.TestCase):
4575
4576 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004577 self.assertTrue(issubclass(OSError, Exception))
4578 self.assertTrue(issubclass(socket.herror, OSError))
4579 self.assertTrue(issubclass(socket.gaierror, OSError))
4580 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004581
Serhiy Storchaka43767632013-11-03 21:31:38 +02004582@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004583class TestLinuxAbstractNamespace(unittest.TestCase):
4584
4585 UNIX_PATH_MAX = 108
4586
4587 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004588 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004589 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4590 s1.bind(address)
4591 s1.listen(1)
4592 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4593 s2.connect(s1.getsockname())
4594 with s1.accept()[0] as s3:
4595 self.assertEqual(s1.getsockname(), address)
4596 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004597
4598 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004599 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004600 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4601 s.bind(address)
4602 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004603
4604 def testNameOverflow(self):
4605 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004606 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004607 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004608
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004609 def testStrName(self):
4610 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004611 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4612 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004613 s.bind("\x00python\x00test\x00")
4614 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004615 finally:
4616 s.close()
4617
Serhiy Storchaka43767632013-11-03 21:31:38 +02004618@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004619class TestUnixDomain(unittest.TestCase):
4620
4621 def setUp(self):
4622 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4623
4624 def tearDown(self):
4625 self.sock.close()
4626
4627 def encoded(self, path):
4628 # Return the given path encoded in the file system encoding,
4629 # or skip the test if this is not possible.
4630 try:
4631 return os.fsencode(path)
4632 except UnicodeEncodeError:
4633 self.skipTest(
4634 "Pathname {0!a} cannot be represented in file "
4635 "system encoding {1!r}".format(
4636 path, sys.getfilesystemencoding()))
4637
Antoine Pitrou16374872011-12-16 15:04:12 +01004638 def bind(self, sock, path):
4639 # Bind the socket
4640 try:
4641 sock.bind(path)
4642 except OSError as e:
4643 if str(e) == "AF_UNIX path too long":
4644 self.skipTest(
4645 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4646 .format(path))
4647 else:
4648 raise
4649
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004650 def testStrAddr(self):
4651 # Test binding to and retrieving a normal string pathname.
4652 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004653 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004654 self.addCleanup(support.unlink, path)
4655 self.assertEqual(self.sock.getsockname(), path)
4656
4657 def testBytesAddr(self):
4658 # Test binding to a bytes pathname.
4659 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004660 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004661 self.addCleanup(support.unlink, path)
4662 self.assertEqual(self.sock.getsockname(), path)
4663
4664 def testSurrogateescapeBind(self):
4665 # Test binding to a valid non-ASCII pathname, with the
4666 # non-ASCII bytes supplied using surrogateescape encoding.
4667 path = os.path.abspath(support.TESTFN_UNICODE)
4668 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004669 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004670 self.addCleanup(support.unlink, path)
4671 self.assertEqual(self.sock.getsockname(), path)
4672
4673 def testUnencodableAddr(self):
4674 # Test binding to a pathname that cannot be encoded in the
4675 # file system encoding.
4676 if support.TESTFN_UNENCODABLE is None:
4677 self.skipTest("No unencodable filename available")
4678 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004679 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004680 self.addCleanup(support.unlink, path)
4681 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004682
Victor Stinner45df8202010-04-28 22:31:17 +00004683@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004684class BufferIOTest(SocketConnectedTest):
4685 """
4686 Test the buffer versions of socket.recv() and socket.send().
4687 """
4688 def __init__(self, methodName='runTest'):
4689 SocketConnectedTest.__init__(self, methodName=methodName)
4690
Antoine Pitrou25480782010-03-17 22:50:28 +00004691 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004692 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004693 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004694 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004695 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004696 self.assertEqual(msg, MSG)
4697
Antoine Pitrou25480782010-03-17 22:50:28 +00004698 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004699 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004700 self.serv_conn.send(buf)
4701
Antoine Pitrou25480782010-03-17 22:50:28 +00004702 def testRecvIntoBytearray(self):
4703 buf = bytearray(1024)
4704 nbytes = self.cli_conn.recv_into(buf)
4705 self.assertEqual(nbytes, len(MSG))
4706 msg = buf[:len(MSG)]
4707 self.assertEqual(msg, MSG)
4708
4709 _testRecvIntoBytearray = _testRecvIntoArray
4710
4711 def testRecvIntoMemoryview(self):
4712 buf = bytearray(1024)
4713 nbytes = self.cli_conn.recv_into(memoryview(buf))
4714 self.assertEqual(nbytes, len(MSG))
4715 msg = buf[:len(MSG)]
4716 self.assertEqual(msg, MSG)
4717
4718 _testRecvIntoMemoryview = _testRecvIntoArray
4719
4720 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004721 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004722 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004723 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004724 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004725 self.assertEqual(msg, MSG)
4726
Antoine Pitrou25480782010-03-17 22:50:28 +00004727 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004728 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004729 self.serv_conn.send(buf)
4730
Antoine Pitrou25480782010-03-17 22:50:28 +00004731 def testRecvFromIntoBytearray(self):
4732 buf = bytearray(1024)
4733 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4734 self.assertEqual(nbytes, len(MSG))
4735 msg = buf[:len(MSG)]
4736 self.assertEqual(msg, MSG)
4737
4738 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4739
4740 def testRecvFromIntoMemoryview(self):
4741 buf = bytearray(1024)
4742 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4743 self.assertEqual(nbytes, len(MSG))
4744 msg = buf[:len(MSG)]
4745 self.assertEqual(msg, MSG)
4746
4747 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4748
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004749 def testRecvFromIntoSmallBuffer(self):
4750 # See issue #20246.
4751 buf = bytearray(8)
4752 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4753
4754 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004755 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004756
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004757 def testRecvFromIntoEmptyBuffer(self):
4758 buf = bytearray()
4759 self.cli_conn.recvfrom_into(buf)
4760 self.cli_conn.recvfrom_into(buf, 0)
4761
4762 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4763
Christian Heimes043d6f62008-01-07 17:19:16 +00004764
4765TIPC_STYPE = 2000
4766TIPC_LOWER = 200
4767TIPC_UPPER = 210
4768
4769def isTipcAvailable():
4770 """Check if the TIPC module is loaded
4771
4772 The TIPC module is not loaded automatically on Ubuntu and probably
4773 other Linux distros.
4774 """
4775 if not hasattr(socket, "AF_TIPC"):
4776 return False
4777 if not os.path.isfile("/proc/modules"):
4778 return False
4779 with open("/proc/modules") as f:
4780 for line in f:
4781 if line.startswith("tipc "):
4782 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004783 return False
4784
Serhiy Storchaka43767632013-11-03 21:31:38 +02004785@unittest.skipUnless(isTipcAvailable(),
4786 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004787class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004788 def testRDM(self):
4789 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4790 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004791 self.addCleanup(srv.close)
4792 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004793
4794 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4795 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4796 TIPC_LOWER, TIPC_UPPER)
4797 srv.bind(srvaddr)
4798
4799 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4800 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4801 cli.sendto(MSG, sendaddr)
4802
4803 msg, recvaddr = srv.recvfrom(1024)
4804
4805 self.assertEqual(cli.getsockname(), recvaddr)
4806 self.assertEqual(msg, MSG)
4807
4808
Serhiy Storchaka43767632013-11-03 21:31:38 +02004809@unittest.skipUnless(isTipcAvailable(),
4810 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004811class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004812 def __init__(self, methodName = 'runTest'):
4813 unittest.TestCase.__init__(self, methodName = methodName)
4814 ThreadableTest.__init__(self)
4815
4816 def setUp(self):
4817 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004818 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004819 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4820 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4821 TIPC_LOWER, TIPC_UPPER)
4822 self.srv.bind(srvaddr)
4823 self.srv.listen(5)
4824 self.serverExplicitReady()
4825 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004826 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004827
4828 def clientSetUp(self):
4829 # The is a hittable race between serverExplicitReady() and the
4830 # accept() call; sleep a little while to avoid it, otherwise
4831 # we could get an exception
4832 time.sleep(0.1)
4833 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004834 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004835 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4836 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4837 self.cli.connect(addr)
4838 self.cliaddr = self.cli.getsockname()
4839
4840 def testStream(self):
4841 msg = self.conn.recv(1024)
4842 self.assertEqual(msg, MSG)
4843 self.assertEqual(self.cliaddr, self.connaddr)
4844
4845 def _testStream(self):
4846 self.cli.send(MSG)
4847 self.cli.close()
4848
4849
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004850@unittest.skipUnless(thread, 'Threading required for this test.')
4851class ContextManagersTest(ThreadedTCPSocketTest):
4852
4853 def _testSocketClass(self):
4854 # base test
4855 with socket.socket() as sock:
4856 self.assertFalse(sock._closed)
4857 self.assertTrue(sock._closed)
4858 # close inside with block
4859 with socket.socket() as sock:
4860 sock.close()
4861 self.assertTrue(sock._closed)
4862 # exception inside with block
4863 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004864 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004865 self.assertTrue(sock._closed)
4866
4867 def testCreateConnectionBase(self):
4868 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004869 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004870 data = conn.recv(1024)
4871 conn.sendall(data)
4872
4873 def _testCreateConnectionBase(self):
4874 address = self.serv.getsockname()
4875 with socket.create_connection(address) as sock:
4876 self.assertFalse(sock._closed)
4877 sock.sendall(b'foo')
4878 self.assertEqual(sock.recv(1024), b'foo')
4879 self.assertTrue(sock._closed)
4880
4881 def testCreateConnectionClose(self):
4882 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004883 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004884 data = conn.recv(1024)
4885 conn.sendall(data)
4886
4887 def _testCreateConnectionClose(self):
4888 address = self.serv.getsockname()
4889 with socket.create_connection(address) as sock:
4890 sock.close()
4891 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004892 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004893
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004894
Victor Stinnerdaf45552013-08-28 00:53:59 +02004895class InheritanceTest(unittest.TestCase):
4896 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4897 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004898 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004899 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004900 with socket.socket(socket.AF_INET,
4901 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4902 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004903 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004904
4905 def test_default_inheritable(self):
4906 sock = socket.socket()
4907 with sock:
4908 self.assertEqual(sock.get_inheritable(), False)
4909
4910 def test_dup(self):
4911 sock = socket.socket()
4912 with sock:
4913 newsock = sock.dup()
4914 sock.close()
4915 with newsock:
4916 self.assertEqual(newsock.get_inheritable(), False)
4917
4918 def test_set_inheritable(self):
4919 sock = socket.socket()
4920 with sock:
4921 sock.set_inheritable(True)
4922 self.assertEqual(sock.get_inheritable(), True)
4923
4924 sock.set_inheritable(False)
4925 self.assertEqual(sock.get_inheritable(), False)
4926
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004927 @unittest.skipIf(fcntl is None, "need fcntl")
4928 def test_get_inheritable_cloexec(self):
4929 sock = socket.socket()
4930 with sock:
4931 fd = sock.fileno()
4932 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004933
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004934 # clear FD_CLOEXEC flag
4935 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4936 flags &= ~fcntl.FD_CLOEXEC
4937 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004938
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004939 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004940
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004941 @unittest.skipIf(fcntl is None, "need fcntl")
4942 def test_set_inheritable_cloexec(self):
4943 sock = socket.socket()
4944 with sock:
4945 fd = sock.fileno()
4946 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4947 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004948
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004949 sock.set_inheritable(True)
4950 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4951 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004952
4953
Victor Stinnerdaf45552013-08-28 00:53:59 +02004954 @unittest.skipUnless(hasattr(socket, "socketpair"),
4955 "need socket.socketpair()")
4956 def test_socketpair(self):
4957 s1, s2 = socket.socketpair()
4958 self.addCleanup(s1.close)
4959 self.addCleanup(s2.close)
4960 self.assertEqual(s1.get_inheritable(), False)
4961 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004962
4963
4964@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4965 "SOCK_NONBLOCK not defined")
4966class NonblockConstantTest(unittest.TestCase):
4967 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4968 if nonblock:
4969 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4970 self.assertEqual(s.gettimeout(), timeout)
4971 else:
4972 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4973 self.assertEqual(s.gettimeout(), None)
4974
Charles-François Natali239bb962011-06-03 12:55:15 +02004975 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004976 def test_SOCK_NONBLOCK(self):
4977 # a lot of it seems silly and redundant, but I wanted to test that
4978 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004979 with socket.socket(socket.AF_INET,
4980 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4981 self.checkNonblock(s)
4982 s.setblocking(1)
4983 self.checkNonblock(s, False)
4984 s.setblocking(0)
4985 self.checkNonblock(s)
4986 s.settimeout(None)
4987 self.checkNonblock(s, False)
4988 s.settimeout(2.0)
4989 self.checkNonblock(s, timeout=2.0)
4990 s.setblocking(1)
4991 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004992 # defaulttimeout
4993 t = socket.getdefaulttimeout()
4994 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004995 with socket.socket() as s:
4996 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004997 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004998 with socket.socket() as s:
4999 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005000 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005001 with socket.socket() as s:
5002 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005003 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005004 with socket.socket() as s:
5005 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005006 socket.setdefaulttimeout(t)
5007
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005008
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005009@unittest.skipUnless(os.name == "nt", "Windows specific")
5010@unittest.skipUnless(multiprocessing, "need multiprocessing")
5011class TestSocketSharing(SocketTCPTest):
5012 # This must be classmethod and not staticmethod or multiprocessing
5013 # won't be able to bootstrap it.
5014 @classmethod
5015 def remoteProcessServer(cls, q):
5016 # Recreate socket from shared data
5017 sdata = q.get()
5018 message = q.get()
5019
5020 s = socket.fromshare(sdata)
5021 s2, c = s.accept()
5022
5023 # Send the message
5024 s2.sendall(message)
5025 s2.close()
5026 s.close()
5027
5028 def testShare(self):
5029 # Transfer the listening server socket to another process
5030 # and service it from there.
5031
5032 # Create process:
5033 q = multiprocessing.Queue()
5034 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5035 p.start()
5036
5037 # Get the shared socket data
5038 data = self.serv.share(p.pid)
5039
5040 # Pass the shared socket to the other process
5041 addr = self.serv.getsockname()
5042 self.serv.close()
5043 q.put(data)
5044
5045 # The data that the server will send us
5046 message = b"slapmahfro"
5047 q.put(message)
5048
5049 # Connect
5050 s = socket.create_connection(addr)
5051 # listen for the data
5052 m = []
5053 while True:
5054 data = s.recv(100)
5055 if not data:
5056 break
5057 m.append(data)
5058 s.close()
5059 received = b"".join(m)
5060 self.assertEqual(received, message)
5061 p.join()
5062
5063 def testShareLength(self):
5064 data = self.serv.share(os.getpid())
5065 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5066 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5067
5068 def compareSockets(self, org, other):
5069 # socket sharing is expected to work only for blocking socket
5070 # since the internal python timout value isn't transfered.
5071 self.assertEqual(org.gettimeout(), None)
5072 self.assertEqual(org.gettimeout(), other.gettimeout())
5073
5074 self.assertEqual(org.family, other.family)
5075 self.assertEqual(org.type, other.type)
5076 # If the user specified "0" for proto, then
5077 # internally windows will have picked the correct value.
5078 # Python introspection on the socket however will still return
5079 # 0. For the shared socket, the python value is recreated
5080 # from the actual value, so it may not compare correctly.
5081 if org.proto != 0:
5082 self.assertEqual(org.proto, other.proto)
5083
5084 def testShareLocal(self):
5085 data = self.serv.share(os.getpid())
5086 s = socket.fromshare(data)
5087 try:
5088 self.compareSockets(self.serv, s)
5089 finally:
5090 s.close()
5091
5092 def testTypes(self):
5093 families = [socket.AF_INET, socket.AF_INET6]
5094 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5095 for f in families:
5096 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005097 try:
5098 source = socket.socket(f, t)
5099 except OSError:
5100 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005101 try:
5102 data = source.share(os.getpid())
5103 shared = socket.fromshare(data)
5104 try:
5105 self.compareSockets(source, shared)
5106 finally:
5107 shared.close()
5108 finally:
5109 source.close()
5110
5111
Guido van Rossumb995eb72002-07-31 16:08:40 +00005112def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005113 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005114 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005115
5116 tests.extend([
5117 NonBlockingTCPTests,
5118 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005119 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005120 UnbufferedFileObjectClassTestCase,
5121 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005122 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005123 UnicodeReadFileObjectClassTestCase,
5124 UnicodeWriteFileObjectClassTestCase,
5125 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005126 NetworkConnectionNoServer,
5127 NetworkConnectionAttributesTest,
5128 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005129 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005130 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005131 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005132 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005133 tests.append(BasicSocketPairTest)
5134 tests.append(TestUnixDomain)
5135 tests.append(TestLinuxAbstractNamespace)
5136 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005137 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005138 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005139 tests.extend([
5140 CmsgMacroTests,
5141 SendmsgUDPTest,
5142 RecvmsgUDPTest,
5143 RecvmsgIntoUDPTest,
5144 SendmsgUDP6Test,
5145 RecvmsgUDP6Test,
5146 RecvmsgRFC3542AncillaryUDP6Test,
5147 RecvmsgIntoRFC3542AncillaryUDP6Test,
5148 RecvmsgIntoUDP6Test,
5149 SendmsgTCPTest,
5150 RecvmsgTCPTest,
5151 RecvmsgIntoTCPTest,
5152 SendmsgSCTPStreamTest,
5153 RecvmsgSCTPStreamTest,
5154 RecvmsgIntoSCTPStreamTest,
5155 SendmsgUnixStreamTest,
5156 RecvmsgUnixStreamTest,
5157 RecvmsgIntoUnixStreamTest,
5158 RecvmsgSCMRightsStreamTest,
5159 RecvmsgIntoSCMRightsStreamTest,
5160 # These are slow when setitimer() is not available
5161 InterruptedRecvTimeoutTest,
5162 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005163 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005164 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005165
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005166 thread_info = support.threading_setup()
5167 support.run_unittest(*tests)
5168 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005169
5170if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005171 test_main()