blob: 15e764098b663d1911f9607ea3f4dfe843b8f138 [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
1294 socket.gethostbyname('испытание.python.org')
1295 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001296 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1297 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1298 # have a reverse entry yet
1299 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001300
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001301 def check_sendall_interrupted(self, with_timeout):
1302 # socketpair() is not stricly required, but it makes things easier.
1303 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1304 self.skipTest("signal.alarm and socket.socketpair required for this test")
1305 # Our signal handlers clobber the C errno by calling a math function
1306 # with an invalid domain value.
1307 def ok_handler(*args):
1308 self.assertRaises(ValueError, math.acosh, 0)
1309 def raising_handler(*args):
1310 self.assertRaises(ValueError, math.acosh, 0)
1311 1 // 0
1312 c, s = socket.socketpair()
1313 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1314 try:
1315 if with_timeout:
1316 # Just above the one second minimum for signal.alarm
1317 c.settimeout(1.5)
1318 with self.assertRaises(ZeroDivisionError):
1319 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001320 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001321 if with_timeout:
1322 signal.signal(signal.SIGALRM, ok_handler)
1323 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001324 self.assertRaises(socket.timeout, c.sendall,
1325 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001326 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001327 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001328 signal.signal(signal.SIGALRM, old_alarm)
1329 c.close()
1330 s.close()
1331
1332 def test_sendall_interrupted(self):
1333 self.check_sendall_interrupted(False)
1334
1335 def test_sendall_interrupted_with_timeout(self):
1336 self.check_sendall_interrupted(True)
1337
Antoine Pitroue033e062010-10-29 10:38:18 +00001338 def test_dealloc_warn(self):
1339 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1340 r = repr(sock)
1341 with self.assertWarns(ResourceWarning) as cm:
1342 sock = None
1343 support.gc_collect()
1344 self.assertIn(r, str(cm.warning.args[0]))
1345 # An open socket file object gets dereferenced after the socket
1346 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1347 f = sock.makefile('rb')
1348 r = repr(sock)
1349 sock = None
1350 support.gc_collect()
1351 with self.assertWarns(ResourceWarning):
1352 f = None
1353 support.gc_collect()
1354
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001355 def test_name_closed_socketio(self):
1356 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1357 fp = sock.makefile("rb")
1358 fp.close()
1359 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1360
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001361 def test_unusable_closed_socketio(self):
1362 with socket.socket() as sock:
1363 fp = sock.makefile("rb", buffering=0)
1364 self.assertTrue(fp.readable())
1365 self.assertFalse(fp.writable())
1366 self.assertFalse(fp.seekable())
1367 fp.close()
1368 self.assertRaises(ValueError, fp.readable)
1369 self.assertRaises(ValueError, fp.writable)
1370 self.assertRaises(ValueError, fp.seekable)
1371
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001372 def test_pickle(self):
1373 sock = socket.socket()
1374 with sock:
1375 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1376 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1377
Serhiy Storchaka78980432013-01-15 01:12:17 +02001378 def test_listen_backlog(self):
1379 for backlog in 0, -1:
1380 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1381 srv.bind((HOST, 0))
1382 srv.listen(backlog)
1383 srv.close()
1384
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001385 @support.cpython_only
1386 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001387 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001388 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001389 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1390 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001391 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001392 srv.close()
1393
Charles-François Natali42663332012-01-02 15:57:30 +01001394 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001395 def test_flowinfo(self):
1396 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001397 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001398 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001399 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001400
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001401 def test_str_for_enums(self):
1402 # Make sure that the AF_* and SOCK_* constants have enum-like string
1403 # reprs.
1404 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1405 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001406 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001407
1408 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1409 def test_uknown_socket_family_repr(self):
1410 # Test that when created with a family that's not one of the known
1411 # AF_*/SOCK_* constants, socket.family just returns the number.
1412 #
1413 # To do this we fool socket.socket into believing it already has an
1414 # open fd because on this path it doesn't actually verify the family and
1415 # type and populates the socket object.
1416 #
1417 # On Windows this trick won't work, so the test is skipped.
1418 fd, _ = tempfile.mkstemp()
1419 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1420 self.assertEqual(s.family, 42424)
1421 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001422
Charles-François Natali47413c12011-10-06 19:47:44 +02001423@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1424class BasicCANTest(unittest.TestCase):
1425
1426 def testCrucialConstants(self):
1427 socket.AF_CAN
1428 socket.PF_CAN
1429 socket.CAN_RAW
1430
Charles-François Natali773e42d2013-02-05 19:42:01 +01001431 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1432 'socket.CAN_BCM required for this test.')
1433 def testBCMConstants(self):
1434 socket.CAN_BCM
1435
1436 # opcodes
1437 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1438 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1439 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1440 socket.CAN_BCM_TX_SEND # send one CAN frame
1441 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1442 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1443 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1444 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1445 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1446 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1447 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1448 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1449
Charles-François Natali47413c12011-10-06 19:47:44 +02001450 def testCreateSocket(self):
1451 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1452 pass
1453
Charles-François Natali773e42d2013-02-05 19:42:01 +01001454 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1455 'socket.CAN_BCM required for this test.')
1456 def testCreateBCMSocket(self):
1457 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1458 pass
1459
Charles-François Natali47413c12011-10-06 19:47:44 +02001460 def testBindAny(self):
1461 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1462 s.bind(('', ))
1463
1464 def testTooLongInterfaceName(self):
1465 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1466 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001467 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001468 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001469
1470 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1471 'socket.CAN_RAW_LOOPBACK required for this test.')
1472 def testLoopback(self):
1473 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1474 for loopback in (0, 1):
1475 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1476 loopback)
1477 self.assertEqual(loopback,
1478 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1479
1480 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1481 'socket.CAN_RAW_FILTER required for this test.')
1482 def testFilter(self):
1483 can_id, can_mask = 0x200, 0x700
1484 can_filter = struct.pack("=II", can_id, can_mask)
1485 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1486 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1487 self.assertEqual(can_filter,
1488 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1489
1490
1491@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001492@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001493class CANTest(ThreadedCANSocketTest):
1494
Charles-François Natali47413c12011-10-06 19:47:44 +02001495 def __init__(self, methodName='runTest'):
1496 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1497
1498 @classmethod
1499 def build_can_frame(cls, can_id, data):
1500 """Build a CAN frame."""
1501 can_dlc = len(data)
1502 data = data.ljust(8, b'\x00')
1503 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1504
1505 @classmethod
1506 def dissect_can_frame(cls, frame):
1507 """Dissect a CAN frame."""
1508 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1509 return (can_id, can_dlc, data[:can_dlc])
1510
1511 def testSendFrame(self):
1512 cf, addr = self.s.recvfrom(self.bufsize)
1513 self.assertEqual(self.cf, cf)
1514 self.assertEqual(addr[0], self.interface)
1515 self.assertEqual(addr[1], socket.AF_CAN)
1516
1517 def _testSendFrame(self):
1518 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1519 self.cli.send(self.cf)
1520
1521 def testSendMaxFrame(self):
1522 cf, addr = self.s.recvfrom(self.bufsize)
1523 self.assertEqual(self.cf, cf)
1524
1525 def _testSendMaxFrame(self):
1526 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1527 self.cli.send(self.cf)
1528
1529 def testSendMultiFrames(self):
1530 cf, addr = self.s.recvfrom(self.bufsize)
1531 self.assertEqual(self.cf1, cf)
1532
1533 cf, addr = self.s.recvfrom(self.bufsize)
1534 self.assertEqual(self.cf2, cf)
1535
1536 def _testSendMultiFrames(self):
1537 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1538 self.cli.send(self.cf1)
1539
1540 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1541 self.cli.send(self.cf2)
1542
Charles-François Natali773e42d2013-02-05 19:42:01 +01001543 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1544 'socket.CAN_BCM required for this test.')
1545 def _testBCM(self):
1546 cf, addr = self.cli.recvfrom(self.bufsize)
1547 self.assertEqual(self.cf, cf)
1548 can_id, can_dlc, data = self.dissect_can_frame(cf)
1549 self.assertEqual(self.can_id, can_id)
1550 self.assertEqual(self.data, data)
1551
1552 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1553 'socket.CAN_BCM required for this test.')
1554 def testBCM(self):
1555 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1556 self.addCleanup(bcm.close)
1557 bcm.connect((self.interface,))
1558 self.can_id = 0x123
1559 self.data = bytes([0xc0, 0xff, 0xee])
1560 self.cf = self.build_can_frame(self.can_id, self.data)
1561 opcode = socket.CAN_BCM_TX_SEND
1562 flags = 0
1563 count = 0
1564 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1565 bcm_can_id = 0x0222
1566 nframes = 1
1567 assert len(self.cf) == 16
1568 header = struct.pack(self.bcm_cmd_msg_fmt,
1569 opcode,
1570 flags,
1571 count,
1572 ival1_seconds,
1573 ival1_usec,
1574 ival2_seconds,
1575 ival2_usec,
1576 bcm_can_id,
1577 nframes,
1578 )
1579 header_plus_frame = header + self.cf
1580 bytes_sent = bcm.send(header_plus_frame)
1581 self.assertEqual(bytes_sent, len(header_plus_frame))
1582
Charles-François Natali47413c12011-10-06 19:47:44 +02001583
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001584@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1585class BasicRDSTest(unittest.TestCase):
1586
1587 def testCrucialConstants(self):
1588 socket.AF_RDS
1589 socket.PF_RDS
1590
1591 def testCreateSocket(self):
1592 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1593 pass
1594
1595 def testSocketBufferSize(self):
1596 bufsize = 16384
1597 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1598 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1599 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1600
1601
1602@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1603@unittest.skipUnless(thread, 'Threading required for this test.')
1604class RDSTest(ThreadedRDSSocketTest):
1605
1606 def __init__(self, methodName='runTest'):
1607 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1608
Charles-François Natali240c55f2011-11-10 20:33:36 +01001609 def setUp(self):
1610 super().setUp()
1611 self.evt = threading.Event()
1612
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001613 def testSendAndRecv(self):
1614 data, addr = self.serv.recvfrom(self.bufsize)
1615 self.assertEqual(self.data, data)
1616 self.assertEqual(self.cli_addr, addr)
1617
1618 def _testSendAndRecv(self):
1619 self.data = b'spam'
1620 self.cli.sendto(self.data, 0, (HOST, self.port))
1621
1622 def testPeek(self):
1623 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1624 self.assertEqual(self.data, data)
1625 data, addr = self.serv.recvfrom(self.bufsize)
1626 self.assertEqual(self.data, data)
1627
1628 def _testPeek(self):
1629 self.data = b'spam'
1630 self.cli.sendto(self.data, 0, (HOST, self.port))
1631
1632 @requireAttrs(socket.socket, 'recvmsg')
1633 def testSendAndRecvMsg(self):
1634 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1635 self.assertEqual(self.data, data)
1636
1637 @requireAttrs(socket.socket, 'sendmsg')
1638 def _testSendAndRecvMsg(self):
1639 self.data = b'hello ' * 10
1640 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1641
1642 def testSendAndRecvMulti(self):
1643 data, addr = self.serv.recvfrom(self.bufsize)
1644 self.assertEqual(self.data1, data)
1645
1646 data, addr = self.serv.recvfrom(self.bufsize)
1647 self.assertEqual(self.data2, data)
1648
1649 def _testSendAndRecvMulti(self):
1650 self.data1 = b'bacon'
1651 self.cli.sendto(self.data1, 0, (HOST, self.port))
1652
1653 self.data2 = b'egg'
1654 self.cli.sendto(self.data2, 0, (HOST, self.port))
1655
1656 def testSelect(self):
1657 r, w, x = select.select([self.serv], [], [], 3.0)
1658 self.assertIn(self.serv, r)
1659 data, addr = self.serv.recvfrom(self.bufsize)
1660 self.assertEqual(self.data, data)
1661
1662 def _testSelect(self):
1663 self.data = b'select'
1664 self.cli.sendto(self.data, 0, (HOST, self.port))
1665
1666 def testCongestion(self):
1667 # wait until the sender is done
1668 self.evt.wait()
1669
1670 def _testCongestion(self):
1671 # test the behavior in case of congestion
1672 self.data = b'fill'
1673 self.cli.setblocking(False)
1674 try:
1675 # try to lower the receiver's socket buffer size
1676 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1677 except OSError:
1678 pass
1679 with self.assertRaises(OSError) as cm:
1680 try:
1681 # fill the receiver's socket buffer
1682 while True:
1683 self.cli.sendto(self.data, 0, (HOST, self.port))
1684 finally:
1685 # signal the receiver we're done
1686 self.evt.set()
1687 # sendto() should have failed with ENOBUFS
1688 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1689 # and we should have received a congestion notification through poll
1690 r, w, x = select.select([self.serv], [], [], 3.0)
1691 self.assertIn(self.serv, r)
1692
1693
Victor Stinner45df8202010-04-28 22:31:17 +00001694@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001695class BasicTCPTest(SocketConnectedTest):
1696
1697 def __init__(self, methodName='runTest'):
1698 SocketConnectedTest.__init__(self, methodName=methodName)
1699
1700 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001701 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001702 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001703 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001704
1705 def _testRecv(self):
1706 self.serv_conn.send(MSG)
1707
1708 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001709 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001710 seg1 = self.cli_conn.recv(len(MSG) - 3)
1711 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001712 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001713 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001714
1715 def _testOverFlowRecv(self):
1716 self.serv_conn.send(MSG)
1717
1718 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001719 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001720 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001721 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001722
1723 def _testRecvFrom(self):
1724 self.serv_conn.send(MSG)
1725
1726 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001727 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001728 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1729 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001730 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001731 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001732
1733 def _testOverFlowRecvFrom(self):
1734 self.serv_conn.send(MSG)
1735
1736 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001737 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001738 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001739 while 1:
1740 read = self.cli_conn.recv(1024)
1741 if not read:
1742 break
Guido van Rossume531e292002-08-08 20:28:34 +00001743 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001744 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001745
1746 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001747 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001748 self.serv_conn.sendall(big_chunk)
1749
1750 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001751 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001752 fd = self.cli_conn.fileno()
1753 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001754 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001755 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001756 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001757 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001758
1759 def _testFromFd(self):
1760 self.serv_conn.send(MSG)
1761
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001762 def testDup(self):
1763 # Testing dup()
1764 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001765 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001766 msg = sock.recv(1024)
1767 self.assertEqual(msg, MSG)
1768
1769 def _testDup(self):
1770 self.serv_conn.send(MSG)
1771
Guido van Rossum24e4af82002-06-12 19:18:08 +00001772 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001773 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001774 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001775 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001776 # wait for _testShutdown to finish: on OS X, when the server
1777 # closes the connection the client also becomes disconnected,
1778 # and the client's shutdown call will fail. (Issue #4397.)
1779 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001780
1781 def _testShutdown(self):
1782 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001783 self.serv_conn.shutdown(2)
1784
1785 testShutdown_overflow = support.cpython_only(testShutdown)
1786
1787 @support.cpython_only
1788 def _testShutdown_overflow(self):
1789 import _testcapi
1790 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001791 # Issue 15989
1792 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1793 _testcapi.INT_MAX + 1)
1794 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1795 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001796 self.serv_conn.shutdown(2)
1797
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001798 def testDetach(self):
1799 # Testing detach()
1800 fileno = self.cli_conn.fileno()
1801 f = self.cli_conn.detach()
1802 self.assertEqual(f, fileno)
1803 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001804 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001805 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001806 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001807 # ...but we can create another socket using the (still open)
1808 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001809 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001810 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001811 msg = sock.recv(1024)
1812 self.assertEqual(msg, MSG)
1813
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001814 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001815 self.serv_conn.send(MSG)
1816
Victor Stinner45df8202010-04-28 22:31:17 +00001817@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001818class BasicUDPTest(ThreadedUDPSocketTest):
1819
1820 def __init__(self, methodName='runTest'):
1821 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1822
1823 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001824 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001825 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001826 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001827
1828 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001829 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001830
Guido van Rossum1c938012002-06-12 21:17:20 +00001831 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001832 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001833 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001834 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001835
Guido van Rossum1c938012002-06-12 21:17:20 +00001836 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001837 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001838
Guido van Rossumd8faa362007-04-27 19:54:29 +00001839 def testRecvFromNegative(self):
1840 # Negative lengths passed to recvfrom should give ValueError.
1841 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1842
1843 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001844 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001845
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001846# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1847# same test code is used with different families and types of socket
1848# (e.g. stream, datagram), and tests using recvmsg() are repeated
1849# using recvmsg_into().
1850#
1851# The generic test classes such as SendmsgTests and
1852# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1853# supplied with sockets cli_sock and serv_sock representing the
1854# client's and the server's end of the connection respectively, and
1855# attributes cli_addr and serv_addr holding their (numeric where
1856# appropriate) addresses.
1857#
1858# The final concrete test classes combine these with subclasses of
1859# SocketTestBase which set up client and server sockets of a specific
1860# type, and with subclasses of SendrecvmsgBase such as
1861# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1862# sockets to cli_sock and serv_sock and override the methods and
1863# attributes of SendrecvmsgBase to fill in destination addresses if
1864# needed when sending, check for specific flags in msg_flags, etc.
1865#
1866# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1867# recvmsg_into().
1868
1869# XXX: like the other datagram (UDP) tests in this module, the code
1870# here assumes that datagram delivery on the local machine will be
1871# reliable.
1872
1873class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1874 # Base class for sendmsg()/recvmsg() tests.
1875
1876 # Time in seconds to wait before considering a test failed, or
1877 # None for no timeout. Not all tests actually set a timeout.
1878 fail_timeout = 3.0
1879
1880 def setUp(self):
1881 self.misc_event = threading.Event()
1882 super().setUp()
1883
1884 def sendToServer(self, msg):
1885 # Send msg to the server.
1886 return self.cli_sock.send(msg)
1887
1888 # Tuple of alternative default arguments for sendmsg() when called
1889 # via sendmsgToServer() (e.g. to include a destination address).
1890 sendmsg_to_server_defaults = ()
1891
1892 def sendmsgToServer(self, *args):
1893 # Call sendmsg() on self.cli_sock with the given arguments,
1894 # filling in any arguments which are not supplied with the
1895 # corresponding items of self.sendmsg_to_server_defaults, if
1896 # any.
1897 return self.cli_sock.sendmsg(
1898 *(args + self.sendmsg_to_server_defaults[len(args):]))
1899
1900 def doRecvmsg(self, sock, bufsize, *args):
1901 # Call recvmsg() on sock with given arguments and return its
1902 # result. Should be used for tests which can use either
1903 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1904 # this method with one which emulates it using recvmsg_into(),
1905 # thus allowing the same test to be used for both methods.
1906 result = sock.recvmsg(bufsize, *args)
1907 self.registerRecvmsgResult(result)
1908 return result
1909
1910 def registerRecvmsgResult(self, result):
1911 # Called by doRecvmsg() with the return value of recvmsg() or
1912 # recvmsg_into(). Can be overridden to arrange cleanup based
1913 # on the returned ancillary data, for instance.
1914 pass
1915
1916 def checkRecvmsgAddress(self, addr1, addr2):
1917 # Called to compare the received address with the address of
1918 # the peer.
1919 self.assertEqual(addr1, addr2)
1920
1921 # Flags that are normally unset in msg_flags
1922 msg_flags_common_unset = 0
1923 for name in ("MSG_CTRUNC", "MSG_OOB"):
1924 msg_flags_common_unset |= getattr(socket, name, 0)
1925
1926 # Flags that are normally set
1927 msg_flags_common_set = 0
1928
1929 # Flags set when a complete record has been received (e.g. MSG_EOR
1930 # for SCTP)
1931 msg_flags_eor_indicator = 0
1932
1933 # Flags set when a complete record has not been received
1934 # (e.g. MSG_TRUNC for datagram sockets)
1935 msg_flags_non_eor_indicator = 0
1936
1937 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1938 # Method to check the value of msg_flags returned by recvmsg[_into]().
1939 #
1940 # Checks that all bits in msg_flags_common_set attribute are
1941 # set in "flags" and all bits in msg_flags_common_unset are
1942 # unset.
1943 #
1944 # The "eor" argument specifies whether the flags should
1945 # indicate that a full record (or datagram) has been received.
1946 # If "eor" is None, no checks are done; otherwise, checks
1947 # that:
1948 #
1949 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1950 # set and all bits in msg_flags_non_eor_indicator are unset
1951 #
1952 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1953 # are set and all bits in msg_flags_eor_indicator are unset
1954 #
1955 # If "checkset" and/or "checkunset" are supplied, they require
1956 # the given bits to be set or unset respectively, overriding
1957 # what the attributes require for those bits.
1958 #
1959 # If any bits are set in "ignore", they will not be checked,
1960 # regardless of the other inputs.
1961 #
1962 # Will raise Exception if the inputs require a bit to be both
1963 # set and unset, and it is not ignored.
1964
1965 defaultset = self.msg_flags_common_set
1966 defaultunset = self.msg_flags_common_unset
1967
1968 if eor:
1969 defaultset |= self.msg_flags_eor_indicator
1970 defaultunset |= self.msg_flags_non_eor_indicator
1971 elif eor is not None:
1972 defaultset |= self.msg_flags_non_eor_indicator
1973 defaultunset |= self.msg_flags_eor_indicator
1974
1975 # Function arguments override defaults
1976 defaultset &= ~checkunset
1977 defaultunset &= ~checkset
1978
1979 # Merge arguments with remaining defaults, and check for conflicts
1980 checkset |= defaultset
1981 checkunset |= defaultunset
1982 inboth = checkset & checkunset & ~ignore
1983 if inboth:
1984 raise Exception("contradictory set, unset requirements for flags "
1985 "{0:#x}".format(inboth))
1986
1987 # Compare with given msg_flags value
1988 mask = (checkset | checkunset) & ~ignore
1989 self.assertEqual(flags & mask, checkset & mask)
1990
1991
1992class RecvmsgIntoMixin(SendrecvmsgBase):
1993 # Mixin to implement doRecvmsg() using recvmsg_into().
1994
1995 def doRecvmsg(self, sock, bufsize, *args):
1996 buf = bytearray(bufsize)
1997 result = sock.recvmsg_into([buf], *args)
1998 self.registerRecvmsgResult(result)
1999 self.assertGreaterEqual(result[0], 0)
2000 self.assertLessEqual(result[0], bufsize)
2001 return (bytes(buf[:result[0]]),) + result[1:]
2002
2003
2004class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2005 # Defines flags to be checked in msg_flags for datagram sockets.
2006
2007 @property
2008 def msg_flags_non_eor_indicator(self):
2009 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2010
2011
2012class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2013 # Defines flags to be checked in msg_flags for SCTP sockets.
2014
2015 @property
2016 def msg_flags_eor_indicator(self):
2017 return super().msg_flags_eor_indicator | socket.MSG_EOR
2018
2019
2020class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2021 # Base class for tests on connectionless-mode sockets. Users must
2022 # supply sockets on attributes cli and serv to be mapped to
2023 # cli_sock and serv_sock respectively.
2024
2025 @property
2026 def serv_sock(self):
2027 return self.serv
2028
2029 @property
2030 def cli_sock(self):
2031 return self.cli
2032
2033 @property
2034 def sendmsg_to_server_defaults(self):
2035 return ([], [], 0, self.serv_addr)
2036
2037 def sendToServer(self, msg):
2038 return self.cli_sock.sendto(msg, self.serv_addr)
2039
2040
2041class SendrecvmsgConnectedBase(SendrecvmsgBase):
2042 # Base class for tests on connected sockets. Users must supply
2043 # sockets on attributes serv_conn and cli_conn (representing the
2044 # connections *to* the server and the client), to be mapped to
2045 # cli_sock and serv_sock respectively.
2046
2047 @property
2048 def serv_sock(self):
2049 return self.cli_conn
2050
2051 @property
2052 def cli_sock(self):
2053 return self.serv_conn
2054
2055 def checkRecvmsgAddress(self, addr1, addr2):
2056 # Address is currently "unspecified" for a connected socket,
2057 # so we don't examine it
2058 pass
2059
2060
2061class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2062 # Base class to set a timeout on server's socket.
2063
2064 def setUp(self):
2065 super().setUp()
2066 self.serv_sock.settimeout(self.fail_timeout)
2067
2068
2069class SendmsgTests(SendrecvmsgServerTimeoutBase):
2070 # Tests for sendmsg() which can use any socket type and do not
2071 # involve recvmsg() or recvmsg_into().
2072
2073 def testSendmsg(self):
2074 # Send a simple message with sendmsg().
2075 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2076
2077 def _testSendmsg(self):
2078 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2079
2080 def testSendmsgDataGenerator(self):
2081 # Send from buffer obtained from a generator (not a sequence).
2082 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2083
2084 def _testSendmsgDataGenerator(self):
2085 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2086 len(MSG))
2087
2088 def testSendmsgAncillaryGenerator(self):
2089 # Gather (empty) ancillary data from a generator.
2090 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2091
2092 def _testSendmsgAncillaryGenerator(self):
2093 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2094 len(MSG))
2095
2096 def testSendmsgArray(self):
2097 # Send data from an array instead of the usual bytes object.
2098 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2099
2100 def _testSendmsgArray(self):
2101 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2102 len(MSG))
2103
2104 def testSendmsgGather(self):
2105 # Send message data from more than one buffer (gather write).
2106 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2107
2108 def _testSendmsgGather(self):
2109 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2110
2111 def testSendmsgBadArgs(self):
2112 # Check that sendmsg() rejects invalid arguments.
2113 self.assertEqual(self.serv_sock.recv(1000), b"done")
2114
2115 def _testSendmsgBadArgs(self):
2116 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2117 self.assertRaises(TypeError, self.sendmsgToServer,
2118 b"not in an iterable")
2119 self.assertRaises(TypeError, self.sendmsgToServer,
2120 object())
2121 self.assertRaises(TypeError, self.sendmsgToServer,
2122 [object()])
2123 self.assertRaises(TypeError, self.sendmsgToServer,
2124 [MSG, object()])
2125 self.assertRaises(TypeError, self.sendmsgToServer,
2126 [MSG], object())
2127 self.assertRaises(TypeError, self.sendmsgToServer,
2128 [MSG], [], object())
2129 self.assertRaises(TypeError, self.sendmsgToServer,
2130 [MSG], [], 0, object())
2131 self.sendToServer(b"done")
2132
2133 def testSendmsgBadCmsg(self):
2134 # Check that invalid ancillary data items are rejected.
2135 self.assertEqual(self.serv_sock.recv(1000), b"done")
2136
2137 def _testSendmsgBadCmsg(self):
2138 self.assertRaises(TypeError, self.sendmsgToServer,
2139 [MSG], [object()])
2140 self.assertRaises(TypeError, self.sendmsgToServer,
2141 [MSG], [(object(), 0, b"data")])
2142 self.assertRaises(TypeError, self.sendmsgToServer,
2143 [MSG], [(0, object(), b"data")])
2144 self.assertRaises(TypeError, self.sendmsgToServer,
2145 [MSG], [(0, 0, object())])
2146 self.assertRaises(TypeError, self.sendmsgToServer,
2147 [MSG], [(0, 0)])
2148 self.assertRaises(TypeError, self.sendmsgToServer,
2149 [MSG], [(0, 0, b"data", 42)])
2150 self.sendToServer(b"done")
2151
2152 @requireAttrs(socket, "CMSG_SPACE")
2153 def testSendmsgBadMultiCmsg(self):
2154 # Check that invalid ancillary data items are rejected when
2155 # more than one item is present.
2156 self.assertEqual(self.serv_sock.recv(1000), b"done")
2157
2158 @testSendmsgBadMultiCmsg.client_skip
2159 def _testSendmsgBadMultiCmsg(self):
2160 self.assertRaises(TypeError, self.sendmsgToServer,
2161 [MSG], [0, 0, b""])
2162 self.assertRaises(TypeError, self.sendmsgToServer,
2163 [MSG], [(0, 0, b""), object()])
2164 self.sendToServer(b"done")
2165
2166 def testSendmsgExcessCmsgReject(self):
2167 # Check that sendmsg() rejects excess ancillary data items
2168 # when the number that can be sent is limited.
2169 self.assertEqual(self.serv_sock.recv(1000), b"done")
2170
2171 def _testSendmsgExcessCmsgReject(self):
2172 if not hasattr(socket, "CMSG_SPACE"):
2173 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002174 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002175 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2176 self.assertIsNone(cm.exception.errno)
2177 self.sendToServer(b"done")
2178
2179 def testSendmsgAfterClose(self):
2180 # Check that sendmsg() fails on a closed socket.
2181 pass
2182
2183 def _testSendmsgAfterClose(self):
2184 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002185 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002186
2187
2188class SendmsgStreamTests(SendmsgTests):
2189 # Tests for sendmsg() which require a stream socket and do not
2190 # involve recvmsg() or recvmsg_into().
2191
2192 def testSendmsgExplicitNoneAddr(self):
2193 # Check that peer address can be specified as None.
2194 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2195
2196 def _testSendmsgExplicitNoneAddr(self):
2197 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2198
2199 def testSendmsgTimeout(self):
2200 # Check that timeout works with sendmsg().
2201 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2202 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2203
2204 def _testSendmsgTimeout(self):
2205 try:
2206 self.cli_sock.settimeout(0.03)
2207 with self.assertRaises(socket.timeout):
2208 while True:
2209 self.sendmsgToServer([b"a"*512])
2210 finally:
2211 self.misc_event.set()
2212
2213 # XXX: would be nice to have more tests for sendmsg flags argument.
2214
2215 # Linux supports MSG_DONTWAIT when sending, but in general, it
2216 # only works when receiving. Could add other platforms if they
2217 # support it too.
2218 @skipWithClientIf(sys.platform not in {"linux2"},
2219 "MSG_DONTWAIT not known to work on this platform when "
2220 "sending")
2221 def testSendmsgDontWait(self):
2222 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2223 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2224 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2225
2226 @testSendmsgDontWait.client_skip
2227 def _testSendmsgDontWait(self):
2228 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002229 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002230 while True:
2231 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2232 self.assertIn(cm.exception.errno,
2233 (errno.EAGAIN, errno.EWOULDBLOCK))
2234 finally:
2235 self.misc_event.set()
2236
2237
2238class SendmsgConnectionlessTests(SendmsgTests):
2239 # Tests for sendmsg() which require a connectionless-mode
2240 # (e.g. datagram) socket, and do not involve recvmsg() or
2241 # recvmsg_into().
2242
2243 def testSendmsgNoDestAddr(self):
2244 # Check that sendmsg() fails when no destination address is
2245 # given for unconnected socket.
2246 pass
2247
2248 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002249 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002250 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002251 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002252 [MSG], [], 0, None)
2253
2254
2255class RecvmsgGenericTests(SendrecvmsgBase):
2256 # Tests for recvmsg() which can also be emulated using
2257 # recvmsg_into(), and can use any socket type.
2258
2259 def testRecvmsg(self):
2260 # Receive a simple message with recvmsg[_into]().
2261 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2262 self.assertEqual(msg, MSG)
2263 self.checkRecvmsgAddress(addr, self.cli_addr)
2264 self.assertEqual(ancdata, [])
2265 self.checkFlags(flags, eor=True)
2266
2267 def _testRecvmsg(self):
2268 self.sendToServer(MSG)
2269
2270 def testRecvmsgExplicitDefaults(self):
2271 # Test recvmsg[_into]() with default arguments provided explicitly.
2272 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2273 len(MSG), 0, 0)
2274 self.assertEqual(msg, MSG)
2275 self.checkRecvmsgAddress(addr, self.cli_addr)
2276 self.assertEqual(ancdata, [])
2277 self.checkFlags(flags, eor=True)
2278
2279 def _testRecvmsgExplicitDefaults(self):
2280 self.sendToServer(MSG)
2281
2282 def testRecvmsgShorter(self):
2283 # Receive a message smaller than buffer.
2284 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2285 len(MSG) + 42)
2286 self.assertEqual(msg, MSG)
2287 self.checkRecvmsgAddress(addr, self.cli_addr)
2288 self.assertEqual(ancdata, [])
2289 self.checkFlags(flags, eor=True)
2290
2291 def _testRecvmsgShorter(self):
2292 self.sendToServer(MSG)
2293
Charles-François Natali8619cd72011-10-03 19:43:15 +02002294 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2295 # datagram is received (issue #13001).
2296 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002297 def testRecvmsgTrunc(self):
2298 # Receive part of message, check for truncation indicators.
2299 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2300 len(MSG) - 3)
2301 self.assertEqual(msg, MSG[:-3])
2302 self.checkRecvmsgAddress(addr, self.cli_addr)
2303 self.assertEqual(ancdata, [])
2304 self.checkFlags(flags, eor=False)
2305
Charles-François Natali8619cd72011-10-03 19:43:15 +02002306 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002307 def _testRecvmsgTrunc(self):
2308 self.sendToServer(MSG)
2309
2310 def testRecvmsgShortAncillaryBuf(self):
2311 # Test ancillary data buffer too small to hold any ancillary data.
2312 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2313 len(MSG), 1)
2314 self.assertEqual(msg, MSG)
2315 self.checkRecvmsgAddress(addr, self.cli_addr)
2316 self.assertEqual(ancdata, [])
2317 self.checkFlags(flags, eor=True)
2318
2319 def _testRecvmsgShortAncillaryBuf(self):
2320 self.sendToServer(MSG)
2321
2322 def testRecvmsgLongAncillaryBuf(self):
2323 # Test large ancillary data buffer.
2324 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2325 len(MSG), 10240)
2326 self.assertEqual(msg, MSG)
2327 self.checkRecvmsgAddress(addr, self.cli_addr)
2328 self.assertEqual(ancdata, [])
2329 self.checkFlags(flags, eor=True)
2330
2331 def _testRecvmsgLongAncillaryBuf(self):
2332 self.sendToServer(MSG)
2333
2334 def testRecvmsgAfterClose(self):
2335 # Check that recvmsg[_into]() fails on a closed socket.
2336 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002337 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002338
2339 def _testRecvmsgAfterClose(self):
2340 pass
2341
2342 def testRecvmsgTimeout(self):
2343 # Check that timeout works.
2344 try:
2345 self.serv_sock.settimeout(0.03)
2346 self.assertRaises(socket.timeout,
2347 self.doRecvmsg, self.serv_sock, len(MSG))
2348 finally:
2349 self.misc_event.set()
2350
2351 def _testRecvmsgTimeout(self):
2352 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2353
2354 @requireAttrs(socket, "MSG_PEEK")
2355 def testRecvmsgPeek(self):
2356 # Check that MSG_PEEK in flags enables examination of pending
2357 # data without consuming it.
2358
2359 # Receive part of data with MSG_PEEK.
2360 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2361 len(MSG) - 3, 0,
2362 socket.MSG_PEEK)
2363 self.assertEqual(msg, MSG[:-3])
2364 self.checkRecvmsgAddress(addr, self.cli_addr)
2365 self.assertEqual(ancdata, [])
2366 # Ignoring MSG_TRUNC here (so this test is the same for stream
2367 # and datagram sockets). Some wording in POSIX seems to
2368 # suggest that it needn't be set when peeking, but that may
2369 # just be a slip.
2370 self.checkFlags(flags, eor=False,
2371 ignore=getattr(socket, "MSG_TRUNC", 0))
2372
2373 # Receive all data with MSG_PEEK.
2374 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2375 len(MSG), 0,
2376 socket.MSG_PEEK)
2377 self.assertEqual(msg, MSG)
2378 self.checkRecvmsgAddress(addr, self.cli_addr)
2379 self.assertEqual(ancdata, [])
2380 self.checkFlags(flags, eor=True)
2381
2382 # Check that the same data can still be received normally.
2383 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2384 self.assertEqual(msg, MSG)
2385 self.checkRecvmsgAddress(addr, self.cli_addr)
2386 self.assertEqual(ancdata, [])
2387 self.checkFlags(flags, eor=True)
2388
2389 @testRecvmsgPeek.client_skip
2390 def _testRecvmsgPeek(self):
2391 self.sendToServer(MSG)
2392
2393 @requireAttrs(socket.socket, "sendmsg")
2394 def testRecvmsgFromSendmsg(self):
2395 # Test receiving with recvmsg[_into]() when message is sent
2396 # using sendmsg().
2397 self.serv_sock.settimeout(self.fail_timeout)
2398 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2399 self.assertEqual(msg, MSG)
2400 self.checkRecvmsgAddress(addr, self.cli_addr)
2401 self.assertEqual(ancdata, [])
2402 self.checkFlags(flags, eor=True)
2403
2404 @testRecvmsgFromSendmsg.client_skip
2405 def _testRecvmsgFromSendmsg(self):
2406 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2407
2408
2409class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2410 # Tests which require a stream socket and can use either recvmsg()
2411 # or recvmsg_into().
2412
2413 def testRecvmsgEOF(self):
2414 # Receive end-of-stream indicator (b"", peer socket closed).
2415 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2416 self.assertEqual(msg, b"")
2417 self.checkRecvmsgAddress(addr, self.cli_addr)
2418 self.assertEqual(ancdata, [])
2419 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2420
2421 def _testRecvmsgEOF(self):
2422 self.cli_sock.close()
2423
2424 def testRecvmsgOverflow(self):
2425 # Receive a message in more than one chunk.
2426 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2427 len(MSG) - 3)
2428 self.checkRecvmsgAddress(addr, self.cli_addr)
2429 self.assertEqual(ancdata, [])
2430 self.checkFlags(flags, eor=False)
2431
2432 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2433 self.checkRecvmsgAddress(addr, self.cli_addr)
2434 self.assertEqual(ancdata, [])
2435 self.checkFlags(flags, eor=True)
2436
2437 msg = seg1 + seg2
2438 self.assertEqual(msg, MSG)
2439
2440 def _testRecvmsgOverflow(self):
2441 self.sendToServer(MSG)
2442
2443
2444class RecvmsgTests(RecvmsgGenericTests):
2445 # Tests for recvmsg() which can use any socket type.
2446
2447 def testRecvmsgBadArgs(self):
2448 # Check that recvmsg() rejects invalid arguments.
2449 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2450 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2451 -1, 0, 0)
2452 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2453 len(MSG), -1, 0)
2454 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2455 [bytearray(10)], 0, 0)
2456 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2457 object(), 0, 0)
2458 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2459 len(MSG), object(), 0)
2460 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2461 len(MSG), 0, object())
2462
2463 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2464 self.assertEqual(msg, MSG)
2465 self.checkRecvmsgAddress(addr, self.cli_addr)
2466 self.assertEqual(ancdata, [])
2467 self.checkFlags(flags, eor=True)
2468
2469 def _testRecvmsgBadArgs(self):
2470 self.sendToServer(MSG)
2471
2472
2473class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2474 # Tests for recvmsg_into() which can use any socket type.
2475
2476 def testRecvmsgIntoBadArgs(self):
2477 # Check that recvmsg_into() rejects invalid arguments.
2478 buf = bytearray(len(MSG))
2479 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2480 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2481 len(MSG), 0, 0)
2482 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2483 buf, 0, 0)
2484 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2485 [object()], 0, 0)
2486 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2487 [b"I'm not writable"], 0, 0)
2488 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2489 [buf, object()], 0, 0)
2490 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2491 [buf], -1, 0)
2492 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2493 [buf], object(), 0)
2494 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2495 [buf], 0, object())
2496
2497 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2498 self.assertEqual(nbytes, len(MSG))
2499 self.assertEqual(buf, bytearray(MSG))
2500 self.checkRecvmsgAddress(addr, self.cli_addr)
2501 self.assertEqual(ancdata, [])
2502 self.checkFlags(flags, eor=True)
2503
2504 def _testRecvmsgIntoBadArgs(self):
2505 self.sendToServer(MSG)
2506
2507 def testRecvmsgIntoGenerator(self):
2508 # Receive into buffer obtained from a generator (not a sequence).
2509 buf = bytearray(len(MSG))
2510 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2511 (o for o in [buf]))
2512 self.assertEqual(nbytes, len(MSG))
2513 self.assertEqual(buf, bytearray(MSG))
2514 self.checkRecvmsgAddress(addr, self.cli_addr)
2515 self.assertEqual(ancdata, [])
2516 self.checkFlags(flags, eor=True)
2517
2518 def _testRecvmsgIntoGenerator(self):
2519 self.sendToServer(MSG)
2520
2521 def testRecvmsgIntoArray(self):
2522 # Receive into an array rather than the usual bytearray.
2523 buf = array.array("B", [0] * len(MSG))
2524 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2525 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002526 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002527 self.checkRecvmsgAddress(addr, self.cli_addr)
2528 self.assertEqual(ancdata, [])
2529 self.checkFlags(flags, eor=True)
2530
2531 def _testRecvmsgIntoArray(self):
2532 self.sendToServer(MSG)
2533
2534 def testRecvmsgIntoScatter(self):
2535 # Receive into multiple buffers (scatter write).
2536 b1 = bytearray(b"----")
2537 b2 = bytearray(b"0123456789")
2538 b3 = bytearray(b"--------------")
2539 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2540 [b1, memoryview(b2)[2:9], b3])
2541 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2542 self.assertEqual(b1, bytearray(b"Mary"))
2543 self.assertEqual(b2, bytearray(b"01 had a 9"))
2544 self.assertEqual(b3, bytearray(b"little lamb---"))
2545 self.checkRecvmsgAddress(addr, self.cli_addr)
2546 self.assertEqual(ancdata, [])
2547 self.checkFlags(flags, eor=True)
2548
2549 def _testRecvmsgIntoScatter(self):
2550 self.sendToServer(b"Mary had a little lamb")
2551
2552
2553class CmsgMacroTests(unittest.TestCase):
2554 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2555 # assumptions used by sendmsg() and recvmsg[_into](), which share
2556 # code with these functions.
2557
2558 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002559 try:
2560 import _testcapi
2561 except ImportError:
2562 socklen_t_limit = 0x7fffffff
2563 else:
2564 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002565
2566 @requireAttrs(socket, "CMSG_LEN")
2567 def testCMSG_LEN(self):
2568 # Test CMSG_LEN() with various valid and invalid values,
2569 # checking the assumptions used by recvmsg() and sendmsg().
2570 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2571 values = list(range(257)) + list(range(toobig - 257, toobig))
2572
2573 # struct cmsghdr has at least three members, two of which are ints
2574 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2575 for n in values:
2576 ret = socket.CMSG_LEN(n)
2577 # This is how recvmsg() calculates the data size
2578 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2579 self.assertLessEqual(ret, self.socklen_t_limit)
2580
2581 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2582 # sendmsg() shares code with these functions, and requires
2583 # that it reject values over the limit.
2584 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2585 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2586
2587 @requireAttrs(socket, "CMSG_SPACE")
2588 def testCMSG_SPACE(self):
2589 # Test CMSG_SPACE() with various valid and invalid values,
2590 # checking the assumptions used by sendmsg().
2591 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2592 values = list(range(257)) + list(range(toobig - 257, toobig))
2593
2594 last = socket.CMSG_SPACE(0)
2595 # struct cmsghdr has at least three members, two of which are ints
2596 self.assertGreater(last, array.array("i").itemsize * 2)
2597 for n in values:
2598 ret = socket.CMSG_SPACE(n)
2599 self.assertGreaterEqual(ret, last)
2600 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2601 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2602 self.assertLessEqual(ret, self.socklen_t_limit)
2603 last = ret
2604
2605 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2606 # sendmsg() shares code with these functions, and requires
2607 # that it reject values over the limit.
2608 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2609 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2610
2611
2612class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2613 # Tests for file descriptor passing on Unix-domain sockets.
2614
2615 # Invalid file descriptor value that's unlikely to evaluate to a
2616 # real FD even if one of its bytes is replaced with a different
2617 # value (which shouldn't actually happen).
2618 badfd = -0x5555
2619
2620 def newFDs(self, n):
2621 # Return a list of n file descriptors for newly-created files
2622 # containing their list indices as ASCII numbers.
2623 fds = []
2624 for i in range(n):
2625 fd, path = tempfile.mkstemp()
2626 self.addCleanup(os.unlink, path)
2627 self.addCleanup(os.close, fd)
2628 os.write(fd, str(i).encode())
2629 fds.append(fd)
2630 return fds
2631
2632 def checkFDs(self, fds):
2633 # Check that the file descriptors in the given list contain
2634 # their correct list indices as ASCII numbers.
2635 for n, fd in enumerate(fds):
2636 os.lseek(fd, 0, os.SEEK_SET)
2637 self.assertEqual(os.read(fd, 1024), str(n).encode())
2638
2639 def registerRecvmsgResult(self, result):
2640 self.addCleanup(self.closeRecvmsgFDs, result)
2641
2642 def closeRecvmsgFDs(self, recvmsg_result):
2643 # Close all file descriptors specified in the ancillary data
2644 # of the given return value from recvmsg() or recvmsg_into().
2645 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2646 if (cmsg_level == socket.SOL_SOCKET and
2647 cmsg_type == socket.SCM_RIGHTS):
2648 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002649 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002650 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2651 for fd in fds:
2652 os.close(fd)
2653
2654 def createAndSendFDs(self, n):
2655 # Send n new file descriptors created by newFDs() to the
2656 # server, with the constant MSG as the non-ancillary data.
2657 self.assertEqual(
2658 self.sendmsgToServer([MSG],
2659 [(socket.SOL_SOCKET,
2660 socket.SCM_RIGHTS,
2661 array.array("i", self.newFDs(n)))]),
2662 len(MSG))
2663
2664 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2665 # Check that constant MSG was received with numfds file
2666 # descriptors in a maximum of maxcmsgs control messages (which
2667 # must contain only complete integers). By default, check
2668 # that MSG_CTRUNC is unset, but ignore any flags in
2669 # ignoreflags.
2670 msg, ancdata, flags, addr = result
2671 self.assertEqual(msg, MSG)
2672 self.checkRecvmsgAddress(addr, self.cli_addr)
2673 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2674 ignore=ignoreflags)
2675
2676 self.assertIsInstance(ancdata, list)
2677 self.assertLessEqual(len(ancdata), maxcmsgs)
2678 fds = array.array("i")
2679 for item in ancdata:
2680 self.assertIsInstance(item, tuple)
2681 cmsg_level, cmsg_type, cmsg_data = item
2682 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2683 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2684 self.assertIsInstance(cmsg_data, bytes)
2685 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002686 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002687
2688 self.assertEqual(len(fds), numfds)
2689 self.checkFDs(fds)
2690
2691 def testFDPassSimple(self):
2692 # Pass a single FD (array read from bytes object).
2693 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2694 len(MSG), 10240))
2695
2696 def _testFDPassSimple(self):
2697 self.assertEqual(
2698 self.sendmsgToServer(
2699 [MSG],
2700 [(socket.SOL_SOCKET,
2701 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002702 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002703 len(MSG))
2704
2705 def testMultipleFDPass(self):
2706 # Pass multiple FDs in a single array.
2707 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2708 len(MSG), 10240))
2709
2710 def _testMultipleFDPass(self):
2711 self.createAndSendFDs(4)
2712
2713 @requireAttrs(socket, "CMSG_SPACE")
2714 def testFDPassCMSG_SPACE(self):
2715 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2716 self.checkRecvmsgFDs(
2717 4, self.doRecvmsg(self.serv_sock, len(MSG),
2718 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2719
2720 @testFDPassCMSG_SPACE.client_skip
2721 def _testFDPassCMSG_SPACE(self):
2722 self.createAndSendFDs(4)
2723
2724 def testFDPassCMSG_LEN(self):
2725 # Test using CMSG_LEN() to calculate ancillary buffer size.
2726 self.checkRecvmsgFDs(1,
2727 self.doRecvmsg(self.serv_sock, len(MSG),
2728 socket.CMSG_LEN(4 * SIZEOF_INT)),
2729 # RFC 3542 says implementations may set
2730 # MSG_CTRUNC if there isn't enough space
2731 # for trailing padding.
2732 ignoreflags=socket.MSG_CTRUNC)
2733
2734 def _testFDPassCMSG_LEN(self):
2735 self.createAndSendFDs(1)
2736
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002737 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002738 @requireAttrs(socket, "CMSG_SPACE")
2739 def testFDPassSeparate(self):
2740 # Pass two FDs in two separate arrays. Arrays may be combined
2741 # into a single control message by the OS.
2742 self.checkRecvmsgFDs(2,
2743 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2744 maxcmsgs=2)
2745
2746 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002747 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002748 def _testFDPassSeparate(self):
2749 fd0, fd1 = self.newFDs(2)
2750 self.assertEqual(
2751 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2752 socket.SCM_RIGHTS,
2753 array.array("i", [fd0])),
2754 (socket.SOL_SOCKET,
2755 socket.SCM_RIGHTS,
2756 array.array("i", [fd1]))]),
2757 len(MSG))
2758
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002759 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002760 @requireAttrs(socket, "CMSG_SPACE")
2761 def testFDPassSeparateMinSpace(self):
2762 # Pass two FDs in two separate arrays, receiving them into the
2763 # minimum space for two arrays.
2764 self.checkRecvmsgFDs(2,
2765 self.doRecvmsg(self.serv_sock, len(MSG),
2766 socket.CMSG_SPACE(SIZEOF_INT) +
2767 socket.CMSG_LEN(SIZEOF_INT)),
2768 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2769
2770 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002771 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002772 def _testFDPassSeparateMinSpace(self):
2773 fd0, fd1 = self.newFDs(2)
2774 self.assertEqual(
2775 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2776 socket.SCM_RIGHTS,
2777 array.array("i", [fd0])),
2778 (socket.SOL_SOCKET,
2779 socket.SCM_RIGHTS,
2780 array.array("i", [fd1]))]),
2781 len(MSG))
2782
2783 def sendAncillaryIfPossible(self, msg, ancdata):
2784 # Try to send msg and ancdata to server, but if the system
2785 # call fails, just send msg with no ancillary data.
2786 try:
2787 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002788 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002789 # Check that it was the system call that failed
2790 self.assertIsInstance(e.errno, int)
2791 nbytes = self.sendmsgToServer([msg])
2792 self.assertEqual(nbytes, len(msg))
2793
2794 def testFDPassEmpty(self):
2795 # Try to pass an empty FD array. Can receive either no array
2796 # or an empty array.
2797 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2798 len(MSG), 10240),
2799 ignoreflags=socket.MSG_CTRUNC)
2800
2801 def _testFDPassEmpty(self):
2802 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2803 socket.SCM_RIGHTS,
2804 b"")])
2805
2806 def testFDPassPartialInt(self):
2807 # Try to pass a truncated FD array.
2808 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2809 len(MSG), 10240)
2810 self.assertEqual(msg, MSG)
2811 self.checkRecvmsgAddress(addr, self.cli_addr)
2812 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2813 self.assertLessEqual(len(ancdata), 1)
2814 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2815 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2816 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2817 self.assertLess(len(cmsg_data), SIZEOF_INT)
2818
2819 def _testFDPassPartialInt(self):
2820 self.sendAncillaryIfPossible(
2821 MSG,
2822 [(socket.SOL_SOCKET,
2823 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002824 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002825
2826 @requireAttrs(socket, "CMSG_SPACE")
2827 def testFDPassPartialIntInMiddle(self):
2828 # Try to pass two FD arrays, the first of which is truncated.
2829 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2830 len(MSG), 10240)
2831 self.assertEqual(msg, MSG)
2832 self.checkRecvmsgAddress(addr, self.cli_addr)
2833 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2834 self.assertLessEqual(len(ancdata), 2)
2835 fds = array.array("i")
2836 # Arrays may have been combined in a single control message
2837 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2838 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2839 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002840 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002841 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2842 self.assertLessEqual(len(fds), 2)
2843 self.checkFDs(fds)
2844
2845 @testFDPassPartialIntInMiddle.client_skip
2846 def _testFDPassPartialIntInMiddle(self):
2847 fd0, fd1 = self.newFDs(2)
2848 self.sendAncillaryIfPossible(
2849 MSG,
2850 [(socket.SOL_SOCKET,
2851 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002852 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002853 (socket.SOL_SOCKET,
2854 socket.SCM_RIGHTS,
2855 array.array("i", [fd1]))])
2856
2857 def checkTruncatedHeader(self, result, ignoreflags=0):
2858 # Check that no ancillary data items are returned when data is
2859 # truncated inside the cmsghdr structure.
2860 msg, ancdata, flags, addr = result
2861 self.assertEqual(msg, MSG)
2862 self.checkRecvmsgAddress(addr, self.cli_addr)
2863 self.assertEqual(ancdata, [])
2864 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2865 ignore=ignoreflags)
2866
2867 def testCmsgTruncNoBufSize(self):
2868 # Check that no ancillary data is received when no buffer size
2869 # is specified.
2870 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2871 # BSD seems to set MSG_CTRUNC only
2872 # if an item has been partially
2873 # received.
2874 ignoreflags=socket.MSG_CTRUNC)
2875
2876 def _testCmsgTruncNoBufSize(self):
2877 self.createAndSendFDs(1)
2878
2879 def testCmsgTrunc0(self):
2880 # Check that no ancillary data is received when buffer size is 0.
2881 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2882 ignoreflags=socket.MSG_CTRUNC)
2883
2884 def _testCmsgTrunc0(self):
2885 self.createAndSendFDs(1)
2886
2887 # Check that no ancillary data is returned for various non-zero
2888 # (but still too small) buffer sizes.
2889
2890 def testCmsgTrunc1(self):
2891 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2892
2893 def _testCmsgTrunc1(self):
2894 self.createAndSendFDs(1)
2895
2896 def testCmsgTrunc2Int(self):
2897 # The cmsghdr structure has at least three members, two of
2898 # which are ints, so we still shouldn't see any ancillary
2899 # data.
2900 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2901 SIZEOF_INT * 2))
2902
2903 def _testCmsgTrunc2Int(self):
2904 self.createAndSendFDs(1)
2905
2906 def testCmsgTruncLen0Minus1(self):
2907 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2908 socket.CMSG_LEN(0) - 1))
2909
2910 def _testCmsgTruncLen0Minus1(self):
2911 self.createAndSendFDs(1)
2912
2913 # The following tests try to truncate the control message in the
2914 # middle of the FD array.
2915
2916 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2917 # Check that file descriptor data is truncated to between
2918 # mindata and maxdata bytes when received with buffer size
2919 # ancbuf, and that any complete file descriptor numbers are
2920 # valid.
2921 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2922 len(MSG), ancbuf)
2923 self.assertEqual(msg, MSG)
2924 self.checkRecvmsgAddress(addr, self.cli_addr)
2925 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2926
2927 if mindata == 0 and ancdata == []:
2928 return
2929 self.assertEqual(len(ancdata), 1)
2930 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2931 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2932 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2933 self.assertGreaterEqual(len(cmsg_data), mindata)
2934 self.assertLessEqual(len(cmsg_data), maxdata)
2935 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002936 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002937 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2938 self.checkFDs(fds)
2939
2940 def testCmsgTruncLen0(self):
2941 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2942
2943 def _testCmsgTruncLen0(self):
2944 self.createAndSendFDs(1)
2945
2946 def testCmsgTruncLen0Plus1(self):
2947 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2948
2949 def _testCmsgTruncLen0Plus1(self):
2950 self.createAndSendFDs(2)
2951
2952 def testCmsgTruncLen1(self):
2953 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2954 maxdata=SIZEOF_INT)
2955
2956 def _testCmsgTruncLen1(self):
2957 self.createAndSendFDs(2)
2958
2959 def testCmsgTruncLen2Minus1(self):
2960 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2961 maxdata=(2 * SIZEOF_INT) - 1)
2962
2963 def _testCmsgTruncLen2Minus1(self):
2964 self.createAndSendFDs(2)
2965
2966
2967class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2968 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2969 # features of the RFC 3542 Advanced Sockets API for IPv6.
2970 # Currently we can only handle certain data items (e.g. traffic
2971 # class, hop limit, MTU discovery and fragmentation settings)
2972 # without resorting to unportable means such as the struct module,
2973 # but the tests here are aimed at testing the ancillary data
2974 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2975 # itself.
2976
2977 # Test value to use when setting hop limit of packet
2978 hop_limit = 2
2979
2980 # Test value to use when setting traffic class of packet.
2981 # -1 means "use kernel default".
2982 traffic_class = -1
2983
2984 def ancillaryMapping(self, ancdata):
2985 # Given ancillary data list ancdata, return a mapping from
2986 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2987 # Check that no (level, type) pair appears more than once.
2988 d = {}
2989 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2990 self.assertNotIn((cmsg_level, cmsg_type), d)
2991 d[(cmsg_level, cmsg_type)] = cmsg_data
2992 return d
2993
2994 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2995 # Receive hop limit into ancbufsize bytes of ancillary data
2996 # space. Check that data is MSG, ancillary data is not
2997 # truncated (but ignore any flags in ignoreflags), and hop
2998 # limit is between 0 and maxhop inclusive.
2999 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3000 socket.IPV6_RECVHOPLIMIT, 1)
3001 self.misc_event.set()
3002 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3003 len(MSG), ancbufsize)
3004
3005 self.assertEqual(msg, MSG)
3006 self.checkRecvmsgAddress(addr, self.cli_addr)
3007 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3008 ignore=ignoreflags)
3009
3010 self.assertEqual(len(ancdata), 1)
3011 self.assertIsInstance(ancdata[0], tuple)
3012 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3013 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3014 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3015 self.assertIsInstance(cmsg_data, bytes)
3016 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3017 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003018 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003019 self.assertGreaterEqual(a[0], 0)
3020 self.assertLessEqual(a[0], maxhop)
3021
3022 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3023 def testRecvHopLimit(self):
3024 # Test receiving the packet hop limit as ancillary data.
3025 self.checkHopLimit(ancbufsize=10240)
3026
3027 @testRecvHopLimit.client_skip
3028 def _testRecvHopLimit(self):
3029 # Need to wait until server has asked to receive ancillary
3030 # data, as implementations are not required to buffer it
3031 # otherwise.
3032 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3033 self.sendToServer(MSG)
3034
3035 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3036 def testRecvHopLimitCMSG_SPACE(self):
3037 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3038 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3039
3040 @testRecvHopLimitCMSG_SPACE.client_skip
3041 def _testRecvHopLimitCMSG_SPACE(self):
3042 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3043 self.sendToServer(MSG)
3044
3045 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3046 # 3542 says portable applications must provide space for trailing
3047 # padding. Implementations may set MSG_CTRUNC if there isn't
3048 # enough space for the padding.
3049
3050 @requireAttrs(socket.socket, "sendmsg")
3051 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3052 def testSetHopLimit(self):
3053 # Test setting hop limit on outgoing packet and receiving it
3054 # at the other end.
3055 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3056
3057 @testSetHopLimit.client_skip
3058 def _testSetHopLimit(self):
3059 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3060 self.assertEqual(
3061 self.sendmsgToServer([MSG],
3062 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3063 array.array("i", [self.hop_limit]))]),
3064 len(MSG))
3065
3066 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3067 ignoreflags=0):
3068 # Receive traffic class and hop limit into ancbufsize bytes of
3069 # ancillary data space. Check that data is MSG, ancillary
3070 # data is not truncated (but ignore any flags in ignoreflags),
3071 # and traffic class and hop limit are in range (hop limit no
3072 # more than maxhop).
3073 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3074 socket.IPV6_RECVHOPLIMIT, 1)
3075 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3076 socket.IPV6_RECVTCLASS, 1)
3077 self.misc_event.set()
3078 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3079 len(MSG), ancbufsize)
3080
3081 self.assertEqual(msg, MSG)
3082 self.checkRecvmsgAddress(addr, self.cli_addr)
3083 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3084 ignore=ignoreflags)
3085 self.assertEqual(len(ancdata), 2)
3086 ancmap = self.ancillaryMapping(ancdata)
3087
3088 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3089 self.assertEqual(len(tcdata), SIZEOF_INT)
3090 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003091 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003092 self.assertGreaterEqual(a[0], 0)
3093 self.assertLessEqual(a[0], 255)
3094
3095 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3096 self.assertEqual(len(hldata), SIZEOF_INT)
3097 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003098 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003099 self.assertGreaterEqual(a[0], 0)
3100 self.assertLessEqual(a[0], maxhop)
3101
3102 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3103 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3104 def testRecvTrafficClassAndHopLimit(self):
3105 # Test receiving traffic class and hop limit as ancillary data.
3106 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3107
3108 @testRecvTrafficClassAndHopLimit.client_skip
3109 def _testRecvTrafficClassAndHopLimit(self):
3110 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3111 self.sendToServer(MSG)
3112
3113 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3114 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3115 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3116 # Test receiving traffic class and hop limit, using
3117 # CMSG_SPACE() to calculate buffer size.
3118 self.checkTrafficClassAndHopLimit(
3119 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3120
3121 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3122 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3123 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3124 self.sendToServer(MSG)
3125
3126 @requireAttrs(socket.socket, "sendmsg")
3127 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3128 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3129 def testSetTrafficClassAndHopLimit(self):
3130 # Test setting traffic class and hop limit on outgoing packet,
3131 # and receiving them at the other end.
3132 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3133 maxhop=self.hop_limit)
3134
3135 @testSetTrafficClassAndHopLimit.client_skip
3136 def _testSetTrafficClassAndHopLimit(self):
3137 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3138 self.assertEqual(
3139 self.sendmsgToServer([MSG],
3140 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3141 array.array("i", [self.traffic_class])),
3142 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3143 array.array("i", [self.hop_limit]))]),
3144 len(MSG))
3145
3146 @requireAttrs(socket.socket, "sendmsg")
3147 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3148 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3149 def testOddCmsgSize(self):
3150 # Try to send ancillary data with first item one byte too
3151 # long. Fall back to sending with correct size if this fails,
3152 # and check that second item was handled correctly.
3153 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3154 maxhop=self.hop_limit)
3155
3156 @testOddCmsgSize.client_skip
3157 def _testOddCmsgSize(self):
3158 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3159 try:
3160 nbytes = self.sendmsgToServer(
3161 [MSG],
3162 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003163 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003164 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3165 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003166 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003167 self.assertIsInstance(e.errno, int)
3168 nbytes = self.sendmsgToServer(
3169 [MSG],
3170 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3171 array.array("i", [self.traffic_class])),
3172 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3173 array.array("i", [self.hop_limit]))])
3174 self.assertEqual(nbytes, len(MSG))
3175
3176 # Tests for proper handling of truncated ancillary data
3177
3178 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3179 # Receive hop limit into ancbufsize bytes of ancillary data
3180 # space, which should be too small to contain the ancillary
3181 # data header (if ancbufsize is None, pass no second argument
3182 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3183 # (unless included in ignoreflags), and no ancillary data is
3184 # returned.
3185 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3186 socket.IPV6_RECVHOPLIMIT, 1)
3187 self.misc_event.set()
3188 args = () if ancbufsize is None else (ancbufsize,)
3189 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3190 len(MSG), *args)
3191
3192 self.assertEqual(msg, MSG)
3193 self.checkRecvmsgAddress(addr, self.cli_addr)
3194 self.assertEqual(ancdata, [])
3195 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3196 ignore=ignoreflags)
3197
3198 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3199 def testCmsgTruncNoBufSize(self):
3200 # Check that no ancillary data is received when no ancillary
3201 # buffer size is provided.
3202 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3203 # BSD seems to set
3204 # MSG_CTRUNC only if an item
3205 # has been partially
3206 # received.
3207 ignoreflags=socket.MSG_CTRUNC)
3208
3209 @testCmsgTruncNoBufSize.client_skip
3210 def _testCmsgTruncNoBufSize(self):
3211 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3212 self.sendToServer(MSG)
3213
3214 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3215 def testSingleCmsgTrunc0(self):
3216 # Check that no ancillary data is received when ancillary
3217 # buffer size is zero.
3218 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3219 ignoreflags=socket.MSG_CTRUNC)
3220
3221 @testSingleCmsgTrunc0.client_skip
3222 def _testSingleCmsgTrunc0(self):
3223 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3224 self.sendToServer(MSG)
3225
3226 # Check that no ancillary data is returned for various non-zero
3227 # (but still too small) buffer sizes.
3228
3229 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3230 def testSingleCmsgTrunc1(self):
3231 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3232
3233 @testSingleCmsgTrunc1.client_skip
3234 def _testSingleCmsgTrunc1(self):
3235 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3236 self.sendToServer(MSG)
3237
3238 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3239 def testSingleCmsgTrunc2Int(self):
3240 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3241
3242 @testSingleCmsgTrunc2Int.client_skip
3243 def _testSingleCmsgTrunc2Int(self):
3244 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3245 self.sendToServer(MSG)
3246
3247 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3248 def testSingleCmsgTruncLen0Minus1(self):
3249 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3250
3251 @testSingleCmsgTruncLen0Minus1.client_skip
3252 def _testSingleCmsgTruncLen0Minus1(self):
3253 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3254 self.sendToServer(MSG)
3255
3256 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3257 def testSingleCmsgTruncInData(self):
3258 # Test truncation of a control message inside its associated
3259 # data. The message may be returned with its data truncated,
3260 # or not returned at all.
3261 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3262 socket.IPV6_RECVHOPLIMIT, 1)
3263 self.misc_event.set()
3264 msg, ancdata, flags, addr = self.doRecvmsg(
3265 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3266
3267 self.assertEqual(msg, MSG)
3268 self.checkRecvmsgAddress(addr, self.cli_addr)
3269 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3270
3271 self.assertLessEqual(len(ancdata), 1)
3272 if ancdata:
3273 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3274 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3275 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3276 self.assertLess(len(cmsg_data), SIZEOF_INT)
3277
3278 @testSingleCmsgTruncInData.client_skip
3279 def _testSingleCmsgTruncInData(self):
3280 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3281 self.sendToServer(MSG)
3282
3283 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3284 # Receive traffic class and hop limit into ancbufsize bytes of
3285 # ancillary data space, which should be large enough to
3286 # contain the first item, but too small to contain the header
3287 # of the second. Check that data is MSG, MSG_CTRUNC is set
3288 # (unless included in ignoreflags), and only one ancillary
3289 # data item is returned.
3290 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3291 socket.IPV6_RECVHOPLIMIT, 1)
3292 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3293 socket.IPV6_RECVTCLASS, 1)
3294 self.misc_event.set()
3295 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3296 len(MSG), ancbufsize)
3297
3298 self.assertEqual(msg, MSG)
3299 self.checkRecvmsgAddress(addr, self.cli_addr)
3300 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3301 ignore=ignoreflags)
3302
3303 self.assertEqual(len(ancdata), 1)
3304 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3305 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3306 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3307 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3308 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003309 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003310 self.assertGreaterEqual(a[0], 0)
3311 self.assertLessEqual(a[0], 255)
3312
3313 # Try the above test with various buffer sizes.
3314
3315 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3316 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3317 def testSecondCmsgTrunc0(self):
3318 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3319 ignoreflags=socket.MSG_CTRUNC)
3320
3321 @testSecondCmsgTrunc0.client_skip
3322 def _testSecondCmsgTrunc0(self):
3323 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3324 self.sendToServer(MSG)
3325
3326 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3327 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3328 def testSecondCmsgTrunc1(self):
3329 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3330
3331 @testSecondCmsgTrunc1.client_skip
3332 def _testSecondCmsgTrunc1(self):
3333 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3334 self.sendToServer(MSG)
3335
3336 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3337 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3338 def testSecondCmsgTrunc2Int(self):
3339 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3340 2 * SIZEOF_INT)
3341
3342 @testSecondCmsgTrunc2Int.client_skip
3343 def _testSecondCmsgTrunc2Int(self):
3344 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3345 self.sendToServer(MSG)
3346
3347 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3348 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3349 def testSecondCmsgTruncLen0Minus1(self):
3350 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3351 socket.CMSG_LEN(0) - 1)
3352
3353 @testSecondCmsgTruncLen0Minus1.client_skip
3354 def _testSecondCmsgTruncLen0Minus1(self):
3355 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3356 self.sendToServer(MSG)
3357
3358 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3359 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3360 def testSecomdCmsgTruncInData(self):
3361 # Test truncation of the second of two control messages inside
3362 # its associated data.
3363 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3364 socket.IPV6_RECVHOPLIMIT, 1)
3365 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3366 socket.IPV6_RECVTCLASS, 1)
3367 self.misc_event.set()
3368 msg, ancdata, flags, addr = self.doRecvmsg(
3369 self.serv_sock, len(MSG),
3370 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3371
3372 self.assertEqual(msg, MSG)
3373 self.checkRecvmsgAddress(addr, self.cli_addr)
3374 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3375
3376 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3377
3378 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3379 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3380 cmsg_types.remove(cmsg_type)
3381 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3382 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003383 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003384 self.assertGreaterEqual(a[0], 0)
3385 self.assertLessEqual(a[0], 255)
3386
3387 if ancdata:
3388 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3389 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3390 cmsg_types.remove(cmsg_type)
3391 self.assertLess(len(cmsg_data), SIZEOF_INT)
3392
3393 self.assertEqual(ancdata, [])
3394
3395 @testSecomdCmsgTruncInData.client_skip
3396 def _testSecomdCmsgTruncInData(self):
3397 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3398 self.sendToServer(MSG)
3399
3400
3401# Derive concrete test classes for different socket types.
3402
3403class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3404 SendrecvmsgConnectionlessBase,
3405 ThreadedSocketTestMixin, UDPTestBase):
3406 pass
3407
3408@requireAttrs(socket.socket, "sendmsg")
3409@unittest.skipUnless(thread, 'Threading required for this test.')
3410class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3411 pass
3412
3413@requireAttrs(socket.socket, "recvmsg")
3414@unittest.skipUnless(thread, 'Threading required for this test.')
3415class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3416 pass
3417
3418@requireAttrs(socket.socket, "recvmsg_into")
3419@unittest.skipUnless(thread, 'Threading required for this test.')
3420class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3421 pass
3422
3423
3424class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3425 SendrecvmsgConnectionlessBase,
3426 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003427
3428 def checkRecvmsgAddress(self, addr1, addr2):
3429 # Called to compare the received address with the address of
3430 # the peer, ignoring scope ID
3431 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003432
3433@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003434@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003435@requireSocket("AF_INET6", "SOCK_DGRAM")
3436@unittest.skipUnless(thread, 'Threading required for this test.')
3437class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3438 pass
3439
3440@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003441@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003442@requireSocket("AF_INET6", "SOCK_DGRAM")
3443@unittest.skipUnless(thread, 'Threading required for this test.')
3444class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3445 pass
3446
3447@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003448@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003449@requireSocket("AF_INET6", "SOCK_DGRAM")
3450@unittest.skipUnless(thread, 'Threading required for this test.')
3451class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3452 pass
3453
3454@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003455@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003456@requireAttrs(socket, "IPPROTO_IPV6")
3457@requireSocket("AF_INET6", "SOCK_DGRAM")
3458@unittest.skipUnless(thread, 'Threading required for this test.')
3459class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3460 SendrecvmsgUDP6TestBase):
3461 pass
3462
3463@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003464@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003465@requireAttrs(socket, "IPPROTO_IPV6")
3466@requireSocket("AF_INET6", "SOCK_DGRAM")
3467@unittest.skipUnless(thread, 'Threading required for this test.')
3468class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3469 RFC3542AncillaryTest,
3470 SendrecvmsgUDP6TestBase):
3471 pass
3472
3473
3474class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3475 ConnectedStreamTestMixin, TCPTestBase):
3476 pass
3477
3478@requireAttrs(socket.socket, "sendmsg")
3479@unittest.skipUnless(thread, 'Threading required for this test.')
3480class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3481 pass
3482
3483@requireAttrs(socket.socket, "recvmsg")
3484@unittest.skipUnless(thread, 'Threading required for this test.')
3485class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3486 SendrecvmsgTCPTestBase):
3487 pass
3488
3489@requireAttrs(socket.socket, "recvmsg_into")
3490@unittest.skipUnless(thread, 'Threading required for this test.')
3491class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3492 SendrecvmsgTCPTestBase):
3493 pass
3494
3495
3496class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3497 SendrecvmsgConnectedBase,
3498 ConnectedStreamTestMixin, SCTPStreamBase):
3499 pass
3500
3501@requireAttrs(socket.socket, "sendmsg")
3502@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3503@unittest.skipUnless(thread, 'Threading required for this test.')
3504class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3505 pass
3506
3507@requireAttrs(socket.socket, "recvmsg")
3508@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3509@unittest.skipUnless(thread, 'Threading required for this test.')
3510class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3511 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003512
3513 def testRecvmsgEOF(self):
3514 try:
3515 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3516 except OSError as e:
3517 if e.errno != errno.ENOTCONN:
3518 raise
3519 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003520
3521@requireAttrs(socket.socket, "recvmsg_into")
3522@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3523@unittest.skipUnless(thread, 'Threading required for this test.')
3524class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3525 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003526
3527 def testRecvmsgEOF(self):
3528 try:
3529 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3530 except OSError as e:
3531 if e.errno != errno.ENOTCONN:
3532 raise
3533 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003534
3535
3536class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3537 ConnectedStreamTestMixin, UnixStreamBase):
3538 pass
3539
3540@requireAttrs(socket.socket, "sendmsg")
3541@requireAttrs(socket, "AF_UNIX")
3542@unittest.skipUnless(thread, 'Threading required for this test.')
3543class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3544 pass
3545
3546@requireAttrs(socket.socket, "recvmsg")
3547@requireAttrs(socket, "AF_UNIX")
3548@unittest.skipUnless(thread, 'Threading required for this test.')
3549class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3550 SendrecvmsgUnixStreamTestBase):
3551 pass
3552
3553@requireAttrs(socket.socket, "recvmsg_into")
3554@requireAttrs(socket, "AF_UNIX")
3555@unittest.skipUnless(thread, 'Threading required for this test.')
3556class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3557 SendrecvmsgUnixStreamTestBase):
3558 pass
3559
3560@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3561@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3562@unittest.skipUnless(thread, 'Threading required for this test.')
3563class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3564 pass
3565
3566@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3567@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3568@unittest.skipUnless(thread, 'Threading required for this test.')
3569class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3570 SendrecvmsgUnixStreamTestBase):
3571 pass
3572
3573
3574# Test interrupting the interruptible send/receive methods with a
3575# signal when a timeout is set. These tests avoid having multiple
3576# threads alive during the test so that the OS cannot deliver the
3577# signal to the wrong one.
3578
3579class InterruptedTimeoutBase(unittest.TestCase):
3580 # Base class for interrupted send/receive tests. Installs an
3581 # empty handler for SIGALRM and removes it on teardown, along with
3582 # any scheduled alarms.
3583
3584 def setUp(self):
3585 super().setUp()
3586 orig_alrm_handler = signal.signal(signal.SIGALRM,
3587 lambda signum, frame: None)
3588 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3589 self.addCleanup(self.setAlarm, 0)
3590
3591 # Timeout for socket operations
3592 timeout = 4.0
3593
3594 # Provide setAlarm() method to schedule delivery of SIGALRM after
3595 # given number of seconds, or cancel it if zero, and an
3596 # appropriate time value to use. Use setitimer() if available.
3597 if hasattr(signal, "setitimer"):
3598 alarm_time = 0.05
3599
3600 def setAlarm(self, seconds):
3601 signal.setitimer(signal.ITIMER_REAL, seconds)
3602 else:
3603 # Old systems may deliver the alarm up to one second early
3604 alarm_time = 2
3605
3606 def setAlarm(self, seconds):
3607 signal.alarm(seconds)
3608
3609
3610# Require siginterrupt() in order to ensure that system calls are
3611# interrupted by default.
3612@requireAttrs(signal, "siginterrupt")
3613@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3614 "Don't have signal.alarm or signal.setitimer")
3615class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3616 # Test interrupting the recv*() methods with signals when a
3617 # timeout is set.
3618
3619 def setUp(self):
3620 super().setUp()
3621 self.serv.settimeout(self.timeout)
3622
3623 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003624 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003625 # errno of EINTR when interrupted by a signal.
3626 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003627 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003628 func(*args, **kwargs)
3629 self.assertNotIsInstance(cm.exception, socket.timeout)
3630 self.assertEqual(cm.exception.errno, errno.EINTR)
3631
3632 def testInterruptedRecvTimeout(self):
3633 self.checkInterruptedRecv(self.serv.recv, 1024)
3634
3635 def testInterruptedRecvIntoTimeout(self):
3636 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3637
3638 def testInterruptedRecvfromTimeout(self):
3639 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3640
3641 def testInterruptedRecvfromIntoTimeout(self):
3642 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3643
3644 @requireAttrs(socket.socket, "recvmsg")
3645 def testInterruptedRecvmsgTimeout(self):
3646 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3647
3648 @requireAttrs(socket.socket, "recvmsg_into")
3649 def testInterruptedRecvmsgIntoTimeout(self):
3650 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3651
3652
3653# Require siginterrupt() in order to ensure that system calls are
3654# interrupted by default.
3655@requireAttrs(signal, "siginterrupt")
3656@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3657 "Don't have signal.alarm or signal.setitimer")
3658@unittest.skipUnless(thread, 'Threading required for this test.')
3659class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3660 ThreadSafeCleanupTestCase,
3661 SocketListeningTestMixin, TCPTestBase):
3662 # Test interrupting the interruptible send*() methods with signals
3663 # when a timeout is set.
3664
3665 def setUp(self):
3666 super().setUp()
3667 self.serv_conn = self.newSocket()
3668 self.addCleanup(self.serv_conn.close)
3669 # Use a thread to complete the connection, but wait for it to
3670 # terminate before running the test, so that there is only one
3671 # thread to accept the signal.
3672 cli_thread = threading.Thread(target=self.doConnect)
3673 cli_thread.start()
3674 self.cli_conn, addr = self.serv.accept()
3675 self.addCleanup(self.cli_conn.close)
3676 cli_thread.join()
3677 self.serv_conn.settimeout(self.timeout)
3678
3679 def doConnect(self):
3680 self.serv_conn.connect(self.serv_addr)
3681
3682 def checkInterruptedSend(self, func, *args, **kwargs):
3683 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003684 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003685 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003686 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003687 while True:
3688 self.setAlarm(self.alarm_time)
3689 func(*args, **kwargs)
3690 self.assertNotIsInstance(cm.exception, socket.timeout)
3691 self.assertEqual(cm.exception.errno, errno.EINTR)
3692
Ned Deilyc5640382014-02-03 13:58:31 -08003693 # Issue #12958: The following tests have problems on OS X prior to 10.7
3694 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003695 def testInterruptedSendTimeout(self):
3696 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3697
Ned Deilyc5640382014-02-03 13:58:31 -08003698 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003699 def testInterruptedSendtoTimeout(self):
3700 # Passing an actual address here as Python's wrapper for
3701 # sendto() doesn't allow passing a zero-length one; POSIX
3702 # requires that the address is ignored since the socket is
3703 # connection-mode, however.
3704 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3705 self.serv_addr)
3706
Ned Deilyc5640382014-02-03 13:58:31 -08003707 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003708 @requireAttrs(socket.socket, "sendmsg")
3709 def testInterruptedSendmsgTimeout(self):
3710 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3711
3712
Victor Stinner45df8202010-04-28 22:31:17 +00003713@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003714class TCPCloserTest(ThreadedTCPSocketTest):
3715
3716 def testClose(self):
3717 conn, addr = self.serv.accept()
3718 conn.close()
3719
3720 sd = self.cli
3721 read, write, err = select.select([sd], [], [], 1.0)
3722 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003723 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003724
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003725 # Calling close() many times should be safe.
3726 conn.close()
3727 conn.close()
3728
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003729 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003730 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003731 time.sleep(1.0)
3732
Serhiy Storchaka43767632013-11-03 21:31:38 +02003733@unittest.skipUnless(hasattr(socket, 'socketpair'),
3734 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003735@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003736class BasicSocketPairTest(SocketPairTest):
3737
3738 def __init__(self, methodName='runTest'):
3739 SocketPairTest.__init__(self, methodName=methodName)
3740
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003741 def _check_defaults(self, sock):
3742 self.assertIsInstance(sock, socket.socket)
3743 if hasattr(socket, 'AF_UNIX'):
3744 self.assertEqual(sock.family, socket.AF_UNIX)
3745 else:
3746 self.assertEqual(sock.family, socket.AF_INET)
3747 self.assertEqual(sock.type, socket.SOCK_STREAM)
3748 self.assertEqual(sock.proto, 0)
3749
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003750 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003751 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003752
3753 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003754 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003755
Dave Cole331708b2004-08-09 04:51:41 +00003756 def testRecv(self):
3757 msg = self.serv.recv(1024)
3758 self.assertEqual(msg, MSG)
3759
3760 def _testRecv(self):
3761 self.cli.send(MSG)
3762
3763 def testSend(self):
3764 self.serv.send(MSG)
3765
3766 def _testSend(self):
3767 msg = self.cli.recv(1024)
3768 self.assertEqual(msg, MSG)
3769
Victor Stinner45df8202010-04-28 22:31:17 +00003770@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003771class NonBlockingTCPTests(ThreadedTCPSocketTest):
3772
3773 def __init__(self, methodName='runTest'):
3774 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3775
3776 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003777 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003778 self.serv.setblocking(True)
3779 self.assertIsNone(self.serv.gettimeout())
3780 self.serv.setblocking(False)
3781 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003782 start = time.time()
3783 try:
3784 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003785 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003786 pass
3787 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003788 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003789
3790 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003791 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003792
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003793 @support.cpython_only
3794 def testSetBlocking_overflow(self):
3795 # Issue 15989
3796 import _testcapi
3797 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3798 self.skipTest('needs UINT_MAX < ULONG_MAX')
3799 self.serv.setblocking(False)
3800 self.assertEqual(self.serv.gettimeout(), 0.0)
3801 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3802 self.assertIsNone(self.serv.gettimeout())
3803
3804 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3805
Serhiy Storchaka43767632013-11-03 21:31:38 +02003806 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3807 'test needs socket.SOCK_NONBLOCK')
3808 @support.requires_linux_version(2, 6, 28)
3809 def testInitNonBlocking(self):
3810 # reinit server socket
3811 self.serv.close()
3812 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3813 socket.SOCK_NONBLOCK)
3814 self.port = support.bind_port(self.serv)
3815 self.serv.listen(1)
3816 # actual testing
3817 start = time.time()
3818 try:
3819 self.serv.accept()
3820 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003821 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003822 end = time.time()
3823 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3824
3825 def _testInitNonBlocking(self):
3826 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003827
Antoine Pitrou600232b2011-01-05 21:03:42 +00003828 def testInheritFlags(self):
3829 # Issue #7995: when calling accept() on a listening socket with a
3830 # timeout, the resulting socket should not be non-blocking.
3831 self.serv.settimeout(10)
3832 try:
3833 conn, addr = self.serv.accept()
3834 message = conn.recv(len(MSG))
3835 finally:
3836 conn.close()
3837 self.serv.settimeout(None)
3838
3839 def _testInheritFlags(self):
3840 time.sleep(0.1)
3841 self.cli.connect((HOST, self.port))
3842 time.sleep(0.5)
3843 self.cli.send(MSG)
3844
Guido van Rossum24e4af82002-06-12 19:18:08 +00003845 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003846 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003847 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003848 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003849 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003850 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003851 pass
3852 else:
3853 self.fail("Error trying to do non-blocking accept.")
3854 read, write, err = select.select([self.serv], [], [])
3855 if self.serv in read:
3856 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003857 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003858 else:
3859 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003860
Guido van Rossum24e4af82002-06-12 19:18:08 +00003861 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003862 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003863 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003864
3865 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003866 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003867 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003868 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003869
3870 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003871 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003872 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003873
3874 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003875 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003876 conn, addr = self.serv.accept()
3877 conn.setblocking(0)
3878 try:
3879 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003880 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003881 pass
3882 else:
3883 self.fail("Error trying to do non-blocking recv.")
3884 read, write, err = select.select([conn], [], [])
3885 if conn in read:
3886 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003887 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003888 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003889 else:
3890 self.fail("Error during select call to non-blocking socket.")
3891
3892 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003893 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003894 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003895 self.cli.send(MSG)
3896
Victor Stinner45df8202010-04-28 22:31:17 +00003897@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003898class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003899 """Unit tests for the object returned by socket.makefile()
3900
Antoine Pitrou834bd812010-10-13 16:17:14 +00003901 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003902 the client connection. You can read from this file to
3903 get output from the server.
3904
Antoine Pitrou834bd812010-10-13 16:17:14 +00003905 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003906 server connection. You can write to this file to send output
3907 to the client.
3908 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003909
Guido van Rossume9f66142002-08-07 15:46:19 +00003910 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003911 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003912 errors = 'strict'
3913 newline = None
3914
3915 read_mode = 'rb'
3916 read_msg = MSG
3917 write_mode = 'wb'
3918 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003919
Guido van Rossum24e4af82002-06-12 19:18:08 +00003920 def __init__(self, methodName='runTest'):
3921 SocketConnectedTest.__init__(self, methodName=methodName)
3922
3923 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003924 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3925 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003926 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003927 self.read_file = self.cli_conn.makefile(
3928 self.read_mode, self.bufsize,
3929 encoding = self.encoding,
3930 errors = self.errors,
3931 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003932
3933 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003934 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003935 self.read_file.close()
3936 self.assertTrue(self.read_file.closed)
3937 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003938 SocketConnectedTest.tearDown(self)
3939
3940 def clientSetUp(self):
3941 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003942 self.write_file = self.serv_conn.makefile(
3943 self.write_mode, self.bufsize,
3944 encoding = self.encoding,
3945 errors = self.errors,
3946 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003947
3948 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003949 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003950 self.write_file.close()
3951 self.assertTrue(self.write_file.closed)
3952 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003953 SocketConnectedTest.clientTearDown(self)
3954
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003955 def testReadAfterTimeout(self):
3956 # Issue #7322: A file object must disallow further reads
3957 # after a timeout has occurred.
3958 self.cli_conn.settimeout(1)
3959 self.read_file.read(3)
3960 # First read raises a timeout
3961 self.assertRaises(socket.timeout, self.read_file.read, 1)
3962 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003963 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003964 self.read_file.read(1)
3965 self.assertIn("cannot read from timed out object", str(ctx.exception))
3966
3967 def _testReadAfterTimeout(self):
3968 self.write_file.write(self.write_msg[0:3])
3969 self.write_file.flush()
3970 self.serv_finished.wait()
3971
Guido van Rossum24e4af82002-06-12 19:18:08 +00003972 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003973 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003974 first_seg = self.read_file.read(len(self.read_msg)-3)
3975 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003976 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003977 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003978
3979 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003980 self.write_file.write(self.write_msg)
3981 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003982
Guido van Rossum8c943832002-08-08 01:00:28 +00003983 def testFullRead(self):
3984 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003985 msg = self.read_file.read()
3986 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003987
3988 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003989 self.write_file.write(self.write_msg)
3990 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003991
Guido van Rossum24e4af82002-06-12 19:18:08 +00003992 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003993 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003994 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003995 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003996 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003997 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003998 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003999 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004000 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004001
4002 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004003 self.write_file.write(self.write_msg)
4004 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004005
4006 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004007 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004008 line = self.read_file.readline()
4009 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004010
4011 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004012 self.write_file.write(self.write_msg)
4013 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004014
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004015 def testCloseAfterMakefile(self):
4016 # The file returned by makefile should keep the socket open.
4017 self.cli_conn.close()
4018 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004019 msg = self.read_file.read()
4020 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004021
4022 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004023 self.write_file.write(self.write_msg)
4024 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004025
4026 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004028 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004029 if isinstance(self.read_msg, str):
4030 msg = msg.decode()
4031 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004032
4033 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004034 self.write_file.write(self.write_msg)
4035 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004036
Tim Peters116d83c2004-03-28 02:20:45 +00004037 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004038 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004039
4040 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004041 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004042
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004043 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004044 self.assertEqual(self.read_file.mode, self.read_mode)
4045 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004046
4047 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004048 self.assertEqual(self.write_file.mode, self.write_mode)
4049 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004050
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004051 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004052 self.read_file.close()
4053 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004054 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004055 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004056
4057 def _testRealClose(self):
4058 pass
4059
4060
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004061class FileObjectInterruptedTestCase(unittest.TestCase):
4062 """Test that the file object correctly handles EINTR internally."""
4063
4064 class MockSocket(object):
4065 def __init__(self, recv_funcs=()):
4066 # A generator that returns callables that we'll call for each
4067 # call to recv().
4068 self._recv_step = iter(recv_funcs)
4069
4070 def recv_into(self, buffer):
4071 data = next(self._recv_step)()
4072 assert len(buffer) >= len(data)
4073 buffer[:len(data)] = data
4074 return len(data)
4075
4076 def _decref_socketios(self):
4077 pass
4078
4079 def _textiowrap_for_test(self, buffering=-1):
4080 raw = socket.SocketIO(self, "r")
4081 if buffering < 0:
4082 buffering = io.DEFAULT_BUFFER_SIZE
4083 if buffering == 0:
4084 return raw
4085 buffer = io.BufferedReader(raw, buffering)
4086 text = io.TextIOWrapper(buffer, None, None)
4087 text.mode = "rb"
4088 return text
4089
4090 @staticmethod
4091 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004092 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004093
4094 def _textiowrap_mock_socket(self, mock, buffering=-1):
4095 raw = socket.SocketIO(mock, "r")
4096 if buffering < 0:
4097 buffering = io.DEFAULT_BUFFER_SIZE
4098 if buffering == 0:
4099 return raw
4100 buffer = io.BufferedReader(raw, buffering)
4101 text = io.TextIOWrapper(buffer, None, None)
4102 text.mode = "rb"
4103 return text
4104
4105 def _test_readline(self, size=-1, buffering=-1):
4106 mock_sock = self.MockSocket(recv_funcs=[
4107 lambda : b"This is the first line\nAnd the sec",
4108 self._raise_eintr,
4109 lambda : b"ond line is here\n",
4110 lambda : b"",
4111 lambda : b"", # XXX(gps): io library does an extra EOF read
4112 ])
4113 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004114 self.assertEqual(fo.readline(size), "This is the first line\n")
4115 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004116
4117 def _test_read(self, size=-1, buffering=-1):
4118 mock_sock = self.MockSocket(recv_funcs=[
4119 lambda : b"This is the first line\nAnd the sec",
4120 self._raise_eintr,
4121 lambda : b"ond line is here\n",
4122 lambda : b"",
4123 lambda : b"", # XXX(gps): io library does an extra EOF read
4124 ])
4125 expecting = (b"This is the first line\n"
4126 b"And the second line is here\n")
4127 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4128 if buffering == 0:
4129 data = b''
4130 else:
4131 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004132 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004133 while len(data) != len(expecting):
4134 part = fo.read(size)
4135 if not part:
4136 break
4137 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004138 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004139
4140 def test_default(self):
4141 self._test_readline()
4142 self._test_readline(size=100)
4143 self._test_read()
4144 self._test_read(size=100)
4145
4146 def test_with_1k_buffer(self):
4147 self._test_readline(buffering=1024)
4148 self._test_readline(size=100, buffering=1024)
4149 self._test_read(buffering=1024)
4150 self._test_read(size=100, buffering=1024)
4151
4152 def _test_readline_no_buffer(self, size=-1):
4153 mock_sock = self.MockSocket(recv_funcs=[
4154 lambda : b"a",
4155 lambda : b"\n",
4156 lambda : b"B",
4157 self._raise_eintr,
4158 lambda : b"b",
4159 lambda : b"",
4160 ])
4161 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004162 self.assertEqual(fo.readline(size), b"a\n")
4163 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004164
4165 def test_no_buffer(self):
4166 self._test_readline_no_buffer()
4167 self._test_readline_no_buffer(size=4)
4168 self._test_read(buffering=0)
4169 self._test_read(size=100, buffering=0)
4170
4171
Guido van Rossume9f66142002-08-07 15:46:19 +00004172class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4173
4174 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004175
Guido van Rossume9f66142002-08-07 15:46:19 +00004176 In this case (and in this case only), it should be possible to
4177 create a file object, read a line from it, create another file
4178 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004179 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004180 when reading multiple requests from the same socket."""
4181
4182 bufsize = 0 # Use unbuffered mode
4183
4184 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004185 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004186 line = self.read_file.readline() # first line
4187 self.assertEqual(line, b"A. " + self.write_msg) # first line
4188 self.read_file = self.cli_conn.makefile('rb', 0)
4189 line = self.read_file.readline() # second line
4190 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004191
4192 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004193 self.write_file.write(b"A. " + self.write_msg)
4194 self.write_file.write(b"B. " + self.write_msg)
4195 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004196
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004197 def testMakefileClose(self):
4198 # The file returned by makefile should keep the socket open...
4199 self.cli_conn.close()
4200 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004201 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004202 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004203 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004204 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004205
4206 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004207 self.write_file.write(self.write_msg)
4208 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004209
4210 def testMakefileCloseSocketDestroy(self):
4211 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004212 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004213 refcount_after = sys.getrefcount(self.cli_conn)
4214 self.assertEqual(refcount_before - 1, refcount_after)
4215
4216 def _testMakefileCloseSocketDestroy(self):
4217 pass
4218
Antoine Pitrou98b46702010-09-18 22:59:00 +00004219 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004220 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004221 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4222
4223 def testSmallReadNonBlocking(self):
4224 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004225 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4226 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004227 self.evt1.set()
4228 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004229 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004230 if first_seg is None:
4231 # Data not arrived (can happen under Windows), wait a bit
4232 time.sleep(0.5)
4233 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004234 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004235 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004236 self.assertEqual(n, 3)
4237 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004238 self.assertEqual(msg, self.read_msg)
4239 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4240 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004241
4242 def _testSmallReadNonBlocking(self):
4243 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004244 self.write_file.write(self.write_msg)
4245 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004246 self.evt2.set()
4247 # Avoid cloding the socket before the server test has finished,
4248 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4249 self.serv_finished.wait(5.0)
4250
4251 def testWriteNonBlocking(self):
4252 self.cli_finished.wait(5.0)
4253 # The client thread can't skip directly - the SkipTest exception
4254 # would appear as a failure.
4255 if self.serv_skipped:
4256 self.skipTest(self.serv_skipped)
4257
4258 def _testWriteNonBlocking(self):
4259 self.serv_skipped = None
4260 self.serv_conn.setblocking(False)
4261 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004262 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004263 LIMIT = 10
4264 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004265 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004266 self.assertGreater(n, 0)
4267 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004268 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004269 if n is None:
4270 # Succeeded
4271 break
4272 self.assertGreater(n, 0)
4273 else:
4274 # Let us know that this test didn't manage to establish
4275 # the expected conditions. This is not a failure in itself but,
4276 # if it happens repeatedly, the test should be fixed.
4277 self.serv_skipped = "failed to saturate the socket buffer"
4278
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004279
Guido van Rossum8c943832002-08-08 01:00:28 +00004280class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4281
4282 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4283
4284
4285class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4286
4287 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004288
Thomas Woutersb2137042007-02-01 18:02:27 +00004289
Antoine Pitrou834bd812010-10-13 16:17:14 +00004290class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4291 """Tests for socket.makefile() in text mode (rather than binary)"""
4292
4293 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004294 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004295 write_mode = 'wb'
4296 write_msg = MSG
4297 newline = ''
4298
4299
4300class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4301 """Tests for socket.makefile() in text mode (rather than binary)"""
4302
4303 read_mode = 'rb'
4304 read_msg = MSG
4305 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004306 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004307 newline = ''
4308
4309
4310class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4311 """Tests for socket.makefile() in text mode (rather than binary)"""
4312
4313 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004314 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004315 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004316 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004317 newline = ''
4318
4319
Guido van Rossumd8faa362007-04-27 19:54:29 +00004320class NetworkConnectionTest(object):
4321 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004322
Guido van Rossumd8faa362007-04-27 19:54:29 +00004323 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004324 # We're inherited below by BasicTCPTest2, which also inherits
4325 # BasicTCPTest, which defines self.port referenced below.
4326 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004327 self.serv_conn = self.cli
4328
4329class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4330 """Tests that NetworkConnection does not break existing TCP functionality.
4331 """
4332
4333class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004334
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004335 class MockSocket(socket.socket):
4336 def connect(self, *args):
4337 raise socket.timeout('timed out')
4338
4339 @contextlib.contextmanager
4340 def mocked_socket_module(self):
4341 """Return a socket which times out on connect"""
4342 old_socket = socket.socket
4343 socket.socket = self.MockSocket
4344 try:
4345 yield
4346 finally:
4347 socket.socket = old_socket
4348
4349 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004350 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004351 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004352 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004353 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004354 cli.connect((HOST, port))
4355 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4356
4357 def test_create_connection(self):
4358 # Issue #9792: errors raised by create_connection() should have
4359 # a proper errno attribute.
4360 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004361 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004362 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004363
4364 # Issue #16257: create_connection() calls getaddrinfo() against
4365 # 'localhost'. This may result in an IPV6 addr being returned
4366 # as well as an IPV4 one:
4367 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4368 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4369 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4370 #
4371 # create_connection() enumerates through all the addresses returned
4372 # and if it doesn't successfully bind to any of them, it propagates
4373 # the last exception it encountered.
4374 #
4375 # On Solaris, ENETUNREACH is returned in this circumstance instead
4376 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4377 # expected errnos.
4378 expected_errnos = [ errno.ECONNREFUSED, ]
4379 if hasattr(errno, 'ENETUNREACH'):
4380 expected_errnos.append(errno.ENETUNREACH)
4381
4382 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004383
4384 def test_create_connection_timeout(self):
4385 # Issue #9792: create_connection() should not recast timeout errors
4386 # as generic socket errors.
4387 with self.mocked_socket_module():
4388 with self.assertRaises(socket.timeout):
4389 socket.create_connection((HOST, 1234))
4390
Guido van Rossumd8faa362007-04-27 19:54:29 +00004391
Victor Stinner45df8202010-04-28 22:31:17 +00004392@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004393class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4394
4395 def __init__(self, methodName='runTest'):
4396 SocketTCPTest.__init__(self, methodName=methodName)
4397 ThreadableTest.__init__(self)
4398
4399 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004400 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004401
4402 def clientTearDown(self):
4403 self.cli.close()
4404 self.cli = None
4405 ThreadableTest.clientTearDown(self)
4406
4407 def _justAccept(self):
4408 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004409 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004410
4411 testFamily = _justAccept
4412 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004413 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004414 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004415 self.assertEqual(self.cli.family, 2)
4416
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004417 testSourceAddress = _justAccept
4418 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004419 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4420 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004421 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004422 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004423 # The port number being used is sufficient to show that the bind()
4424 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004425
Guido van Rossumd8faa362007-04-27 19:54:29 +00004426 testTimeoutDefault = _justAccept
4427 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004428 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004429 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004430 socket.setdefaulttimeout(42)
4431 try:
4432 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004433 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004434 finally:
4435 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004436 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004437
4438 testTimeoutNone = _justAccept
4439 def _testTimeoutNone(self):
4440 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004441 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004442 socket.setdefaulttimeout(30)
4443 try:
4444 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004445 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004446 finally:
4447 socket.setdefaulttimeout(None)
4448 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004449
4450 testTimeoutValueNamed = _justAccept
4451 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004452 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004453 self.assertEqual(self.cli.gettimeout(), 30)
4454
4455 testTimeoutValueNonamed = _justAccept
4456 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004457 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004458 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004459 self.assertEqual(self.cli.gettimeout(), 30)
4460
Victor Stinner45df8202010-04-28 22:31:17 +00004461@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004462class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4463
4464 def __init__(self, methodName='runTest'):
4465 SocketTCPTest.__init__(self, methodName=methodName)
4466 ThreadableTest.__init__(self)
4467
4468 def clientSetUp(self):
4469 pass
4470
4471 def clientTearDown(self):
4472 self.cli.close()
4473 self.cli = None
4474 ThreadableTest.clientTearDown(self)
4475
4476 def testInsideTimeout(self):
4477 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004478 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004479 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004480 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004481 testOutsideTimeout = testInsideTimeout
4482
4483 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004484 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004485 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004486 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004487
4488 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004489 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004490 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004491
4492
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004493class TCPTimeoutTest(SocketTCPTest):
4494
4495 def testTCPTimeout(self):
4496 def raise_timeout(*args, **kwargs):
4497 self.serv.settimeout(1.0)
4498 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004499 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004500 "Error generating a timeout exception (TCP)")
4501
4502 def testTimeoutZero(self):
4503 ok = False
4504 try:
4505 self.serv.settimeout(0.0)
4506 foo = self.serv.accept()
4507 except socket.timeout:
4508 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004509 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004510 ok = True
4511 except:
4512 self.fail("caught unexpected exception (TCP)")
4513 if not ok:
4514 self.fail("accept() returned success when we did not expect it")
4515
Serhiy Storchaka43767632013-11-03 21:31:38 +02004516 @unittest.skipUnless(hasattr(signal, 'alarm'),
4517 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004518 def testInterruptedTimeout(self):
4519 # XXX I don't know how to do this test on MSWindows or any other
4520 # plaform that doesn't support signal.alarm() or os.kill(), though
4521 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004522 self.serv.settimeout(5.0) # must be longer than alarm
4523 class Alarm(Exception):
4524 pass
4525 def alarm_handler(signal, frame):
4526 raise Alarm
4527 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4528 try:
4529 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4530 try:
4531 foo = self.serv.accept()
4532 except socket.timeout:
4533 self.fail("caught timeout instead of Alarm")
4534 except Alarm:
4535 pass
4536 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004537 self.fail("caught other exception instead of Alarm:"
4538 " %s(%s):\n%s" %
4539 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004540 else:
4541 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004542 finally:
4543 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004544 except Alarm:
4545 self.fail("got Alarm in wrong place")
4546 finally:
4547 # no alarm can be pending. Safe to restore old handler.
4548 signal.signal(signal.SIGALRM, old_alarm)
4549
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004550class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004551
4552 def testUDPTimeout(self):
4553 def raise_timeout(*args, **kwargs):
4554 self.serv.settimeout(1.0)
4555 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004556 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004557 "Error generating a timeout exception (UDP)")
4558
4559 def testTimeoutZero(self):
4560 ok = False
4561 try:
4562 self.serv.settimeout(0.0)
4563 foo = self.serv.recv(1024)
4564 except socket.timeout:
4565 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004566 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004567 ok = True
4568 except:
4569 self.fail("caught unexpected exception (UDP)")
4570 if not ok:
4571 self.fail("recv() returned success when we did not expect it")
4572
4573class TestExceptions(unittest.TestCase):
4574
4575 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004576 self.assertTrue(issubclass(OSError, Exception))
4577 self.assertTrue(issubclass(socket.herror, OSError))
4578 self.assertTrue(issubclass(socket.gaierror, OSError))
4579 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004580
Serhiy Storchaka43767632013-11-03 21:31:38 +02004581@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004582class TestLinuxAbstractNamespace(unittest.TestCase):
4583
4584 UNIX_PATH_MAX = 108
4585
4586 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004587 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004588 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4589 s1.bind(address)
4590 s1.listen(1)
4591 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4592 s2.connect(s1.getsockname())
4593 with s1.accept()[0] as s3:
4594 self.assertEqual(s1.getsockname(), address)
4595 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004596
4597 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004598 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004599 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4600 s.bind(address)
4601 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004602
4603 def testNameOverflow(self):
4604 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004605 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004606 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004607
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004608 def testStrName(self):
4609 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004610 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4611 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004612 s.bind("\x00python\x00test\x00")
4613 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004614 finally:
4615 s.close()
4616
Serhiy Storchaka43767632013-11-03 21:31:38 +02004617@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004618class TestUnixDomain(unittest.TestCase):
4619
4620 def setUp(self):
4621 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4622
4623 def tearDown(self):
4624 self.sock.close()
4625
4626 def encoded(self, path):
4627 # Return the given path encoded in the file system encoding,
4628 # or skip the test if this is not possible.
4629 try:
4630 return os.fsencode(path)
4631 except UnicodeEncodeError:
4632 self.skipTest(
4633 "Pathname {0!a} cannot be represented in file "
4634 "system encoding {1!r}".format(
4635 path, sys.getfilesystemencoding()))
4636
Antoine Pitrou16374872011-12-16 15:04:12 +01004637 def bind(self, sock, path):
4638 # Bind the socket
4639 try:
4640 sock.bind(path)
4641 except OSError as e:
4642 if str(e) == "AF_UNIX path too long":
4643 self.skipTest(
4644 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4645 .format(path))
4646 else:
4647 raise
4648
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004649 def testStrAddr(self):
4650 # Test binding to and retrieving a normal string pathname.
4651 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004652 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004653 self.addCleanup(support.unlink, path)
4654 self.assertEqual(self.sock.getsockname(), path)
4655
4656 def testBytesAddr(self):
4657 # Test binding to a bytes pathname.
4658 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004659 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004660 self.addCleanup(support.unlink, path)
4661 self.assertEqual(self.sock.getsockname(), path)
4662
4663 def testSurrogateescapeBind(self):
4664 # Test binding to a valid non-ASCII pathname, with the
4665 # non-ASCII bytes supplied using surrogateescape encoding.
4666 path = os.path.abspath(support.TESTFN_UNICODE)
4667 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004668 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004669 self.addCleanup(support.unlink, path)
4670 self.assertEqual(self.sock.getsockname(), path)
4671
4672 def testUnencodableAddr(self):
4673 # Test binding to a pathname that cannot be encoded in the
4674 # file system encoding.
4675 if support.TESTFN_UNENCODABLE is None:
4676 self.skipTest("No unencodable filename available")
4677 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004678 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004679 self.addCleanup(support.unlink, path)
4680 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004681
Victor Stinner45df8202010-04-28 22:31:17 +00004682@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004683class BufferIOTest(SocketConnectedTest):
4684 """
4685 Test the buffer versions of socket.recv() and socket.send().
4686 """
4687 def __init__(self, methodName='runTest'):
4688 SocketConnectedTest.__init__(self, methodName=methodName)
4689
Antoine Pitrou25480782010-03-17 22:50:28 +00004690 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004691 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004692 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004693 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004694 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004695 self.assertEqual(msg, MSG)
4696
Antoine Pitrou25480782010-03-17 22:50:28 +00004697 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004698 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004699 self.serv_conn.send(buf)
4700
Antoine Pitrou25480782010-03-17 22:50:28 +00004701 def testRecvIntoBytearray(self):
4702 buf = bytearray(1024)
4703 nbytes = self.cli_conn.recv_into(buf)
4704 self.assertEqual(nbytes, len(MSG))
4705 msg = buf[:len(MSG)]
4706 self.assertEqual(msg, MSG)
4707
4708 _testRecvIntoBytearray = _testRecvIntoArray
4709
4710 def testRecvIntoMemoryview(self):
4711 buf = bytearray(1024)
4712 nbytes = self.cli_conn.recv_into(memoryview(buf))
4713 self.assertEqual(nbytes, len(MSG))
4714 msg = buf[:len(MSG)]
4715 self.assertEqual(msg, MSG)
4716
4717 _testRecvIntoMemoryview = _testRecvIntoArray
4718
4719 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004720 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004721 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004722 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004723 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004724 self.assertEqual(msg, MSG)
4725
Antoine Pitrou25480782010-03-17 22:50:28 +00004726 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004727 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004728 self.serv_conn.send(buf)
4729
Antoine Pitrou25480782010-03-17 22:50:28 +00004730 def testRecvFromIntoBytearray(self):
4731 buf = bytearray(1024)
4732 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4733 self.assertEqual(nbytes, len(MSG))
4734 msg = buf[:len(MSG)]
4735 self.assertEqual(msg, MSG)
4736
4737 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4738
4739 def testRecvFromIntoMemoryview(self):
4740 buf = bytearray(1024)
4741 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4742 self.assertEqual(nbytes, len(MSG))
4743 msg = buf[:len(MSG)]
4744 self.assertEqual(msg, MSG)
4745
4746 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4747
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004748 def testRecvFromIntoSmallBuffer(self):
4749 # See issue #20246.
4750 buf = bytearray(8)
4751 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4752
4753 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004754 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004755
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004756 def testRecvFromIntoEmptyBuffer(self):
4757 buf = bytearray()
4758 self.cli_conn.recvfrom_into(buf)
4759 self.cli_conn.recvfrom_into(buf, 0)
4760
4761 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4762
Christian Heimes043d6f62008-01-07 17:19:16 +00004763
4764TIPC_STYPE = 2000
4765TIPC_LOWER = 200
4766TIPC_UPPER = 210
4767
4768def isTipcAvailable():
4769 """Check if the TIPC module is loaded
4770
4771 The TIPC module is not loaded automatically on Ubuntu and probably
4772 other Linux distros.
4773 """
4774 if not hasattr(socket, "AF_TIPC"):
4775 return False
4776 if not os.path.isfile("/proc/modules"):
4777 return False
4778 with open("/proc/modules") as f:
4779 for line in f:
4780 if line.startswith("tipc "):
4781 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004782 return False
4783
Serhiy Storchaka43767632013-11-03 21:31:38 +02004784@unittest.skipUnless(isTipcAvailable(),
4785 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004786class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004787 def testRDM(self):
4788 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4789 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004790 self.addCleanup(srv.close)
4791 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004792
4793 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4794 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4795 TIPC_LOWER, TIPC_UPPER)
4796 srv.bind(srvaddr)
4797
4798 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4799 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4800 cli.sendto(MSG, sendaddr)
4801
4802 msg, recvaddr = srv.recvfrom(1024)
4803
4804 self.assertEqual(cli.getsockname(), recvaddr)
4805 self.assertEqual(msg, MSG)
4806
4807
Serhiy Storchaka43767632013-11-03 21:31:38 +02004808@unittest.skipUnless(isTipcAvailable(),
4809 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004810class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004811 def __init__(self, methodName = 'runTest'):
4812 unittest.TestCase.__init__(self, methodName = methodName)
4813 ThreadableTest.__init__(self)
4814
4815 def setUp(self):
4816 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004817 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004818 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4819 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4820 TIPC_LOWER, TIPC_UPPER)
4821 self.srv.bind(srvaddr)
4822 self.srv.listen(5)
4823 self.serverExplicitReady()
4824 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004825 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004826
4827 def clientSetUp(self):
4828 # The is a hittable race between serverExplicitReady() and the
4829 # accept() call; sleep a little while to avoid it, otherwise
4830 # we could get an exception
4831 time.sleep(0.1)
4832 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004833 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004834 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4835 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4836 self.cli.connect(addr)
4837 self.cliaddr = self.cli.getsockname()
4838
4839 def testStream(self):
4840 msg = self.conn.recv(1024)
4841 self.assertEqual(msg, MSG)
4842 self.assertEqual(self.cliaddr, self.connaddr)
4843
4844 def _testStream(self):
4845 self.cli.send(MSG)
4846 self.cli.close()
4847
4848
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004849@unittest.skipUnless(thread, 'Threading required for this test.')
4850class ContextManagersTest(ThreadedTCPSocketTest):
4851
4852 def _testSocketClass(self):
4853 # base test
4854 with socket.socket() as sock:
4855 self.assertFalse(sock._closed)
4856 self.assertTrue(sock._closed)
4857 # close inside with block
4858 with socket.socket() as sock:
4859 sock.close()
4860 self.assertTrue(sock._closed)
4861 # exception inside with block
4862 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004863 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004864 self.assertTrue(sock._closed)
4865
4866 def testCreateConnectionBase(self):
4867 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004868 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004869 data = conn.recv(1024)
4870 conn.sendall(data)
4871
4872 def _testCreateConnectionBase(self):
4873 address = self.serv.getsockname()
4874 with socket.create_connection(address) as sock:
4875 self.assertFalse(sock._closed)
4876 sock.sendall(b'foo')
4877 self.assertEqual(sock.recv(1024), b'foo')
4878 self.assertTrue(sock._closed)
4879
4880 def testCreateConnectionClose(self):
4881 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004882 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004883 data = conn.recv(1024)
4884 conn.sendall(data)
4885
4886 def _testCreateConnectionClose(self):
4887 address = self.serv.getsockname()
4888 with socket.create_connection(address) as sock:
4889 sock.close()
4890 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004891 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004892
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004893
Victor Stinnerdaf45552013-08-28 00:53:59 +02004894class InheritanceTest(unittest.TestCase):
4895 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4896 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004897 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004898 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004899 with socket.socket(socket.AF_INET,
4900 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4901 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004902 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004903
4904 def test_default_inheritable(self):
4905 sock = socket.socket()
4906 with sock:
4907 self.assertEqual(sock.get_inheritable(), False)
4908
4909 def test_dup(self):
4910 sock = socket.socket()
4911 with sock:
4912 newsock = sock.dup()
4913 sock.close()
4914 with newsock:
4915 self.assertEqual(newsock.get_inheritable(), False)
4916
4917 def test_set_inheritable(self):
4918 sock = socket.socket()
4919 with sock:
4920 sock.set_inheritable(True)
4921 self.assertEqual(sock.get_inheritable(), True)
4922
4923 sock.set_inheritable(False)
4924 self.assertEqual(sock.get_inheritable(), False)
4925
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004926 @unittest.skipIf(fcntl is None, "need fcntl")
4927 def test_get_inheritable_cloexec(self):
4928 sock = socket.socket()
4929 with sock:
4930 fd = sock.fileno()
4931 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004932
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004933 # clear FD_CLOEXEC flag
4934 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4935 flags &= ~fcntl.FD_CLOEXEC
4936 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004937
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004938 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004939
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004940 @unittest.skipIf(fcntl is None, "need fcntl")
4941 def test_set_inheritable_cloexec(self):
4942 sock = socket.socket()
4943 with sock:
4944 fd = sock.fileno()
4945 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4946 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004947
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004948 sock.set_inheritable(True)
4949 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4950 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004951
4952
Victor Stinnerdaf45552013-08-28 00:53:59 +02004953 @unittest.skipUnless(hasattr(socket, "socketpair"),
4954 "need socket.socketpair()")
4955 def test_socketpair(self):
4956 s1, s2 = socket.socketpair()
4957 self.addCleanup(s1.close)
4958 self.addCleanup(s2.close)
4959 self.assertEqual(s1.get_inheritable(), False)
4960 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004961
4962
4963@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4964 "SOCK_NONBLOCK not defined")
4965class NonblockConstantTest(unittest.TestCase):
4966 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4967 if nonblock:
4968 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4969 self.assertEqual(s.gettimeout(), timeout)
4970 else:
4971 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4972 self.assertEqual(s.gettimeout(), None)
4973
Charles-François Natali239bb962011-06-03 12:55:15 +02004974 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004975 def test_SOCK_NONBLOCK(self):
4976 # a lot of it seems silly and redundant, but I wanted to test that
4977 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004978 with socket.socket(socket.AF_INET,
4979 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4980 self.checkNonblock(s)
4981 s.setblocking(1)
4982 self.checkNonblock(s, False)
4983 s.setblocking(0)
4984 self.checkNonblock(s)
4985 s.settimeout(None)
4986 self.checkNonblock(s, False)
4987 s.settimeout(2.0)
4988 self.checkNonblock(s, timeout=2.0)
4989 s.setblocking(1)
4990 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004991 # defaulttimeout
4992 t = socket.getdefaulttimeout()
4993 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004994 with socket.socket() as s:
4995 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004996 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004997 with socket.socket() as s:
4998 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004999 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005000 with socket.socket() as s:
5001 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005002 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005003 with socket.socket() as s:
5004 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005005 socket.setdefaulttimeout(t)
5006
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005007
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005008@unittest.skipUnless(os.name == "nt", "Windows specific")
5009@unittest.skipUnless(multiprocessing, "need multiprocessing")
5010class TestSocketSharing(SocketTCPTest):
5011 # This must be classmethod and not staticmethod or multiprocessing
5012 # won't be able to bootstrap it.
5013 @classmethod
5014 def remoteProcessServer(cls, q):
5015 # Recreate socket from shared data
5016 sdata = q.get()
5017 message = q.get()
5018
5019 s = socket.fromshare(sdata)
5020 s2, c = s.accept()
5021
5022 # Send the message
5023 s2.sendall(message)
5024 s2.close()
5025 s.close()
5026
5027 def testShare(self):
5028 # Transfer the listening server socket to another process
5029 # and service it from there.
5030
5031 # Create process:
5032 q = multiprocessing.Queue()
5033 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5034 p.start()
5035
5036 # Get the shared socket data
5037 data = self.serv.share(p.pid)
5038
5039 # Pass the shared socket to the other process
5040 addr = self.serv.getsockname()
5041 self.serv.close()
5042 q.put(data)
5043
5044 # The data that the server will send us
5045 message = b"slapmahfro"
5046 q.put(message)
5047
5048 # Connect
5049 s = socket.create_connection(addr)
5050 # listen for the data
5051 m = []
5052 while True:
5053 data = s.recv(100)
5054 if not data:
5055 break
5056 m.append(data)
5057 s.close()
5058 received = b"".join(m)
5059 self.assertEqual(received, message)
5060 p.join()
5061
5062 def testShareLength(self):
5063 data = self.serv.share(os.getpid())
5064 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5065 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5066
5067 def compareSockets(self, org, other):
5068 # socket sharing is expected to work only for blocking socket
5069 # since the internal python timout value isn't transfered.
5070 self.assertEqual(org.gettimeout(), None)
5071 self.assertEqual(org.gettimeout(), other.gettimeout())
5072
5073 self.assertEqual(org.family, other.family)
5074 self.assertEqual(org.type, other.type)
5075 # If the user specified "0" for proto, then
5076 # internally windows will have picked the correct value.
5077 # Python introspection on the socket however will still return
5078 # 0. For the shared socket, the python value is recreated
5079 # from the actual value, so it may not compare correctly.
5080 if org.proto != 0:
5081 self.assertEqual(org.proto, other.proto)
5082
5083 def testShareLocal(self):
5084 data = self.serv.share(os.getpid())
5085 s = socket.fromshare(data)
5086 try:
5087 self.compareSockets(self.serv, s)
5088 finally:
5089 s.close()
5090
5091 def testTypes(self):
5092 families = [socket.AF_INET, socket.AF_INET6]
5093 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5094 for f in families:
5095 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005096 try:
5097 source = socket.socket(f, t)
5098 except OSError:
5099 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005100 try:
5101 data = source.share(os.getpid())
5102 shared = socket.fromshare(data)
5103 try:
5104 self.compareSockets(source, shared)
5105 finally:
5106 shared.close()
5107 finally:
5108 source.close()
5109
5110
Guido van Rossumb995eb72002-07-31 16:08:40 +00005111def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005112 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005113 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005114
5115 tests.extend([
5116 NonBlockingTCPTests,
5117 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005118 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005119 UnbufferedFileObjectClassTestCase,
5120 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005121 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005122 UnicodeReadFileObjectClassTestCase,
5123 UnicodeWriteFileObjectClassTestCase,
5124 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005125 NetworkConnectionNoServer,
5126 NetworkConnectionAttributesTest,
5127 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005128 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005129 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005130 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005131 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005132 tests.append(BasicSocketPairTest)
5133 tests.append(TestUnixDomain)
5134 tests.append(TestLinuxAbstractNamespace)
5135 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005136 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005137 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005138 tests.extend([
5139 CmsgMacroTests,
5140 SendmsgUDPTest,
5141 RecvmsgUDPTest,
5142 RecvmsgIntoUDPTest,
5143 SendmsgUDP6Test,
5144 RecvmsgUDP6Test,
5145 RecvmsgRFC3542AncillaryUDP6Test,
5146 RecvmsgIntoRFC3542AncillaryUDP6Test,
5147 RecvmsgIntoUDP6Test,
5148 SendmsgTCPTest,
5149 RecvmsgTCPTest,
5150 RecvmsgIntoTCPTest,
5151 SendmsgSCTPStreamTest,
5152 RecvmsgSCTPStreamTest,
5153 RecvmsgIntoSCTPStreamTest,
5154 SendmsgUnixStreamTest,
5155 RecvmsgUnixStreamTest,
5156 RecvmsgIntoUnixStreamTest,
5157 RecvmsgSCMRightsStreamTest,
5158 RecvmsgIntoSCMRightsStreamTest,
5159 # These are slow when setitimer() is not available
5160 InterruptedRecvTimeoutTest,
5161 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005162 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005163 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005164
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005165 thread_info = support.threading_setup()
5166 support.run_unittest(*tests)
5167 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005168
5169if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005170 test_main()