blob: a92265d9e5bf98c1bcfbe383e9ad4f764073ab65 [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):
Berker Peksag4882cac2015-04-14 09:30:01 +0300710 # Testing that sendto doesn't masks failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300711 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):
Victor Stinner808d6412015-09-21 09:04:01 +02001287 # Check for internet access before running test
1288 # (issue #12804, issue #25138).
1289 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001290 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001291
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001292 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001293 domain = 'испытание.pythontest.net'
1294 socket.gethostbyname(domain)
1295 socket.gethostbyname_ex(domain)
1296 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001297 # 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)
Ethan Furman482fe042015-03-18 18:19:30 -07001377 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1378 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1379 self.assertEqual(family, socket.AF_INET)
1380 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1381 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001382
Serhiy Storchaka78980432013-01-15 01:12:17 +02001383 def test_listen_backlog(self):
1384 for backlog in 0, -1:
1385 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1386 srv.bind((HOST, 0))
1387 srv.listen(backlog)
1388 srv.close()
1389
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001390 @support.cpython_only
1391 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001392 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001393 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001394 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1395 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001396 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001397 srv.close()
1398
Charles-François Natali42663332012-01-02 15:57:30 +01001399 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001400 def test_flowinfo(self):
1401 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001402 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001403 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001404 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001405
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001406 def test_str_for_enums(self):
1407 # Make sure that the AF_* and SOCK_* constants have enum-like string
1408 # reprs.
1409 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1410 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001411 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001412
1413 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1414 def test_uknown_socket_family_repr(self):
1415 # Test that when created with a family that's not one of the known
1416 # AF_*/SOCK_* constants, socket.family just returns the number.
1417 #
1418 # To do this we fool socket.socket into believing it already has an
1419 # open fd because on this path it doesn't actually verify the family and
1420 # type and populates the socket object.
1421 #
1422 # On Windows this trick won't work, so the test is skipped.
1423 fd, _ = tempfile.mkstemp()
1424 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1425 self.assertEqual(s.family, 42424)
1426 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001427
Charles-François Natali47413c12011-10-06 19:47:44 +02001428@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1429class BasicCANTest(unittest.TestCase):
1430
1431 def testCrucialConstants(self):
1432 socket.AF_CAN
1433 socket.PF_CAN
1434 socket.CAN_RAW
1435
Charles-François Natali773e42d2013-02-05 19:42:01 +01001436 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1437 'socket.CAN_BCM required for this test.')
1438 def testBCMConstants(self):
1439 socket.CAN_BCM
1440
1441 # opcodes
1442 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1443 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1444 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1445 socket.CAN_BCM_TX_SEND # send one CAN frame
1446 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1447 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1448 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1449 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1450 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1451 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1452 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1453 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1454
Charles-François Natali47413c12011-10-06 19:47:44 +02001455 def testCreateSocket(self):
1456 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1457 pass
1458
Charles-François Natali773e42d2013-02-05 19:42:01 +01001459 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1460 'socket.CAN_BCM required for this test.')
1461 def testCreateBCMSocket(self):
1462 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1463 pass
1464
Charles-François Natali47413c12011-10-06 19:47:44 +02001465 def testBindAny(self):
1466 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1467 s.bind(('', ))
1468
1469 def testTooLongInterfaceName(self):
1470 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1471 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001472 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001473 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001474
1475 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1476 'socket.CAN_RAW_LOOPBACK required for this test.')
1477 def testLoopback(self):
1478 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1479 for loopback in (0, 1):
1480 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1481 loopback)
1482 self.assertEqual(loopback,
1483 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1484
1485 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1486 'socket.CAN_RAW_FILTER required for this test.')
1487 def testFilter(self):
1488 can_id, can_mask = 0x200, 0x700
1489 can_filter = struct.pack("=II", can_id, can_mask)
1490 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1491 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1492 self.assertEqual(can_filter,
1493 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1494
1495
1496@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001497@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001498class CANTest(ThreadedCANSocketTest):
1499
Charles-François Natali47413c12011-10-06 19:47:44 +02001500 def __init__(self, methodName='runTest'):
1501 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1502
1503 @classmethod
1504 def build_can_frame(cls, can_id, data):
1505 """Build a CAN frame."""
1506 can_dlc = len(data)
1507 data = data.ljust(8, b'\x00')
1508 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1509
1510 @classmethod
1511 def dissect_can_frame(cls, frame):
1512 """Dissect a CAN frame."""
1513 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1514 return (can_id, can_dlc, data[:can_dlc])
1515
1516 def testSendFrame(self):
1517 cf, addr = self.s.recvfrom(self.bufsize)
1518 self.assertEqual(self.cf, cf)
1519 self.assertEqual(addr[0], self.interface)
1520 self.assertEqual(addr[1], socket.AF_CAN)
1521
1522 def _testSendFrame(self):
1523 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1524 self.cli.send(self.cf)
1525
1526 def testSendMaxFrame(self):
1527 cf, addr = self.s.recvfrom(self.bufsize)
1528 self.assertEqual(self.cf, cf)
1529
1530 def _testSendMaxFrame(self):
1531 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1532 self.cli.send(self.cf)
1533
1534 def testSendMultiFrames(self):
1535 cf, addr = self.s.recvfrom(self.bufsize)
1536 self.assertEqual(self.cf1, cf)
1537
1538 cf, addr = self.s.recvfrom(self.bufsize)
1539 self.assertEqual(self.cf2, cf)
1540
1541 def _testSendMultiFrames(self):
1542 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1543 self.cli.send(self.cf1)
1544
1545 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1546 self.cli.send(self.cf2)
1547
Charles-François Natali773e42d2013-02-05 19:42:01 +01001548 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1549 'socket.CAN_BCM required for this test.')
1550 def _testBCM(self):
1551 cf, addr = self.cli.recvfrom(self.bufsize)
1552 self.assertEqual(self.cf, cf)
1553 can_id, can_dlc, data = self.dissect_can_frame(cf)
1554 self.assertEqual(self.can_id, can_id)
1555 self.assertEqual(self.data, data)
1556
1557 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1558 'socket.CAN_BCM required for this test.')
1559 def testBCM(self):
1560 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1561 self.addCleanup(bcm.close)
1562 bcm.connect((self.interface,))
1563 self.can_id = 0x123
1564 self.data = bytes([0xc0, 0xff, 0xee])
1565 self.cf = self.build_can_frame(self.can_id, self.data)
1566 opcode = socket.CAN_BCM_TX_SEND
1567 flags = 0
1568 count = 0
1569 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1570 bcm_can_id = 0x0222
1571 nframes = 1
1572 assert len(self.cf) == 16
1573 header = struct.pack(self.bcm_cmd_msg_fmt,
1574 opcode,
1575 flags,
1576 count,
1577 ival1_seconds,
1578 ival1_usec,
1579 ival2_seconds,
1580 ival2_usec,
1581 bcm_can_id,
1582 nframes,
1583 )
1584 header_plus_frame = header + self.cf
1585 bytes_sent = bcm.send(header_plus_frame)
1586 self.assertEqual(bytes_sent, len(header_plus_frame))
1587
Charles-François Natali47413c12011-10-06 19:47:44 +02001588
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001589@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1590class BasicRDSTest(unittest.TestCase):
1591
1592 def testCrucialConstants(self):
1593 socket.AF_RDS
1594 socket.PF_RDS
1595
1596 def testCreateSocket(self):
1597 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1598 pass
1599
1600 def testSocketBufferSize(self):
1601 bufsize = 16384
1602 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1603 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1604 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1605
1606
1607@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1608@unittest.skipUnless(thread, 'Threading required for this test.')
1609class RDSTest(ThreadedRDSSocketTest):
1610
1611 def __init__(self, methodName='runTest'):
1612 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1613
Charles-François Natali240c55f2011-11-10 20:33:36 +01001614 def setUp(self):
1615 super().setUp()
1616 self.evt = threading.Event()
1617
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001618 def testSendAndRecv(self):
1619 data, addr = self.serv.recvfrom(self.bufsize)
1620 self.assertEqual(self.data, data)
1621 self.assertEqual(self.cli_addr, addr)
1622
1623 def _testSendAndRecv(self):
1624 self.data = b'spam'
1625 self.cli.sendto(self.data, 0, (HOST, self.port))
1626
1627 def testPeek(self):
1628 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1629 self.assertEqual(self.data, data)
1630 data, addr = self.serv.recvfrom(self.bufsize)
1631 self.assertEqual(self.data, data)
1632
1633 def _testPeek(self):
1634 self.data = b'spam'
1635 self.cli.sendto(self.data, 0, (HOST, self.port))
1636
1637 @requireAttrs(socket.socket, 'recvmsg')
1638 def testSendAndRecvMsg(self):
1639 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1640 self.assertEqual(self.data, data)
1641
1642 @requireAttrs(socket.socket, 'sendmsg')
1643 def _testSendAndRecvMsg(self):
1644 self.data = b'hello ' * 10
1645 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1646
1647 def testSendAndRecvMulti(self):
1648 data, addr = self.serv.recvfrom(self.bufsize)
1649 self.assertEqual(self.data1, data)
1650
1651 data, addr = self.serv.recvfrom(self.bufsize)
1652 self.assertEqual(self.data2, data)
1653
1654 def _testSendAndRecvMulti(self):
1655 self.data1 = b'bacon'
1656 self.cli.sendto(self.data1, 0, (HOST, self.port))
1657
1658 self.data2 = b'egg'
1659 self.cli.sendto(self.data2, 0, (HOST, self.port))
1660
1661 def testSelect(self):
1662 r, w, x = select.select([self.serv], [], [], 3.0)
1663 self.assertIn(self.serv, r)
1664 data, addr = self.serv.recvfrom(self.bufsize)
1665 self.assertEqual(self.data, data)
1666
1667 def _testSelect(self):
1668 self.data = b'select'
1669 self.cli.sendto(self.data, 0, (HOST, self.port))
1670
1671 def testCongestion(self):
1672 # wait until the sender is done
1673 self.evt.wait()
1674
1675 def _testCongestion(self):
1676 # test the behavior in case of congestion
1677 self.data = b'fill'
1678 self.cli.setblocking(False)
1679 try:
1680 # try to lower the receiver's socket buffer size
1681 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1682 except OSError:
1683 pass
1684 with self.assertRaises(OSError) as cm:
1685 try:
1686 # fill the receiver's socket buffer
1687 while True:
1688 self.cli.sendto(self.data, 0, (HOST, self.port))
1689 finally:
1690 # signal the receiver we're done
1691 self.evt.set()
1692 # sendto() should have failed with ENOBUFS
1693 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1694 # and we should have received a congestion notification through poll
1695 r, w, x = select.select([self.serv], [], [], 3.0)
1696 self.assertIn(self.serv, r)
1697
1698
Victor Stinner45df8202010-04-28 22:31:17 +00001699@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001700class BasicTCPTest(SocketConnectedTest):
1701
1702 def __init__(self, methodName='runTest'):
1703 SocketConnectedTest.__init__(self, methodName=methodName)
1704
1705 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001706 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001707 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001708 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001709
1710 def _testRecv(self):
1711 self.serv_conn.send(MSG)
1712
1713 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001714 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001715 seg1 = self.cli_conn.recv(len(MSG) - 3)
1716 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001717 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001718 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001719
1720 def _testOverFlowRecv(self):
1721 self.serv_conn.send(MSG)
1722
1723 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001724 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001725 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001726 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001727
1728 def _testRecvFrom(self):
1729 self.serv_conn.send(MSG)
1730
1731 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001732 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001733 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1734 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001735 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001736 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001737
1738 def _testOverFlowRecvFrom(self):
1739 self.serv_conn.send(MSG)
1740
1741 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001742 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001743 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001744 while 1:
1745 read = self.cli_conn.recv(1024)
1746 if not read:
1747 break
Guido van Rossume531e292002-08-08 20:28:34 +00001748 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001749 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001750
1751 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001752 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001753 self.serv_conn.sendall(big_chunk)
1754
1755 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001756 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001757 fd = self.cli_conn.fileno()
1758 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001759 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001760 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001761 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001762 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001763
1764 def _testFromFd(self):
1765 self.serv_conn.send(MSG)
1766
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001767 def testDup(self):
1768 # Testing dup()
1769 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001770 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001771 msg = sock.recv(1024)
1772 self.assertEqual(msg, MSG)
1773
1774 def _testDup(self):
1775 self.serv_conn.send(MSG)
1776
Guido van Rossum24e4af82002-06-12 19:18:08 +00001777 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001778 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001779 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001780 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001781 # wait for _testShutdown to finish: on OS X, when the server
1782 # closes the connection the client also becomes disconnected,
1783 # and the client's shutdown call will fail. (Issue #4397.)
1784 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001785
1786 def _testShutdown(self):
1787 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001788 self.serv_conn.shutdown(2)
1789
1790 testShutdown_overflow = support.cpython_only(testShutdown)
1791
1792 @support.cpython_only
1793 def _testShutdown_overflow(self):
1794 import _testcapi
1795 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001796 # Issue 15989
1797 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1798 _testcapi.INT_MAX + 1)
1799 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1800 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001801 self.serv_conn.shutdown(2)
1802
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001803 def testDetach(self):
1804 # Testing detach()
1805 fileno = self.cli_conn.fileno()
1806 f = self.cli_conn.detach()
1807 self.assertEqual(f, fileno)
1808 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001809 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001810 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001811 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001812 # ...but we can create another socket using the (still open)
1813 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001814 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001815 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001816 msg = sock.recv(1024)
1817 self.assertEqual(msg, MSG)
1818
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001819 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001820 self.serv_conn.send(MSG)
1821
Victor Stinner45df8202010-04-28 22:31:17 +00001822@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001823class BasicUDPTest(ThreadedUDPSocketTest):
1824
1825 def __init__(self, methodName='runTest'):
1826 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1827
1828 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001829 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001830 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001831 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001832
1833 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001834 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001835
Guido van Rossum1c938012002-06-12 21:17:20 +00001836 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001837 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001838 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001839 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001840
Guido van Rossum1c938012002-06-12 21:17:20 +00001841 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001842 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001843
Guido van Rossumd8faa362007-04-27 19:54:29 +00001844 def testRecvFromNegative(self):
1845 # Negative lengths passed to recvfrom should give ValueError.
1846 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1847
1848 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001849 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001850
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001851# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1852# same test code is used with different families and types of socket
1853# (e.g. stream, datagram), and tests using recvmsg() are repeated
1854# using recvmsg_into().
1855#
1856# The generic test classes such as SendmsgTests and
1857# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1858# supplied with sockets cli_sock and serv_sock representing the
1859# client's and the server's end of the connection respectively, and
1860# attributes cli_addr and serv_addr holding their (numeric where
1861# appropriate) addresses.
1862#
1863# The final concrete test classes combine these with subclasses of
1864# SocketTestBase which set up client and server sockets of a specific
1865# type, and with subclasses of SendrecvmsgBase such as
1866# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1867# sockets to cli_sock and serv_sock and override the methods and
1868# attributes of SendrecvmsgBase to fill in destination addresses if
1869# needed when sending, check for specific flags in msg_flags, etc.
1870#
1871# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1872# recvmsg_into().
1873
1874# XXX: like the other datagram (UDP) tests in this module, the code
1875# here assumes that datagram delivery on the local machine will be
1876# reliable.
1877
1878class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1879 # Base class for sendmsg()/recvmsg() tests.
1880
1881 # Time in seconds to wait before considering a test failed, or
1882 # None for no timeout. Not all tests actually set a timeout.
1883 fail_timeout = 3.0
1884
1885 def setUp(self):
1886 self.misc_event = threading.Event()
1887 super().setUp()
1888
1889 def sendToServer(self, msg):
1890 # Send msg to the server.
1891 return self.cli_sock.send(msg)
1892
1893 # Tuple of alternative default arguments for sendmsg() when called
1894 # via sendmsgToServer() (e.g. to include a destination address).
1895 sendmsg_to_server_defaults = ()
1896
1897 def sendmsgToServer(self, *args):
1898 # Call sendmsg() on self.cli_sock with the given arguments,
1899 # filling in any arguments which are not supplied with the
1900 # corresponding items of self.sendmsg_to_server_defaults, if
1901 # any.
1902 return self.cli_sock.sendmsg(
1903 *(args + self.sendmsg_to_server_defaults[len(args):]))
1904
1905 def doRecvmsg(self, sock, bufsize, *args):
1906 # Call recvmsg() on sock with given arguments and return its
1907 # result. Should be used for tests which can use either
1908 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1909 # this method with one which emulates it using recvmsg_into(),
1910 # thus allowing the same test to be used for both methods.
1911 result = sock.recvmsg(bufsize, *args)
1912 self.registerRecvmsgResult(result)
1913 return result
1914
1915 def registerRecvmsgResult(self, result):
1916 # Called by doRecvmsg() with the return value of recvmsg() or
1917 # recvmsg_into(). Can be overridden to arrange cleanup based
1918 # on the returned ancillary data, for instance.
1919 pass
1920
1921 def checkRecvmsgAddress(self, addr1, addr2):
1922 # Called to compare the received address with the address of
1923 # the peer.
1924 self.assertEqual(addr1, addr2)
1925
1926 # Flags that are normally unset in msg_flags
1927 msg_flags_common_unset = 0
1928 for name in ("MSG_CTRUNC", "MSG_OOB"):
1929 msg_flags_common_unset |= getattr(socket, name, 0)
1930
1931 # Flags that are normally set
1932 msg_flags_common_set = 0
1933
1934 # Flags set when a complete record has been received (e.g. MSG_EOR
1935 # for SCTP)
1936 msg_flags_eor_indicator = 0
1937
1938 # Flags set when a complete record has not been received
1939 # (e.g. MSG_TRUNC for datagram sockets)
1940 msg_flags_non_eor_indicator = 0
1941
1942 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1943 # Method to check the value of msg_flags returned by recvmsg[_into]().
1944 #
1945 # Checks that all bits in msg_flags_common_set attribute are
1946 # set in "flags" and all bits in msg_flags_common_unset are
1947 # unset.
1948 #
1949 # The "eor" argument specifies whether the flags should
1950 # indicate that a full record (or datagram) has been received.
1951 # If "eor" is None, no checks are done; otherwise, checks
1952 # that:
1953 #
1954 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1955 # set and all bits in msg_flags_non_eor_indicator are unset
1956 #
1957 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1958 # are set and all bits in msg_flags_eor_indicator are unset
1959 #
1960 # If "checkset" and/or "checkunset" are supplied, they require
1961 # the given bits to be set or unset respectively, overriding
1962 # what the attributes require for those bits.
1963 #
1964 # If any bits are set in "ignore", they will not be checked,
1965 # regardless of the other inputs.
1966 #
1967 # Will raise Exception if the inputs require a bit to be both
1968 # set and unset, and it is not ignored.
1969
1970 defaultset = self.msg_flags_common_set
1971 defaultunset = self.msg_flags_common_unset
1972
1973 if eor:
1974 defaultset |= self.msg_flags_eor_indicator
1975 defaultunset |= self.msg_flags_non_eor_indicator
1976 elif eor is not None:
1977 defaultset |= self.msg_flags_non_eor_indicator
1978 defaultunset |= self.msg_flags_eor_indicator
1979
1980 # Function arguments override defaults
1981 defaultset &= ~checkunset
1982 defaultunset &= ~checkset
1983
1984 # Merge arguments with remaining defaults, and check for conflicts
1985 checkset |= defaultset
1986 checkunset |= defaultunset
1987 inboth = checkset & checkunset & ~ignore
1988 if inboth:
1989 raise Exception("contradictory set, unset requirements for flags "
1990 "{0:#x}".format(inboth))
1991
1992 # Compare with given msg_flags value
1993 mask = (checkset | checkunset) & ~ignore
1994 self.assertEqual(flags & mask, checkset & mask)
1995
1996
1997class RecvmsgIntoMixin(SendrecvmsgBase):
1998 # Mixin to implement doRecvmsg() using recvmsg_into().
1999
2000 def doRecvmsg(self, sock, bufsize, *args):
2001 buf = bytearray(bufsize)
2002 result = sock.recvmsg_into([buf], *args)
2003 self.registerRecvmsgResult(result)
2004 self.assertGreaterEqual(result[0], 0)
2005 self.assertLessEqual(result[0], bufsize)
2006 return (bytes(buf[:result[0]]),) + result[1:]
2007
2008
2009class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2010 # Defines flags to be checked in msg_flags for datagram sockets.
2011
2012 @property
2013 def msg_flags_non_eor_indicator(self):
2014 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2015
2016
2017class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2018 # Defines flags to be checked in msg_flags for SCTP sockets.
2019
2020 @property
2021 def msg_flags_eor_indicator(self):
2022 return super().msg_flags_eor_indicator | socket.MSG_EOR
2023
2024
2025class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2026 # Base class for tests on connectionless-mode sockets. Users must
2027 # supply sockets on attributes cli and serv to be mapped to
2028 # cli_sock and serv_sock respectively.
2029
2030 @property
2031 def serv_sock(self):
2032 return self.serv
2033
2034 @property
2035 def cli_sock(self):
2036 return self.cli
2037
2038 @property
2039 def sendmsg_to_server_defaults(self):
2040 return ([], [], 0, self.serv_addr)
2041
2042 def sendToServer(self, msg):
2043 return self.cli_sock.sendto(msg, self.serv_addr)
2044
2045
2046class SendrecvmsgConnectedBase(SendrecvmsgBase):
2047 # Base class for tests on connected sockets. Users must supply
2048 # sockets on attributes serv_conn and cli_conn (representing the
2049 # connections *to* the server and the client), to be mapped to
2050 # cli_sock and serv_sock respectively.
2051
2052 @property
2053 def serv_sock(self):
2054 return self.cli_conn
2055
2056 @property
2057 def cli_sock(self):
2058 return self.serv_conn
2059
2060 def checkRecvmsgAddress(self, addr1, addr2):
2061 # Address is currently "unspecified" for a connected socket,
2062 # so we don't examine it
2063 pass
2064
2065
2066class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2067 # Base class to set a timeout on server's socket.
2068
2069 def setUp(self):
2070 super().setUp()
2071 self.serv_sock.settimeout(self.fail_timeout)
2072
2073
2074class SendmsgTests(SendrecvmsgServerTimeoutBase):
2075 # Tests for sendmsg() which can use any socket type and do not
2076 # involve recvmsg() or recvmsg_into().
2077
2078 def testSendmsg(self):
2079 # Send a simple message with sendmsg().
2080 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2081
2082 def _testSendmsg(self):
2083 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2084
2085 def testSendmsgDataGenerator(self):
2086 # Send from buffer obtained from a generator (not a sequence).
2087 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2088
2089 def _testSendmsgDataGenerator(self):
2090 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2091 len(MSG))
2092
2093 def testSendmsgAncillaryGenerator(self):
2094 # Gather (empty) ancillary data from a generator.
2095 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2096
2097 def _testSendmsgAncillaryGenerator(self):
2098 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2099 len(MSG))
2100
2101 def testSendmsgArray(self):
2102 # Send data from an array instead of the usual bytes object.
2103 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2104
2105 def _testSendmsgArray(self):
2106 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2107 len(MSG))
2108
2109 def testSendmsgGather(self):
2110 # Send message data from more than one buffer (gather write).
2111 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2112
2113 def _testSendmsgGather(self):
2114 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2115
2116 def testSendmsgBadArgs(self):
2117 # Check that sendmsg() rejects invalid arguments.
2118 self.assertEqual(self.serv_sock.recv(1000), b"done")
2119
2120 def _testSendmsgBadArgs(self):
2121 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2122 self.assertRaises(TypeError, self.sendmsgToServer,
2123 b"not in an iterable")
2124 self.assertRaises(TypeError, self.sendmsgToServer,
2125 object())
2126 self.assertRaises(TypeError, self.sendmsgToServer,
2127 [object()])
2128 self.assertRaises(TypeError, self.sendmsgToServer,
2129 [MSG, object()])
2130 self.assertRaises(TypeError, self.sendmsgToServer,
2131 [MSG], object())
2132 self.assertRaises(TypeError, self.sendmsgToServer,
2133 [MSG], [], object())
2134 self.assertRaises(TypeError, self.sendmsgToServer,
2135 [MSG], [], 0, object())
2136 self.sendToServer(b"done")
2137
2138 def testSendmsgBadCmsg(self):
2139 # Check that invalid ancillary data items are rejected.
2140 self.assertEqual(self.serv_sock.recv(1000), b"done")
2141
2142 def _testSendmsgBadCmsg(self):
2143 self.assertRaises(TypeError, self.sendmsgToServer,
2144 [MSG], [object()])
2145 self.assertRaises(TypeError, self.sendmsgToServer,
2146 [MSG], [(object(), 0, b"data")])
2147 self.assertRaises(TypeError, self.sendmsgToServer,
2148 [MSG], [(0, object(), b"data")])
2149 self.assertRaises(TypeError, self.sendmsgToServer,
2150 [MSG], [(0, 0, object())])
2151 self.assertRaises(TypeError, self.sendmsgToServer,
2152 [MSG], [(0, 0)])
2153 self.assertRaises(TypeError, self.sendmsgToServer,
2154 [MSG], [(0, 0, b"data", 42)])
2155 self.sendToServer(b"done")
2156
2157 @requireAttrs(socket, "CMSG_SPACE")
2158 def testSendmsgBadMultiCmsg(self):
2159 # Check that invalid ancillary data items are rejected when
2160 # more than one item is present.
2161 self.assertEqual(self.serv_sock.recv(1000), b"done")
2162
2163 @testSendmsgBadMultiCmsg.client_skip
2164 def _testSendmsgBadMultiCmsg(self):
2165 self.assertRaises(TypeError, self.sendmsgToServer,
2166 [MSG], [0, 0, b""])
2167 self.assertRaises(TypeError, self.sendmsgToServer,
2168 [MSG], [(0, 0, b""), object()])
2169 self.sendToServer(b"done")
2170
2171 def testSendmsgExcessCmsgReject(self):
2172 # Check that sendmsg() rejects excess ancillary data items
2173 # when the number that can be sent is limited.
2174 self.assertEqual(self.serv_sock.recv(1000), b"done")
2175
2176 def _testSendmsgExcessCmsgReject(self):
2177 if not hasattr(socket, "CMSG_SPACE"):
2178 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002179 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002180 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2181 self.assertIsNone(cm.exception.errno)
2182 self.sendToServer(b"done")
2183
2184 def testSendmsgAfterClose(self):
2185 # Check that sendmsg() fails on a closed socket.
2186 pass
2187
2188 def _testSendmsgAfterClose(self):
2189 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002190 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002191
2192
2193class SendmsgStreamTests(SendmsgTests):
2194 # Tests for sendmsg() which require a stream socket and do not
2195 # involve recvmsg() or recvmsg_into().
2196
2197 def testSendmsgExplicitNoneAddr(self):
2198 # Check that peer address can be specified as None.
2199 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2200
2201 def _testSendmsgExplicitNoneAddr(self):
2202 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2203
2204 def testSendmsgTimeout(self):
2205 # Check that timeout works with sendmsg().
2206 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2207 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2208
2209 def _testSendmsgTimeout(self):
2210 try:
2211 self.cli_sock.settimeout(0.03)
2212 with self.assertRaises(socket.timeout):
2213 while True:
2214 self.sendmsgToServer([b"a"*512])
2215 finally:
2216 self.misc_event.set()
2217
2218 # XXX: would be nice to have more tests for sendmsg flags argument.
2219
2220 # Linux supports MSG_DONTWAIT when sending, but in general, it
2221 # only works when receiving. Could add other platforms if they
2222 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002223 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002224 "MSG_DONTWAIT not known to work on this platform when "
2225 "sending")
2226 def testSendmsgDontWait(self):
2227 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2228 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2229 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2230
2231 @testSendmsgDontWait.client_skip
2232 def _testSendmsgDontWait(self):
2233 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002234 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002235 while True:
2236 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2237 self.assertIn(cm.exception.errno,
2238 (errno.EAGAIN, errno.EWOULDBLOCK))
2239 finally:
2240 self.misc_event.set()
2241
2242
2243class SendmsgConnectionlessTests(SendmsgTests):
2244 # Tests for sendmsg() which require a connectionless-mode
2245 # (e.g. datagram) socket, and do not involve recvmsg() or
2246 # recvmsg_into().
2247
2248 def testSendmsgNoDestAddr(self):
2249 # Check that sendmsg() fails when no destination address is
2250 # given for unconnected socket.
2251 pass
2252
2253 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002254 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002255 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002256 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002257 [MSG], [], 0, None)
2258
2259
2260class RecvmsgGenericTests(SendrecvmsgBase):
2261 # Tests for recvmsg() which can also be emulated using
2262 # recvmsg_into(), and can use any socket type.
2263
2264 def testRecvmsg(self):
2265 # Receive a simple message with recvmsg[_into]().
2266 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2267 self.assertEqual(msg, MSG)
2268 self.checkRecvmsgAddress(addr, self.cli_addr)
2269 self.assertEqual(ancdata, [])
2270 self.checkFlags(flags, eor=True)
2271
2272 def _testRecvmsg(self):
2273 self.sendToServer(MSG)
2274
2275 def testRecvmsgExplicitDefaults(self):
2276 # Test recvmsg[_into]() with default arguments provided explicitly.
2277 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2278 len(MSG), 0, 0)
2279 self.assertEqual(msg, MSG)
2280 self.checkRecvmsgAddress(addr, self.cli_addr)
2281 self.assertEqual(ancdata, [])
2282 self.checkFlags(flags, eor=True)
2283
2284 def _testRecvmsgExplicitDefaults(self):
2285 self.sendToServer(MSG)
2286
2287 def testRecvmsgShorter(self):
2288 # Receive a message smaller than buffer.
2289 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2290 len(MSG) + 42)
2291 self.assertEqual(msg, MSG)
2292 self.checkRecvmsgAddress(addr, self.cli_addr)
2293 self.assertEqual(ancdata, [])
2294 self.checkFlags(flags, eor=True)
2295
2296 def _testRecvmsgShorter(self):
2297 self.sendToServer(MSG)
2298
Charles-François Natali8619cd72011-10-03 19:43:15 +02002299 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2300 # datagram is received (issue #13001).
2301 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002302 def testRecvmsgTrunc(self):
2303 # Receive part of message, check for truncation indicators.
2304 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2305 len(MSG) - 3)
2306 self.assertEqual(msg, MSG[:-3])
2307 self.checkRecvmsgAddress(addr, self.cli_addr)
2308 self.assertEqual(ancdata, [])
2309 self.checkFlags(flags, eor=False)
2310
Charles-François Natali8619cd72011-10-03 19:43:15 +02002311 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002312 def _testRecvmsgTrunc(self):
2313 self.sendToServer(MSG)
2314
2315 def testRecvmsgShortAncillaryBuf(self):
2316 # Test ancillary data buffer too small to hold any ancillary data.
2317 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2318 len(MSG), 1)
2319 self.assertEqual(msg, MSG)
2320 self.checkRecvmsgAddress(addr, self.cli_addr)
2321 self.assertEqual(ancdata, [])
2322 self.checkFlags(flags, eor=True)
2323
2324 def _testRecvmsgShortAncillaryBuf(self):
2325 self.sendToServer(MSG)
2326
2327 def testRecvmsgLongAncillaryBuf(self):
2328 # Test large ancillary data buffer.
2329 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2330 len(MSG), 10240)
2331 self.assertEqual(msg, MSG)
2332 self.checkRecvmsgAddress(addr, self.cli_addr)
2333 self.assertEqual(ancdata, [])
2334 self.checkFlags(flags, eor=True)
2335
2336 def _testRecvmsgLongAncillaryBuf(self):
2337 self.sendToServer(MSG)
2338
2339 def testRecvmsgAfterClose(self):
2340 # Check that recvmsg[_into]() fails on a closed socket.
2341 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002342 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002343
2344 def _testRecvmsgAfterClose(self):
2345 pass
2346
2347 def testRecvmsgTimeout(self):
2348 # Check that timeout works.
2349 try:
2350 self.serv_sock.settimeout(0.03)
2351 self.assertRaises(socket.timeout,
2352 self.doRecvmsg, self.serv_sock, len(MSG))
2353 finally:
2354 self.misc_event.set()
2355
2356 def _testRecvmsgTimeout(self):
2357 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2358
2359 @requireAttrs(socket, "MSG_PEEK")
2360 def testRecvmsgPeek(self):
2361 # Check that MSG_PEEK in flags enables examination of pending
2362 # data without consuming it.
2363
2364 # Receive part of data with MSG_PEEK.
2365 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2366 len(MSG) - 3, 0,
2367 socket.MSG_PEEK)
2368 self.assertEqual(msg, MSG[:-3])
2369 self.checkRecvmsgAddress(addr, self.cli_addr)
2370 self.assertEqual(ancdata, [])
2371 # Ignoring MSG_TRUNC here (so this test is the same for stream
2372 # and datagram sockets). Some wording in POSIX seems to
2373 # suggest that it needn't be set when peeking, but that may
2374 # just be a slip.
2375 self.checkFlags(flags, eor=False,
2376 ignore=getattr(socket, "MSG_TRUNC", 0))
2377
2378 # Receive all data with MSG_PEEK.
2379 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2380 len(MSG), 0,
2381 socket.MSG_PEEK)
2382 self.assertEqual(msg, MSG)
2383 self.checkRecvmsgAddress(addr, self.cli_addr)
2384 self.assertEqual(ancdata, [])
2385 self.checkFlags(flags, eor=True)
2386
2387 # Check that the same data can still be received normally.
2388 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2389 self.assertEqual(msg, MSG)
2390 self.checkRecvmsgAddress(addr, self.cli_addr)
2391 self.assertEqual(ancdata, [])
2392 self.checkFlags(flags, eor=True)
2393
2394 @testRecvmsgPeek.client_skip
2395 def _testRecvmsgPeek(self):
2396 self.sendToServer(MSG)
2397
2398 @requireAttrs(socket.socket, "sendmsg")
2399 def testRecvmsgFromSendmsg(self):
2400 # Test receiving with recvmsg[_into]() when message is sent
2401 # using sendmsg().
2402 self.serv_sock.settimeout(self.fail_timeout)
2403 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2404 self.assertEqual(msg, MSG)
2405 self.checkRecvmsgAddress(addr, self.cli_addr)
2406 self.assertEqual(ancdata, [])
2407 self.checkFlags(flags, eor=True)
2408
2409 @testRecvmsgFromSendmsg.client_skip
2410 def _testRecvmsgFromSendmsg(self):
2411 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2412
2413
2414class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2415 # Tests which require a stream socket and can use either recvmsg()
2416 # or recvmsg_into().
2417
2418 def testRecvmsgEOF(self):
2419 # Receive end-of-stream indicator (b"", peer socket closed).
2420 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2421 self.assertEqual(msg, b"")
2422 self.checkRecvmsgAddress(addr, self.cli_addr)
2423 self.assertEqual(ancdata, [])
2424 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2425
2426 def _testRecvmsgEOF(self):
2427 self.cli_sock.close()
2428
2429 def testRecvmsgOverflow(self):
2430 # Receive a message in more than one chunk.
2431 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2432 len(MSG) - 3)
2433 self.checkRecvmsgAddress(addr, self.cli_addr)
2434 self.assertEqual(ancdata, [])
2435 self.checkFlags(flags, eor=False)
2436
2437 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2438 self.checkRecvmsgAddress(addr, self.cli_addr)
2439 self.assertEqual(ancdata, [])
2440 self.checkFlags(flags, eor=True)
2441
2442 msg = seg1 + seg2
2443 self.assertEqual(msg, MSG)
2444
2445 def _testRecvmsgOverflow(self):
2446 self.sendToServer(MSG)
2447
2448
2449class RecvmsgTests(RecvmsgGenericTests):
2450 # Tests for recvmsg() which can use any socket type.
2451
2452 def testRecvmsgBadArgs(self):
2453 # Check that recvmsg() rejects invalid arguments.
2454 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2455 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2456 -1, 0, 0)
2457 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2458 len(MSG), -1, 0)
2459 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2460 [bytearray(10)], 0, 0)
2461 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2462 object(), 0, 0)
2463 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2464 len(MSG), object(), 0)
2465 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2466 len(MSG), 0, object())
2467
2468 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2469 self.assertEqual(msg, MSG)
2470 self.checkRecvmsgAddress(addr, self.cli_addr)
2471 self.assertEqual(ancdata, [])
2472 self.checkFlags(flags, eor=True)
2473
2474 def _testRecvmsgBadArgs(self):
2475 self.sendToServer(MSG)
2476
2477
2478class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2479 # Tests for recvmsg_into() which can use any socket type.
2480
2481 def testRecvmsgIntoBadArgs(self):
2482 # Check that recvmsg_into() rejects invalid arguments.
2483 buf = bytearray(len(MSG))
2484 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2485 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2486 len(MSG), 0, 0)
2487 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2488 buf, 0, 0)
2489 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2490 [object()], 0, 0)
2491 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2492 [b"I'm not writable"], 0, 0)
2493 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2494 [buf, object()], 0, 0)
2495 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2496 [buf], -1, 0)
2497 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2498 [buf], object(), 0)
2499 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2500 [buf], 0, object())
2501
2502 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2503 self.assertEqual(nbytes, len(MSG))
2504 self.assertEqual(buf, bytearray(MSG))
2505 self.checkRecvmsgAddress(addr, self.cli_addr)
2506 self.assertEqual(ancdata, [])
2507 self.checkFlags(flags, eor=True)
2508
2509 def _testRecvmsgIntoBadArgs(self):
2510 self.sendToServer(MSG)
2511
2512 def testRecvmsgIntoGenerator(self):
2513 # Receive into buffer obtained from a generator (not a sequence).
2514 buf = bytearray(len(MSG))
2515 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2516 (o for o in [buf]))
2517 self.assertEqual(nbytes, len(MSG))
2518 self.assertEqual(buf, bytearray(MSG))
2519 self.checkRecvmsgAddress(addr, self.cli_addr)
2520 self.assertEqual(ancdata, [])
2521 self.checkFlags(flags, eor=True)
2522
2523 def _testRecvmsgIntoGenerator(self):
2524 self.sendToServer(MSG)
2525
2526 def testRecvmsgIntoArray(self):
2527 # Receive into an array rather than the usual bytearray.
2528 buf = array.array("B", [0] * len(MSG))
2529 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2530 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002531 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002532 self.checkRecvmsgAddress(addr, self.cli_addr)
2533 self.assertEqual(ancdata, [])
2534 self.checkFlags(flags, eor=True)
2535
2536 def _testRecvmsgIntoArray(self):
2537 self.sendToServer(MSG)
2538
2539 def testRecvmsgIntoScatter(self):
2540 # Receive into multiple buffers (scatter write).
2541 b1 = bytearray(b"----")
2542 b2 = bytearray(b"0123456789")
2543 b3 = bytearray(b"--------------")
2544 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2545 [b1, memoryview(b2)[2:9], b3])
2546 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2547 self.assertEqual(b1, bytearray(b"Mary"))
2548 self.assertEqual(b2, bytearray(b"01 had a 9"))
2549 self.assertEqual(b3, bytearray(b"little lamb---"))
2550 self.checkRecvmsgAddress(addr, self.cli_addr)
2551 self.assertEqual(ancdata, [])
2552 self.checkFlags(flags, eor=True)
2553
2554 def _testRecvmsgIntoScatter(self):
2555 self.sendToServer(b"Mary had a little lamb")
2556
2557
2558class CmsgMacroTests(unittest.TestCase):
2559 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2560 # assumptions used by sendmsg() and recvmsg[_into](), which share
2561 # code with these functions.
2562
2563 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002564 try:
2565 import _testcapi
2566 except ImportError:
2567 socklen_t_limit = 0x7fffffff
2568 else:
2569 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002570
2571 @requireAttrs(socket, "CMSG_LEN")
2572 def testCMSG_LEN(self):
2573 # Test CMSG_LEN() with various valid and invalid values,
2574 # checking the assumptions used by recvmsg() and sendmsg().
2575 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2576 values = list(range(257)) + list(range(toobig - 257, toobig))
2577
2578 # struct cmsghdr has at least three members, two of which are ints
2579 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2580 for n in values:
2581 ret = socket.CMSG_LEN(n)
2582 # This is how recvmsg() calculates the data size
2583 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2584 self.assertLessEqual(ret, self.socklen_t_limit)
2585
2586 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2587 # sendmsg() shares code with these functions, and requires
2588 # that it reject values over the limit.
2589 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2590 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2591
2592 @requireAttrs(socket, "CMSG_SPACE")
2593 def testCMSG_SPACE(self):
2594 # Test CMSG_SPACE() with various valid and invalid values,
2595 # checking the assumptions used by sendmsg().
2596 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2597 values = list(range(257)) + list(range(toobig - 257, toobig))
2598
2599 last = socket.CMSG_SPACE(0)
2600 # struct cmsghdr has at least three members, two of which are ints
2601 self.assertGreater(last, array.array("i").itemsize * 2)
2602 for n in values:
2603 ret = socket.CMSG_SPACE(n)
2604 self.assertGreaterEqual(ret, last)
2605 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2606 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2607 self.assertLessEqual(ret, self.socklen_t_limit)
2608 last = ret
2609
2610 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2611 # sendmsg() shares code with these functions, and requires
2612 # that it reject values over the limit.
2613 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2614 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2615
2616
2617class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2618 # Tests for file descriptor passing on Unix-domain sockets.
2619
2620 # Invalid file descriptor value that's unlikely to evaluate to a
2621 # real FD even if one of its bytes is replaced with a different
2622 # value (which shouldn't actually happen).
2623 badfd = -0x5555
2624
2625 def newFDs(self, n):
2626 # Return a list of n file descriptors for newly-created files
2627 # containing their list indices as ASCII numbers.
2628 fds = []
2629 for i in range(n):
2630 fd, path = tempfile.mkstemp()
2631 self.addCleanup(os.unlink, path)
2632 self.addCleanup(os.close, fd)
2633 os.write(fd, str(i).encode())
2634 fds.append(fd)
2635 return fds
2636
2637 def checkFDs(self, fds):
2638 # Check that the file descriptors in the given list contain
2639 # their correct list indices as ASCII numbers.
2640 for n, fd in enumerate(fds):
2641 os.lseek(fd, 0, os.SEEK_SET)
2642 self.assertEqual(os.read(fd, 1024), str(n).encode())
2643
2644 def registerRecvmsgResult(self, result):
2645 self.addCleanup(self.closeRecvmsgFDs, result)
2646
2647 def closeRecvmsgFDs(self, recvmsg_result):
2648 # Close all file descriptors specified in the ancillary data
2649 # of the given return value from recvmsg() or recvmsg_into().
2650 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2651 if (cmsg_level == socket.SOL_SOCKET and
2652 cmsg_type == socket.SCM_RIGHTS):
2653 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002654 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002655 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2656 for fd in fds:
2657 os.close(fd)
2658
2659 def createAndSendFDs(self, n):
2660 # Send n new file descriptors created by newFDs() to the
2661 # server, with the constant MSG as the non-ancillary data.
2662 self.assertEqual(
2663 self.sendmsgToServer([MSG],
2664 [(socket.SOL_SOCKET,
2665 socket.SCM_RIGHTS,
2666 array.array("i", self.newFDs(n)))]),
2667 len(MSG))
2668
2669 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2670 # Check that constant MSG was received with numfds file
2671 # descriptors in a maximum of maxcmsgs control messages (which
2672 # must contain only complete integers). By default, check
2673 # that MSG_CTRUNC is unset, but ignore any flags in
2674 # ignoreflags.
2675 msg, ancdata, flags, addr = result
2676 self.assertEqual(msg, MSG)
2677 self.checkRecvmsgAddress(addr, self.cli_addr)
2678 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2679 ignore=ignoreflags)
2680
2681 self.assertIsInstance(ancdata, list)
2682 self.assertLessEqual(len(ancdata), maxcmsgs)
2683 fds = array.array("i")
2684 for item in ancdata:
2685 self.assertIsInstance(item, tuple)
2686 cmsg_level, cmsg_type, cmsg_data = item
2687 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2688 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2689 self.assertIsInstance(cmsg_data, bytes)
2690 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002691 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002692
2693 self.assertEqual(len(fds), numfds)
2694 self.checkFDs(fds)
2695
2696 def testFDPassSimple(self):
2697 # Pass a single FD (array read from bytes object).
2698 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2699 len(MSG), 10240))
2700
2701 def _testFDPassSimple(self):
2702 self.assertEqual(
2703 self.sendmsgToServer(
2704 [MSG],
2705 [(socket.SOL_SOCKET,
2706 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002707 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002708 len(MSG))
2709
2710 def testMultipleFDPass(self):
2711 # Pass multiple FDs in a single array.
2712 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2713 len(MSG), 10240))
2714
2715 def _testMultipleFDPass(self):
2716 self.createAndSendFDs(4)
2717
2718 @requireAttrs(socket, "CMSG_SPACE")
2719 def testFDPassCMSG_SPACE(self):
2720 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2721 self.checkRecvmsgFDs(
2722 4, self.doRecvmsg(self.serv_sock, len(MSG),
2723 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2724
2725 @testFDPassCMSG_SPACE.client_skip
2726 def _testFDPassCMSG_SPACE(self):
2727 self.createAndSendFDs(4)
2728
2729 def testFDPassCMSG_LEN(self):
2730 # Test using CMSG_LEN() to calculate ancillary buffer size.
2731 self.checkRecvmsgFDs(1,
2732 self.doRecvmsg(self.serv_sock, len(MSG),
2733 socket.CMSG_LEN(4 * SIZEOF_INT)),
2734 # RFC 3542 says implementations may set
2735 # MSG_CTRUNC if there isn't enough space
2736 # for trailing padding.
2737 ignoreflags=socket.MSG_CTRUNC)
2738
2739 def _testFDPassCMSG_LEN(self):
2740 self.createAndSendFDs(1)
2741
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002742 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002743 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002744 @requireAttrs(socket, "CMSG_SPACE")
2745 def testFDPassSeparate(self):
2746 # Pass two FDs in two separate arrays. Arrays may be combined
2747 # into a single control message by the OS.
2748 self.checkRecvmsgFDs(2,
2749 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2750 maxcmsgs=2)
2751
2752 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002753 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002754 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002755 def _testFDPassSeparate(self):
2756 fd0, fd1 = self.newFDs(2)
2757 self.assertEqual(
2758 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2759 socket.SCM_RIGHTS,
2760 array.array("i", [fd0])),
2761 (socket.SOL_SOCKET,
2762 socket.SCM_RIGHTS,
2763 array.array("i", [fd1]))]),
2764 len(MSG))
2765
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002766 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002767 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002768 @requireAttrs(socket, "CMSG_SPACE")
2769 def testFDPassSeparateMinSpace(self):
2770 # Pass two FDs in two separate arrays, receiving them into the
2771 # minimum space for two arrays.
2772 self.checkRecvmsgFDs(2,
2773 self.doRecvmsg(self.serv_sock, len(MSG),
2774 socket.CMSG_SPACE(SIZEOF_INT) +
2775 socket.CMSG_LEN(SIZEOF_INT)),
2776 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2777
2778 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002779 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002780 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002781 def _testFDPassSeparateMinSpace(self):
2782 fd0, fd1 = self.newFDs(2)
2783 self.assertEqual(
2784 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2785 socket.SCM_RIGHTS,
2786 array.array("i", [fd0])),
2787 (socket.SOL_SOCKET,
2788 socket.SCM_RIGHTS,
2789 array.array("i", [fd1]))]),
2790 len(MSG))
2791
2792 def sendAncillaryIfPossible(self, msg, ancdata):
2793 # Try to send msg and ancdata to server, but if the system
2794 # call fails, just send msg with no ancillary data.
2795 try:
2796 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002797 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002798 # Check that it was the system call that failed
2799 self.assertIsInstance(e.errno, int)
2800 nbytes = self.sendmsgToServer([msg])
2801 self.assertEqual(nbytes, len(msg))
2802
2803 def testFDPassEmpty(self):
2804 # Try to pass an empty FD array. Can receive either no array
2805 # or an empty array.
2806 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2807 len(MSG), 10240),
2808 ignoreflags=socket.MSG_CTRUNC)
2809
2810 def _testFDPassEmpty(self):
2811 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2812 socket.SCM_RIGHTS,
2813 b"")])
2814
2815 def testFDPassPartialInt(self):
2816 # Try to pass a truncated FD array.
2817 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2818 len(MSG), 10240)
2819 self.assertEqual(msg, MSG)
2820 self.checkRecvmsgAddress(addr, self.cli_addr)
2821 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2822 self.assertLessEqual(len(ancdata), 1)
2823 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2824 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2825 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2826 self.assertLess(len(cmsg_data), SIZEOF_INT)
2827
2828 def _testFDPassPartialInt(self):
2829 self.sendAncillaryIfPossible(
2830 MSG,
2831 [(socket.SOL_SOCKET,
2832 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002833 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002834
2835 @requireAttrs(socket, "CMSG_SPACE")
2836 def testFDPassPartialIntInMiddle(self):
2837 # Try to pass two FD arrays, the first of which is truncated.
2838 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2839 len(MSG), 10240)
2840 self.assertEqual(msg, MSG)
2841 self.checkRecvmsgAddress(addr, self.cli_addr)
2842 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2843 self.assertLessEqual(len(ancdata), 2)
2844 fds = array.array("i")
2845 # Arrays may have been combined in a single control message
2846 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2847 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2848 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002849 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002850 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2851 self.assertLessEqual(len(fds), 2)
2852 self.checkFDs(fds)
2853
2854 @testFDPassPartialIntInMiddle.client_skip
2855 def _testFDPassPartialIntInMiddle(self):
2856 fd0, fd1 = self.newFDs(2)
2857 self.sendAncillaryIfPossible(
2858 MSG,
2859 [(socket.SOL_SOCKET,
2860 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002861 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002862 (socket.SOL_SOCKET,
2863 socket.SCM_RIGHTS,
2864 array.array("i", [fd1]))])
2865
2866 def checkTruncatedHeader(self, result, ignoreflags=0):
2867 # Check that no ancillary data items are returned when data is
2868 # truncated inside the cmsghdr structure.
2869 msg, ancdata, flags, addr = result
2870 self.assertEqual(msg, MSG)
2871 self.checkRecvmsgAddress(addr, self.cli_addr)
2872 self.assertEqual(ancdata, [])
2873 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2874 ignore=ignoreflags)
2875
2876 def testCmsgTruncNoBufSize(self):
2877 # Check that no ancillary data is received when no buffer size
2878 # is specified.
2879 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2880 # BSD seems to set MSG_CTRUNC only
2881 # if an item has been partially
2882 # received.
2883 ignoreflags=socket.MSG_CTRUNC)
2884
2885 def _testCmsgTruncNoBufSize(self):
2886 self.createAndSendFDs(1)
2887
2888 def testCmsgTrunc0(self):
2889 # Check that no ancillary data is received when buffer size is 0.
2890 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2891 ignoreflags=socket.MSG_CTRUNC)
2892
2893 def _testCmsgTrunc0(self):
2894 self.createAndSendFDs(1)
2895
2896 # Check that no ancillary data is returned for various non-zero
2897 # (but still too small) buffer sizes.
2898
2899 def testCmsgTrunc1(self):
2900 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2901
2902 def _testCmsgTrunc1(self):
2903 self.createAndSendFDs(1)
2904
2905 def testCmsgTrunc2Int(self):
2906 # The cmsghdr structure has at least three members, two of
2907 # which are ints, so we still shouldn't see any ancillary
2908 # data.
2909 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2910 SIZEOF_INT * 2))
2911
2912 def _testCmsgTrunc2Int(self):
2913 self.createAndSendFDs(1)
2914
2915 def testCmsgTruncLen0Minus1(self):
2916 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2917 socket.CMSG_LEN(0) - 1))
2918
2919 def _testCmsgTruncLen0Minus1(self):
2920 self.createAndSendFDs(1)
2921
2922 # The following tests try to truncate the control message in the
2923 # middle of the FD array.
2924
2925 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2926 # Check that file descriptor data is truncated to between
2927 # mindata and maxdata bytes when received with buffer size
2928 # ancbuf, and that any complete file descriptor numbers are
2929 # valid.
2930 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2931 len(MSG), ancbuf)
2932 self.assertEqual(msg, MSG)
2933 self.checkRecvmsgAddress(addr, self.cli_addr)
2934 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2935
2936 if mindata == 0 and ancdata == []:
2937 return
2938 self.assertEqual(len(ancdata), 1)
2939 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2940 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2941 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2942 self.assertGreaterEqual(len(cmsg_data), mindata)
2943 self.assertLessEqual(len(cmsg_data), maxdata)
2944 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002945 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002946 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2947 self.checkFDs(fds)
2948
2949 def testCmsgTruncLen0(self):
2950 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2951
2952 def _testCmsgTruncLen0(self):
2953 self.createAndSendFDs(1)
2954
2955 def testCmsgTruncLen0Plus1(self):
2956 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2957
2958 def _testCmsgTruncLen0Plus1(self):
2959 self.createAndSendFDs(2)
2960
2961 def testCmsgTruncLen1(self):
2962 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2963 maxdata=SIZEOF_INT)
2964
2965 def _testCmsgTruncLen1(self):
2966 self.createAndSendFDs(2)
2967
2968 def testCmsgTruncLen2Minus1(self):
2969 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2970 maxdata=(2 * SIZEOF_INT) - 1)
2971
2972 def _testCmsgTruncLen2Minus1(self):
2973 self.createAndSendFDs(2)
2974
2975
2976class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2977 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2978 # features of the RFC 3542 Advanced Sockets API for IPv6.
2979 # Currently we can only handle certain data items (e.g. traffic
2980 # class, hop limit, MTU discovery and fragmentation settings)
2981 # without resorting to unportable means such as the struct module,
2982 # but the tests here are aimed at testing the ancillary data
2983 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2984 # itself.
2985
2986 # Test value to use when setting hop limit of packet
2987 hop_limit = 2
2988
2989 # Test value to use when setting traffic class of packet.
2990 # -1 means "use kernel default".
2991 traffic_class = -1
2992
2993 def ancillaryMapping(self, ancdata):
2994 # Given ancillary data list ancdata, return a mapping from
2995 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2996 # Check that no (level, type) pair appears more than once.
2997 d = {}
2998 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2999 self.assertNotIn((cmsg_level, cmsg_type), d)
3000 d[(cmsg_level, cmsg_type)] = cmsg_data
3001 return d
3002
3003 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3004 # Receive hop limit into ancbufsize bytes of ancillary data
3005 # space. Check that data is MSG, ancillary data is not
3006 # truncated (but ignore any flags in ignoreflags), and hop
3007 # limit is between 0 and maxhop inclusive.
3008 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3009 socket.IPV6_RECVHOPLIMIT, 1)
3010 self.misc_event.set()
3011 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3012 len(MSG), ancbufsize)
3013
3014 self.assertEqual(msg, MSG)
3015 self.checkRecvmsgAddress(addr, self.cli_addr)
3016 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3017 ignore=ignoreflags)
3018
3019 self.assertEqual(len(ancdata), 1)
3020 self.assertIsInstance(ancdata[0], tuple)
3021 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3022 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3023 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3024 self.assertIsInstance(cmsg_data, bytes)
3025 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3026 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003027 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003028 self.assertGreaterEqual(a[0], 0)
3029 self.assertLessEqual(a[0], maxhop)
3030
3031 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3032 def testRecvHopLimit(self):
3033 # Test receiving the packet hop limit as ancillary data.
3034 self.checkHopLimit(ancbufsize=10240)
3035
3036 @testRecvHopLimit.client_skip
3037 def _testRecvHopLimit(self):
3038 # Need to wait until server has asked to receive ancillary
3039 # data, as implementations are not required to buffer it
3040 # otherwise.
3041 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3042 self.sendToServer(MSG)
3043
3044 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3045 def testRecvHopLimitCMSG_SPACE(self):
3046 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3047 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3048
3049 @testRecvHopLimitCMSG_SPACE.client_skip
3050 def _testRecvHopLimitCMSG_SPACE(self):
3051 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3052 self.sendToServer(MSG)
3053
3054 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3055 # 3542 says portable applications must provide space for trailing
3056 # padding. Implementations may set MSG_CTRUNC if there isn't
3057 # enough space for the padding.
3058
3059 @requireAttrs(socket.socket, "sendmsg")
3060 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3061 def testSetHopLimit(self):
3062 # Test setting hop limit on outgoing packet and receiving it
3063 # at the other end.
3064 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3065
3066 @testSetHopLimit.client_skip
3067 def _testSetHopLimit(self):
3068 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3069 self.assertEqual(
3070 self.sendmsgToServer([MSG],
3071 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3072 array.array("i", [self.hop_limit]))]),
3073 len(MSG))
3074
3075 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3076 ignoreflags=0):
3077 # Receive traffic class and hop limit into ancbufsize bytes of
3078 # ancillary data space. Check that data is MSG, ancillary
3079 # data is not truncated (but ignore any flags in ignoreflags),
3080 # and traffic class and hop limit are in range (hop limit no
3081 # more than maxhop).
3082 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3083 socket.IPV6_RECVHOPLIMIT, 1)
3084 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3085 socket.IPV6_RECVTCLASS, 1)
3086 self.misc_event.set()
3087 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3088 len(MSG), ancbufsize)
3089
3090 self.assertEqual(msg, MSG)
3091 self.checkRecvmsgAddress(addr, self.cli_addr)
3092 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3093 ignore=ignoreflags)
3094 self.assertEqual(len(ancdata), 2)
3095 ancmap = self.ancillaryMapping(ancdata)
3096
3097 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3098 self.assertEqual(len(tcdata), SIZEOF_INT)
3099 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003100 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003101 self.assertGreaterEqual(a[0], 0)
3102 self.assertLessEqual(a[0], 255)
3103
3104 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3105 self.assertEqual(len(hldata), SIZEOF_INT)
3106 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003107 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003108 self.assertGreaterEqual(a[0], 0)
3109 self.assertLessEqual(a[0], maxhop)
3110
3111 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3112 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3113 def testRecvTrafficClassAndHopLimit(self):
3114 # Test receiving traffic class and hop limit as ancillary data.
3115 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3116
3117 @testRecvTrafficClassAndHopLimit.client_skip
3118 def _testRecvTrafficClassAndHopLimit(self):
3119 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3120 self.sendToServer(MSG)
3121
3122 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3123 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3124 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3125 # Test receiving traffic class and hop limit, using
3126 # CMSG_SPACE() to calculate buffer size.
3127 self.checkTrafficClassAndHopLimit(
3128 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3129
3130 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3131 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3132 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3133 self.sendToServer(MSG)
3134
3135 @requireAttrs(socket.socket, "sendmsg")
3136 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3137 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3138 def testSetTrafficClassAndHopLimit(self):
3139 # Test setting traffic class and hop limit on outgoing packet,
3140 # and receiving them at the other end.
3141 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3142 maxhop=self.hop_limit)
3143
3144 @testSetTrafficClassAndHopLimit.client_skip
3145 def _testSetTrafficClassAndHopLimit(self):
3146 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3147 self.assertEqual(
3148 self.sendmsgToServer([MSG],
3149 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3150 array.array("i", [self.traffic_class])),
3151 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3152 array.array("i", [self.hop_limit]))]),
3153 len(MSG))
3154
3155 @requireAttrs(socket.socket, "sendmsg")
3156 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3157 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3158 def testOddCmsgSize(self):
3159 # Try to send ancillary data with first item one byte too
3160 # long. Fall back to sending with correct size if this fails,
3161 # and check that second item was handled correctly.
3162 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3163 maxhop=self.hop_limit)
3164
3165 @testOddCmsgSize.client_skip
3166 def _testOddCmsgSize(self):
3167 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3168 try:
3169 nbytes = self.sendmsgToServer(
3170 [MSG],
3171 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003172 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003173 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3174 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003175 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003176 self.assertIsInstance(e.errno, int)
3177 nbytes = self.sendmsgToServer(
3178 [MSG],
3179 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3180 array.array("i", [self.traffic_class])),
3181 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3182 array.array("i", [self.hop_limit]))])
3183 self.assertEqual(nbytes, len(MSG))
3184
3185 # Tests for proper handling of truncated ancillary data
3186
3187 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3188 # Receive hop limit into ancbufsize bytes of ancillary data
3189 # space, which should be too small to contain the ancillary
3190 # data header (if ancbufsize is None, pass no second argument
3191 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3192 # (unless included in ignoreflags), and no ancillary data is
3193 # returned.
3194 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3195 socket.IPV6_RECVHOPLIMIT, 1)
3196 self.misc_event.set()
3197 args = () if ancbufsize is None else (ancbufsize,)
3198 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3199 len(MSG), *args)
3200
3201 self.assertEqual(msg, MSG)
3202 self.checkRecvmsgAddress(addr, self.cli_addr)
3203 self.assertEqual(ancdata, [])
3204 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3205 ignore=ignoreflags)
3206
3207 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3208 def testCmsgTruncNoBufSize(self):
3209 # Check that no ancillary data is received when no ancillary
3210 # buffer size is provided.
3211 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3212 # BSD seems to set
3213 # MSG_CTRUNC only if an item
3214 # has been partially
3215 # received.
3216 ignoreflags=socket.MSG_CTRUNC)
3217
3218 @testCmsgTruncNoBufSize.client_skip
3219 def _testCmsgTruncNoBufSize(self):
3220 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3221 self.sendToServer(MSG)
3222
3223 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3224 def testSingleCmsgTrunc0(self):
3225 # Check that no ancillary data is received when ancillary
3226 # buffer size is zero.
3227 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3228 ignoreflags=socket.MSG_CTRUNC)
3229
3230 @testSingleCmsgTrunc0.client_skip
3231 def _testSingleCmsgTrunc0(self):
3232 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3233 self.sendToServer(MSG)
3234
3235 # Check that no ancillary data is returned for various non-zero
3236 # (but still too small) buffer sizes.
3237
3238 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3239 def testSingleCmsgTrunc1(self):
3240 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3241
3242 @testSingleCmsgTrunc1.client_skip
3243 def _testSingleCmsgTrunc1(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 testSingleCmsgTrunc2Int(self):
3249 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3250
3251 @testSingleCmsgTrunc2Int.client_skip
3252 def _testSingleCmsgTrunc2Int(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 testSingleCmsgTruncLen0Minus1(self):
3258 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3259
3260 @testSingleCmsgTruncLen0Minus1.client_skip
3261 def _testSingleCmsgTruncLen0Minus1(self):
3262 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3263 self.sendToServer(MSG)
3264
3265 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3266 def testSingleCmsgTruncInData(self):
3267 # Test truncation of a control message inside its associated
3268 # data. The message may be returned with its data truncated,
3269 # or not returned at all.
3270 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3271 socket.IPV6_RECVHOPLIMIT, 1)
3272 self.misc_event.set()
3273 msg, ancdata, flags, addr = self.doRecvmsg(
3274 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3275
3276 self.assertEqual(msg, MSG)
3277 self.checkRecvmsgAddress(addr, self.cli_addr)
3278 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3279
3280 self.assertLessEqual(len(ancdata), 1)
3281 if ancdata:
3282 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3283 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3284 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3285 self.assertLess(len(cmsg_data), SIZEOF_INT)
3286
3287 @testSingleCmsgTruncInData.client_skip
3288 def _testSingleCmsgTruncInData(self):
3289 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3290 self.sendToServer(MSG)
3291
3292 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3293 # Receive traffic class and hop limit into ancbufsize bytes of
3294 # ancillary data space, which should be large enough to
3295 # contain the first item, but too small to contain the header
3296 # of the second. Check that data is MSG, MSG_CTRUNC is set
3297 # (unless included in ignoreflags), and only one ancillary
3298 # data item is returned.
3299 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3300 socket.IPV6_RECVHOPLIMIT, 1)
3301 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3302 socket.IPV6_RECVTCLASS, 1)
3303 self.misc_event.set()
3304 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3305 len(MSG), ancbufsize)
3306
3307 self.assertEqual(msg, MSG)
3308 self.checkRecvmsgAddress(addr, self.cli_addr)
3309 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3310 ignore=ignoreflags)
3311
3312 self.assertEqual(len(ancdata), 1)
3313 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3314 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3315 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3316 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3317 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003318 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003319 self.assertGreaterEqual(a[0], 0)
3320 self.assertLessEqual(a[0], 255)
3321
3322 # Try the above test with various buffer sizes.
3323
3324 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3325 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3326 def testSecondCmsgTrunc0(self):
3327 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3328 ignoreflags=socket.MSG_CTRUNC)
3329
3330 @testSecondCmsgTrunc0.client_skip
3331 def _testSecondCmsgTrunc0(self):
3332 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3333 self.sendToServer(MSG)
3334
3335 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3336 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3337 def testSecondCmsgTrunc1(self):
3338 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3339
3340 @testSecondCmsgTrunc1.client_skip
3341 def _testSecondCmsgTrunc1(self):
3342 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3343 self.sendToServer(MSG)
3344
3345 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3346 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3347 def testSecondCmsgTrunc2Int(self):
3348 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3349 2 * SIZEOF_INT)
3350
3351 @testSecondCmsgTrunc2Int.client_skip
3352 def _testSecondCmsgTrunc2Int(self):
3353 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3354 self.sendToServer(MSG)
3355
3356 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3357 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3358 def testSecondCmsgTruncLen0Minus1(self):
3359 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3360 socket.CMSG_LEN(0) - 1)
3361
3362 @testSecondCmsgTruncLen0Minus1.client_skip
3363 def _testSecondCmsgTruncLen0Minus1(self):
3364 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3365 self.sendToServer(MSG)
3366
3367 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3368 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3369 def testSecomdCmsgTruncInData(self):
3370 # Test truncation of the second of two control messages inside
3371 # its associated data.
3372 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3373 socket.IPV6_RECVHOPLIMIT, 1)
3374 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3375 socket.IPV6_RECVTCLASS, 1)
3376 self.misc_event.set()
3377 msg, ancdata, flags, addr = self.doRecvmsg(
3378 self.serv_sock, len(MSG),
3379 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3380
3381 self.assertEqual(msg, MSG)
3382 self.checkRecvmsgAddress(addr, self.cli_addr)
3383 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3384
3385 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3386
3387 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3388 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3389 cmsg_types.remove(cmsg_type)
3390 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3391 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003392 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003393 self.assertGreaterEqual(a[0], 0)
3394 self.assertLessEqual(a[0], 255)
3395
3396 if ancdata:
3397 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3398 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3399 cmsg_types.remove(cmsg_type)
3400 self.assertLess(len(cmsg_data), SIZEOF_INT)
3401
3402 self.assertEqual(ancdata, [])
3403
3404 @testSecomdCmsgTruncInData.client_skip
3405 def _testSecomdCmsgTruncInData(self):
3406 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3407 self.sendToServer(MSG)
3408
3409
3410# Derive concrete test classes for different socket types.
3411
3412class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3413 SendrecvmsgConnectionlessBase,
3414 ThreadedSocketTestMixin, UDPTestBase):
3415 pass
3416
3417@requireAttrs(socket.socket, "sendmsg")
3418@unittest.skipUnless(thread, 'Threading required for this test.')
3419class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3420 pass
3421
3422@requireAttrs(socket.socket, "recvmsg")
3423@unittest.skipUnless(thread, 'Threading required for this test.')
3424class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3425 pass
3426
3427@requireAttrs(socket.socket, "recvmsg_into")
3428@unittest.skipUnless(thread, 'Threading required for this test.')
3429class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3430 pass
3431
3432
3433class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3434 SendrecvmsgConnectionlessBase,
3435 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003436
3437 def checkRecvmsgAddress(self, addr1, addr2):
3438 # Called to compare the received address with the address of
3439 # the peer, ignoring scope ID
3440 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003441
3442@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003443@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003444@requireSocket("AF_INET6", "SOCK_DGRAM")
3445@unittest.skipUnless(thread, 'Threading required for this test.')
3446class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3447 pass
3448
3449@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003450@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003451@requireSocket("AF_INET6", "SOCK_DGRAM")
3452@unittest.skipUnless(thread, 'Threading required for this test.')
3453class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3454 pass
3455
3456@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003457@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003458@requireSocket("AF_INET6", "SOCK_DGRAM")
3459@unittest.skipUnless(thread, 'Threading required for this test.')
3460class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3461 pass
3462
3463@requireAttrs(socket.socket, "recvmsg")
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 RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3469 SendrecvmsgUDP6TestBase):
3470 pass
3471
3472@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003473@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003474@requireAttrs(socket, "IPPROTO_IPV6")
3475@requireSocket("AF_INET6", "SOCK_DGRAM")
3476@unittest.skipUnless(thread, 'Threading required for this test.')
3477class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3478 RFC3542AncillaryTest,
3479 SendrecvmsgUDP6TestBase):
3480 pass
3481
3482
3483class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3484 ConnectedStreamTestMixin, TCPTestBase):
3485 pass
3486
3487@requireAttrs(socket.socket, "sendmsg")
3488@unittest.skipUnless(thread, 'Threading required for this test.')
3489class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3490 pass
3491
3492@requireAttrs(socket.socket, "recvmsg")
3493@unittest.skipUnless(thread, 'Threading required for this test.')
3494class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3495 SendrecvmsgTCPTestBase):
3496 pass
3497
3498@requireAttrs(socket.socket, "recvmsg_into")
3499@unittest.skipUnless(thread, 'Threading required for this test.')
3500class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3501 SendrecvmsgTCPTestBase):
3502 pass
3503
3504
3505class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3506 SendrecvmsgConnectedBase,
3507 ConnectedStreamTestMixin, SCTPStreamBase):
3508 pass
3509
3510@requireAttrs(socket.socket, "sendmsg")
3511@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3512@unittest.skipUnless(thread, 'Threading required for this test.')
3513class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3514 pass
3515
3516@requireAttrs(socket.socket, "recvmsg")
3517@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3518@unittest.skipUnless(thread, 'Threading required for this test.')
3519class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3520 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003521
3522 def testRecvmsgEOF(self):
3523 try:
3524 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3525 except OSError as e:
3526 if e.errno != errno.ENOTCONN:
3527 raise
3528 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003529
3530@requireAttrs(socket.socket, "recvmsg_into")
3531@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3532@unittest.skipUnless(thread, 'Threading required for this test.')
3533class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3534 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003535
3536 def testRecvmsgEOF(self):
3537 try:
3538 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3539 except OSError as e:
3540 if e.errno != errno.ENOTCONN:
3541 raise
3542 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003543
3544
3545class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3546 ConnectedStreamTestMixin, UnixStreamBase):
3547 pass
3548
3549@requireAttrs(socket.socket, "sendmsg")
3550@requireAttrs(socket, "AF_UNIX")
3551@unittest.skipUnless(thread, 'Threading required for this test.')
3552class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3553 pass
3554
3555@requireAttrs(socket.socket, "recvmsg")
3556@requireAttrs(socket, "AF_UNIX")
3557@unittest.skipUnless(thread, 'Threading required for this test.')
3558class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3559 SendrecvmsgUnixStreamTestBase):
3560 pass
3561
3562@requireAttrs(socket.socket, "recvmsg_into")
3563@requireAttrs(socket, "AF_UNIX")
3564@unittest.skipUnless(thread, 'Threading required for this test.')
3565class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3566 SendrecvmsgUnixStreamTestBase):
3567 pass
3568
3569@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3570@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3571@unittest.skipUnless(thread, 'Threading required for this test.')
3572class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3573 pass
3574
3575@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3576@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3577@unittest.skipUnless(thread, 'Threading required for this test.')
3578class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3579 SendrecvmsgUnixStreamTestBase):
3580 pass
3581
3582
3583# Test interrupting the interruptible send/receive methods with a
3584# signal when a timeout is set. These tests avoid having multiple
3585# threads alive during the test so that the OS cannot deliver the
3586# signal to the wrong one.
3587
3588class InterruptedTimeoutBase(unittest.TestCase):
3589 # Base class for interrupted send/receive tests. Installs an
3590 # empty handler for SIGALRM and removes it on teardown, along with
3591 # any scheduled alarms.
3592
3593 def setUp(self):
3594 super().setUp()
3595 orig_alrm_handler = signal.signal(signal.SIGALRM,
3596 lambda signum, frame: None)
3597 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3598 self.addCleanup(self.setAlarm, 0)
3599
3600 # Timeout for socket operations
3601 timeout = 4.0
3602
3603 # Provide setAlarm() method to schedule delivery of SIGALRM after
3604 # given number of seconds, or cancel it if zero, and an
3605 # appropriate time value to use. Use setitimer() if available.
3606 if hasattr(signal, "setitimer"):
3607 alarm_time = 0.05
3608
3609 def setAlarm(self, seconds):
3610 signal.setitimer(signal.ITIMER_REAL, seconds)
3611 else:
3612 # Old systems may deliver the alarm up to one second early
3613 alarm_time = 2
3614
3615 def setAlarm(self, seconds):
3616 signal.alarm(seconds)
3617
3618
3619# Require siginterrupt() in order to ensure that system calls are
3620# interrupted by default.
3621@requireAttrs(signal, "siginterrupt")
3622@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3623 "Don't have signal.alarm or signal.setitimer")
3624class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3625 # Test interrupting the recv*() methods with signals when a
3626 # timeout is set.
3627
3628 def setUp(self):
3629 super().setUp()
3630 self.serv.settimeout(self.timeout)
3631
3632 def checkInterruptedRecv(self, func, *args, **kwargs):
Andrew Svetlov0832af62012-12-18 23:10:48 +02003633 # Check that func(*args, **kwargs) raises OSError with an
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003634 # errno of EINTR when interrupted by a signal.
3635 self.setAlarm(self.alarm_time)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003636 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003637 func(*args, **kwargs)
3638 self.assertNotIsInstance(cm.exception, socket.timeout)
3639 self.assertEqual(cm.exception.errno, errno.EINTR)
3640
3641 def testInterruptedRecvTimeout(self):
3642 self.checkInterruptedRecv(self.serv.recv, 1024)
3643
3644 def testInterruptedRecvIntoTimeout(self):
3645 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3646
3647 def testInterruptedRecvfromTimeout(self):
3648 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3649
3650 def testInterruptedRecvfromIntoTimeout(self):
3651 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3652
3653 @requireAttrs(socket.socket, "recvmsg")
3654 def testInterruptedRecvmsgTimeout(self):
3655 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3656
3657 @requireAttrs(socket.socket, "recvmsg_into")
3658 def testInterruptedRecvmsgIntoTimeout(self):
3659 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3660
3661
3662# Require siginterrupt() in order to ensure that system calls are
3663# interrupted by default.
3664@requireAttrs(signal, "siginterrupt")
3665@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3666 "Don't have signal.alarm or signal.setitimer")
3667@unittest.skipUnless(thread, 'Threading required for this test.')
3668class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3669 ThreadSafeCleanupTestCase,
3670 SocketListeningTestMixin, TCPTestBase):
3671 # Test interrupting the interruptible send*() methods with signals
3672 # when a timeout is set.
3673
3674 def setUp(self):
3675 super().setUp()
3676 self.serv_conn = self.newSocket()
3677 self.addCleanup(self.serv_conn.close)
3678 # Use a thread to complete the connection, but wait for it to
3679 # terminate before running the test, so that there is only one
3680 # thread to accept the signal.
3681 cli_thread = threading.Thread(target=self.doConnect)
3682 cli_thread.start()
3683 self.cli_conn, addr = self.serv.accept()
3684 self.addCleanup(self.cli_conn.close)
3685 cli_thread.join()
3686 self.serv_conn.settimeout(self.timeout)
3687
3688 def doConnect(self):
3689 self.serv_conn.connect(self.serv_addr)
3690
3691 def checkInterruptedSend(self, func, *args, **kwargs):
3692 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003693 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003694 # signal.
Andrew Svetlov0832af62012-12-18 23:10:48 +02003695 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003696 while True:
3697 self.setAlarm(self.alarm_time)
3698 func(*args, **kwargs)
3699 self.assertNotIsInstance(cm.exception, socket.timeout)
3700 self.assertEqual(cm.exception.errno, errno.EINTR)
3701
Ned Deilyc5640382014-02-03 13:58:31 -08003702 # Issue #12958: The following tests have problems on OS X prior to 10.7
3703 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003704 def testInterruptedSendTimeout(self):
3705 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3706
Ned Deilyc5640382014-02-03 13:58:31 -08003707 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003708 def testInterruptedSendtoTimeout(self):
3709 # Passing an actual address here as Python's wrapper for
3710 # sendto() doesn't allow passing a zero-length one; POSIX
3711 # requires that the address is ignored since the socket is
3712 # connection-mode, however.
3713 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3714 self.serv_addr)
3715
Ned Deilyc5640382014-02-03 13:58:31 -08003716 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003717 @requireAttrs(socket.socket, "sendmsg")
3718 def testInterruptedSendmsgTimeout(self):
3719 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3720
3721
Victor Stinner45df8202010-04-28 22:31:17 +00003722@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003723class TCPCloserTest(ThreadedTCPSocketTest):
3724
3725 def testClose(self):
3726 conn, addr = self.serv.accept()
3727 conn.close()
3728
3729 sd = self.cli
3730 read, write, err = select.select([sd], [], [], 1.0)
3731 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003732 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003733
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003734 # Calling close() many times should be safe.
3735 conn.close()
3736 conn.close()
3737
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003738 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003739 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003740 time.sleep(1.0)
3741
Serhiy Storchaka43767632013-11-03 21:31:38 +02003742@unittest.skipUnless(hasattr(socket, 'socketpair'),
3743 'test needs socket.socketpair()')
Victor Stinner45df8202010-04-28 22:31:17 +00003744@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003745class BasicSocketPairTest(SocketPairTest):
3746
3747 def __init__(self, methodName='runTest'):
3748 SocketPairTest.__init__(self, methodName=methodName)
3749
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003750 def _check_defaults(self, sock):
3751 self.assertIsInstance(sock, socket.socket)
3752 if hasattr(socket, 'AF_UNIX'):
3753 self.assertEqual(sock.family, socket.AF_UNIX)
3754 else:
3755 self.assertEqual(sock.family, socket.AF_INET)
3756 self.assertEqual(sock.type, socket.SOCK_STREAM)
3757 self.assertEqual(sock.proto, 0)
3758
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003759 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003760 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003761
3762 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003763 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003764
Dave Cole331708b2004-08-09 04:51:41 +00003765 def testRecv(self):
3766 msg = self.serv.recv(1024)
3767 self.assertEqual(msg, MSG)
3768
3769 def _testRecv(self):
3770 self.cli.send(MSG)
3771
3772 def testSend(self):
3773 self.serv.send(MSG)
3774
3775 def _testSend(self):
3776 msg = self.cli.recv(1024)
3777 self.assertEqual(msg, MSG)
3778
Victor Stinner45df8202010-04-28 22:31:17 +00003779@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003780class NonBlockingTCPTests(ThreadedTCPSocketTest):
3781
3782 def __init__(self, methodName='runTest'):
3783 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3784
3785 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003786 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003787 self.serv.setblocking(True)
3788 self.assertIsNone(self.serv.gettimeout())
3789 self.serv.setblocking(False)
3790 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003791 start = time.time()
3792 try:
3793 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003794 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003795 pass
3796 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003797 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003798
3799 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003800 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003801
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003802 @support.cpython_only
3803 def testSetBlocking_overflow(self):
3804 # Issue 15989
3805 import _testcapi
3806 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3807 self.skipTest('needs UINT_MAX < ULONG_MAX')
3808 self.serv.setblocking(False)
3809 self.assertEqual(self.serv.gettimeout(), 0.0)
3810 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3811 self.assertIsNone(self.serv.gettimeout())
3812
3813 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3814
Serhiy Storchaka43767632013-11-03 21:31:38 +02003815 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3816 'test needs socket.SOCK_NONBLOCK')
3817 @support.requires_linux_version(2, 6, 28)
3818 def testInitNonBlocking(self):
3819 # reinit server socket
3820 self.serv.close()
3821 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3822 socket.SOCK_NONBLOCK)
3823 self.port = support.bind_port(self.serv)
3824 self.serv.listen(1)
3825 # actual testing
3826 start = time.time()
3827 try:
3828 self.serv.accept()
3829 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003830 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003831 end = time.time()
3832 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3833
3834 def _testInitNonBlocking(self):
3835 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003836
Antoine Pitrou600232b2011-01-05 21:03:42 +00003837 def testInheritFlags(self):
3838 # Issue #7995: when calling accept() on a listening socket with a
3839 # timeout, the resulting socket should not be non-blocking.
3840 self.serv.settimeout(10)
3841 try:
3842 conn, addr = self.serv.accept()
3843 message = conn.recv(len(MSG))
3844 finally:
3845 conn.close()
3846 self.serv.settimeout(None)
3847
3848 def _testInheritFlags(self):
3849 time.sleep(0.1)
3850 self.cli.connect((HOST, self.port))
3851 time.sleep(0.5)
3852 self.cli.send(MSG)
3853
Guido van Rossum24e4af82002-06-12 19:18:08 +00003854 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003855 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003856 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003857 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003858 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003859 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003860 pass
3861 else:
3862 self.fail("Error trying to do non-blocking accept.")
3863 read, write, err = select.select([self.serv], [], [])
3864 if self.serv in read:
3865 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003866 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003867 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003868 else:
3869 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003870
Guido van Rossum24e4af82002-06-12 19:18:08 +00003871 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003872 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003873 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003874
3875 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003876 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003877 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003878 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003879
3880 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003881 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003882 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003883
3884 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003885 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003886 conn, addr = self.serv.accept()
3887 conn.setblocking(0)
3888 try:
3889 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003890 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003891 pass
3892 else:
3893 self.fail("Error trying to do non-blocking recv.")
3894 read, write, err = select.select([conn], [], [])
3895 if conn in read:
3896 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003897 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003898 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003899 else:
3900 self.fail("Error during select call to non-blocking socket.")
3901
3902 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003903 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003904 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003905 self.cli.send(MSG)
3906
Victor Stinner45df8202010-04-28 22:31:17 +00003907@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003908class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003909 """Unit tests for the object returned by socket.makefile()
3910
Antoine Pitrou834bd812010-10-13 16:17:14 +00003911 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003912 the client connection. You can read from this file to
3913 get output from the server.
3914
Antoine Pitrou834bd812010-10-13 16:17:14 +00003915 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003916 server connection. You can write to this file to send output
3917 to the client.
3918 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003919
Guido van Rossume9f66142002-08-07 15:46:19 +00003920 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003921 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003922 errors = 'strict'
3923 newline = None
3924
3925 read_mode = 'rb'
3926 read_msg = MSG
3927 write_mode = 'wb'
3928 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003929
Guido van Rossum24e4af82002-06-12 19:18:08 +00003930 def __init__(self, methodName='runTest'):
3931 SocketConnectedTest.__init__(self, methodName=methodName)
3932
3933 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003934 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3935 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003936 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003937 self.read_file = self.cli_conn.makefile(
3938 self.read_mode, self.bufsize,
3939 encoding = self.encoding,
3940 errors = self.errors,
3941 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003942
3943 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003944 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945 self.read_file.close()
3946 self.assertTrue(self.read_file.closed)
3947 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003948 SocketConnectedTest.tearDown(self)
3949
3950 def clientSetUp(self):
3951 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003952 self.write_file = self.serv_conn.makefile(
3953 self.write_mode, self.bufsize,
3954 encoding = self.encoding,
3955 errors = self.errors,
3956 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003957
3958 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003959 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003960 self.write_file.close()
3961 self.assertTrue(self.write_file.closed)
3962 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003963 SocketConnectedTest.clientTearDown(self)
3964
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003965 def testReadAfterTimeout(self):
3966 # Issue #7322: A file object must disallow further reads
3967 # after a timeout has occurred.
3968 self.cli_conn.settimeout(1)
3969 self.read_file.read(3)
3970 # First read raises a timeout
3971 self.assertRaises(socket.timeout, self.read_file.read, 1)
3972 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003973 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003974 self.read_file.read(1)
3975 self.assertIn("cannot read from timed out object", str(ctx.exception))
3976
3977 def _testReadAfterTimeout(self):
3978 self.write_file.write(self.write_msg[0:3])
3979 self.write_file.flush()
3980 self.serv_finished.wait()
3981
Guido van Rossum24e4af82002-06-12 19:18:08 +00003982 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003983 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003984 first_seg = self.read_file.read(len(self.read_msg)-3)
3985 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003986 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003987 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003988
3989 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003990 self.write_file.write(self.write_msg)
3991 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003992
Guido van Rossum8c943832002-08-08 01:00:28 +00003993 def testFullRead(self):
3994 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003995 msg = self.read_file.read()
3996 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003997
3998 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003999 self.write_file.write(self.write_msg)
4000 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004001
Guido van Rossum24e4af82002-06-12 19:18:08 +00004002 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004003 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004004 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004005 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004006 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004007 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004008 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004009 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004010 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004011
4012 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004013 self.write_file.write(self.write_msg)
4014 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004015
4016 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004017 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004018 line = self.read_file.readline()
4019 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004020
4021 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004022 self.write_file.write(self.write_msg)
4023 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004024
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004025 def testCloseAfterMakefile(self):
4026 # The file returned by makefile should keep the socket open.
4027 self.cli_conn.close()
4028 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004029 msg = self.read_file.read()
4030 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004031
4032 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004033 self.write_file.write(self.write_msg)
4034 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004035
4036 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004037 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004038 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004039 if isinstance(self.read_msg, str):
4040 msg = msg.decode()
4041 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004042
4043 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004044 self.write_file.write(self.write_msg)
4045 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004046
Tim Peters116d83c2004-03-28 02:20:45 +00004047 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004048 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004049
4050 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004051 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004052
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004053 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004054 self.assertEqual(self.read_file.mode, self.read_mode)
4055 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004056
4057 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004058 self.assertEqual(self.write_file.mode, self.write_mode)
4059 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004060
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004061 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004062 self.read_file.close()
4063 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004064 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004065 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004066
4067 def _testRealClose(self):
4068 pass
4069
4070
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004071class FileObjectInterruptedTestCase(unittest.TestCase):
4072 """Test that the file object correctly handles EINTR internally."""
4073
4074 class MockSocket(object):
4075 def __init__(self, recv_funcs=()):
4076 # A generator that returns callables that we'll call for each
4077 # call to recv().
4078 self._recv_step = iter(recv_funcs)
4079
4080 def recv_into(self, buffer):
4081 data = next(self._recv_step)()
4082 assert len(buffer) >= len(data)
4083 buffer[:len(data)] = data
4084 return len(data)
4085
4086 def _decref_socketios(self):
4087 pass
4088
4089 def _textiowrap_for_test(self, buffering=-1):
4090 raw = socket.SocketIO(self, "r")
4091 if buffering < 0:
4092 buffering = io.DEFAULT_BUFFER_SIZE
4093 if buffering == 0:
4094 return raw
4095 buffer = io.BufferedReader(raw, buffering)
4096 text = io.TextIOWrapper(buffer, None, None)
4097 text.mode = "rb"
4098 return text
4099
4100 @staticmethod
4101 def _raise_eintr():
Andrew Svetlov0832af62012-12-18 23:10:48 +02004102 raise OSError(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004103
4104 def _textiowrap_mock_socket(self, mock, buffering=-1):
4105 raw = socket.SocketIO(mock, "r")
4106 if buffering < 0:
4107 buffering = io.DEFAULT_BUFFER_SIZE
4108 if buffering == 0:
4109 return raw
4110 buffer = io.BufferedReader(raw, buffering)
4111 text = io.TextIOWrapper(buffer, None, None)
4112 text.mode = "rb"
4113 return text
4114
4115 def _test_readline(self, size=-1, buffering=-1):
4116 mock_sock = self.MockSocket(recv_funcs=[
4117 lambda : b"This is the first line\nAnd the sec",
4118 self._raise_eintr,
4119 lambda : b"ond line is here\n",
4120 lambda : b"",
4121 lambda : b"", # XXX(gps): io library does an extra EOF read
4122 ])
4123 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004124 self.assertEqual(fo.readline(size), "This is the first line\n")
4125 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004126
4127 def _test_read(self, size=-1, buffering=-1):
4128 mock_sock = self.MockSocket(recv_funcs=[
4129 lambda : b"This is the first line\nAnd the sec",
4130 self._raise_eintr,
4131 lambda : b"ond line is here\n",
4132 lambda : b"",
4133 lambda : b"", # XXX(gps): io library does an extra EOF read
4134 ])
4135 expecting = (b"This is the first line\n"
4136 b"And the second line is here\n")
4137 fo = mock_sock._textiowrap_for_test(buffering=buffering)
4138 if buffering == 0:
4139 data = b''
4140 else:
4141 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004142 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004143 while len(data) != len(expecting):
4144 part = fo.read(size)
4145 if not part:
4146 break
4147 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00004148 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004149
4150 def test_default(self):
4151 self._test_readline()
4152 self._test_readline(size=100)
4153 self._test_read()
4154 self._test_read(size=100)
4155
4156 def test_with_1k_buffer(self):
4157 self._test_readline(buffering=1024)
4158 self._test_readline(size=100, buffering=1024)
4159 self._test_read(buffering=1024)
4160 self._test_read(size=100, buffering=1024)
4161
4162 def _test_readline_no_buffer(self, size=-1):
4163 mock_sock = self.MockSocket(recv_funcs=[
4164 lambda : b"a",
4165 lambda : b"\n",
4166 lambda : b"B",
4167 self._raise_eintr,
4168 lambda : b"b",
4169 lambda : b"",
4170 ])
4171 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004172 self.assertEqual(fo.readline(size), b"a\n")
4173 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004174
4175 def test_no_buffer(self):
4176 self._test_readline_no_buffer()
4177 self._test_readline_no_buffer(size=4)
4178 self._test_read(buffering=0)
4179 self._test_read(size=100, buffering=0)
4180
4181
Guido van Rossume9f66142002-08-07 15:46:19 +00004182class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4183
4184 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004185
Guido van Rossume9f66142002-08-07 15:46:19 +00004186 In this case (and in this case only), it should be possible to
4187 create a file object, read a line from it, create another file
4188 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004189 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004190 when reading multiple requests from the same socket."""
4191
4192 bufsize = 0 # Use unbuffered mode
4193
4194 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004195 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004196 line = self.read_file.readline() # first line
4197 self.assertEqual(line, b"A. " + self.write_msg) # first line
4198 self.read_file = self.cli_conn.makefile('rb', 0)
4199 line = self.read_file.readline() # second line
4200 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004201
4202 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004203 self.write_file.write(b"A. " + self.write_msg)
4204 self.write_file.write(b"B. " + self.write_msg)
4205 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004206
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004207 def testMakefileClose(self):
4208 # The file returned by makefile should keep the socket open...
4209 self.cli_conn.close()
4210 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004211 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004212 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004213 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004214 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004215
4216 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004217 self.write_file.write(self.write_msg)
4218 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004219
4220 def testMakefileCloseSocketDestroy(self):
4221 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004222 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004223 refcount_after = sys.getrefcount(self.cli_conn)
4224 self.assertEqual(refcount_before - 1, refcount_after)
4225
4226 def _testMakefileCloseSocketDestroy(self):
4227 pass
4228
Antoine Pitrou98b46702010-09-18 22:59:00 +00004229 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004230 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004231 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4232
4233 def testSmallReadNonBlocking(self):
4234 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004235 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4236 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004237 self.evt1.set()
4238 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004239 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004240 if first_seg is None:
4241 # Data not arrived (can happen under Windows), wait a bit
4242 time.sleep(0.5)
4243 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004244 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004245 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004246 self.assertEqual(n, 3)
4247 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004248 self.assertEqual(msg, self.read_msg)
4249 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4250 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004251
4252 def _testSmallReadNonBlocking(self):
4253 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004254 self.write_file.write(self.write_msg)
4255 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004256 self.evt2.set()
4257 # Avoid cloding the socket before the server test has finished,
4258 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4259 self.serv_finished.wait(5.0)
4260
4261 def testWriteNonBlocking(self):
4262 self.cli_finished.wait(5.0)
4263 # The client thread can't skip directly - the SkipTest exception
4264 # would appear as a failure.
4265 if self.serv_skipped:
4266 self.skipTest(self.serv_skipped)
4267
4268 def _testWriteNonBlocking(self):
4269 self.serv_skipped = None
4270 self.serv_conn.setblocking(False)
4271 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004272 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004273 LIMIT = 10
4274 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004275 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004276 self.assertGreater(n, 0)
4277 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004278 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004279 if n is None:
4280 # Succeeded
4281 break
4282 self.assertGreater(n, 0)
4283 else:
4284 # Let us know that this test didn't manage to establish
4285 # the expected conditions. This is not a failure in itself but,
4286 # if it happens repeatedly, the test should be fixed.
4287 self.serv_skipped = "failed to saturate the socket buffer"
4288
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004289
Guido van Rossum8c943832002-08-08 01:00:28 +00004290class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4291
4292 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4293
4294
4295class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4296
4297 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004298
Thomas Woutersb2137042007-02-01 18:02:27 +00004299
Antoine Pitrou834bd812010-10-13 16:17:14 +00004300class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4301 """Tests for socket.makefile() in text mode (rather than binary)"""
4302
4303 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004304 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004305 write_mode = 'wb'
4306 write_msg = MSG
4307 newline = ''
4308
4309
4310class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4311 """Tests for socket.makefile() in text mode (rather than binary)"""
4312
4313 read_mode = 'rb'
4314 read_msg = MSG
4315 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
4320class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4321 """Tests for socket.makefile() in text mode (rather than binary)"""
4322
4323 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004324 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004325 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004326 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004327 newline = ''
4328
4329
Guido van Rossumd8faa362007-04-27 19:54:29 +00004330class NetworkConnectionTest(object):
4331 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004332
Guido van Rossumd8faa362007-04-27 19:54:29 +00004333 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004334 # We're inherited below by BasicTCPTest2, which also inherits
4335 # BasicTCPTest, which defines self.port referenced below.
4336 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004337 self.serv_conn = self.cli
4338
4339class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4340 """Tests that NetworkConnection does not break existing TCP functionality.
4341 """
4342
4343class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004344
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004345 class MockSocket(socket.socket):
4346 def connect(self, *args):
4347 raise socket.timeout('timed out')
4348
4349 @contextlib.contextmanager
4350 def mocked_socket_module(self):
4351 """Return a socket which times out on connect"""
4352 old_socket = socket.socket
4353 socket.socket = self.MockSocket
4354 try:
4355 yield
4356 finally:
4357 socket.socket = old_socket
4358
4359 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004360 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004361 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004362 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004363 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004364 cli.connect((HOST, port))
4365 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4366
4367 def test_create_connection(self):
4368 # Issue #9792: errors raised by create_connection() should have
4369 # a proper errno attribute.
4370 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004371 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004372 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004373
4374 # Issue #16257: create_connection() calls getaddrinfo() against
4375 # 'localhost'. This may result in an IPV6 addr being returned
4376 # as well as an IPV4 one:
4377 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4378 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4379 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4380 #
4381 # create_connection() enumerates through all the addresses returned
4382 # and if it doesn't successfully bind to any of them, it propagates
4383 # the last exception it encountered.
4384 #
4385 # On Solaris, ENETUNREACH is returned in this circumstance instead
4386 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4387 # expected errnos.
4388 expected_errnos = [ errno.ECONNREFUSED, ]
4389 if hasattr(errno, 'ENETUNREACH'):
4390 expected_errnos.append(errno.ENETUNREACH)
4391
4392 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004393
4394 def test_create_connection_timeout(self):
4395 # Issue #9792: create_connection() should not recast timeout errors
4396 # as generic socket errors.
4397 with self.mocked_socket_module():
4398 with self.assertRaises(socket.timeout):
4399 socket.create_connection((HOST, 1234))
4400
Guido van Rossumd8faa362007-04-27 19:54:29 +00004401
Victor Stinner45df8202010-04-28 22:31:17 +00004402@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004403class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4404
4405 def __init__(self, methodName='runTest'):
4406 SocketTCPTest.__init__(self, methodName=methodName)
4407 ThreadableTest.__init__(self)
4408
4409 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004410 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004411
4412 def clientTearDown(self):
4413 self.cli.close()
4414 self.cli = None
4415 ThreadableTest.clientTearDown(self)
4416
4417 def _justAccept(self):
4418 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004419 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004420
4421 testFamily = _justAccept
4422 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004423 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004424 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004425 self.assertEqual(self.cli.family, 2)
4426
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004427 testSourceAddress = _justAccept
4428 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004429 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4430 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004431 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004432 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004433 # The port number being used is sufficient to show that the bind()
4434 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004435
Guido van Rossumd8faa362007-04-27 19:54:29 +00004436 testTimeoutDefault = _justAccept
4437 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004438 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004439 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004440 socket.setdefaulttimeout(42)
4441 try:
4442 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004443 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004444 finally:
4445 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004446 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004447
4448 testTimeoutNone = _justAccept
4449 def _testTimeoutNone(self):
4450 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004451 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004452 socket.setdefaulttimeout(30)
4453 try:
4454 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004455 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004456 finally:
4457 socket.setdefaulttimeout(None)
4458 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004459
4460 testTimeoutValueNamed = _justAccept
4461 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004462 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004463 self.assertEqual(self.cli.gettimeout(), 30)
4464
4465 testTimeoutValueNonamed = _justAccept
4466 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004467 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004468 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004469 self.assertEqual(self.cli.gettimeout(), 30)
4470
Victor Stinner45df8202010-04-28 22:31:17 +00004471@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004472class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4473
4474 def __init__(self, methodName='runTest'):
4475 SocketTCPTest.__init__(self, methodName=methodName)
4476 ThreadableTest.__init__(self)
4477
4478 def clientSetUp(self):
4479 pass
4480
4481 def clientTearDown(self):
4482 self.cli.close()
4483 self.cli = None
4484 ThreadableTest.clientTearDown(self)
4485
4486 def testInsideTimeout(self):
4487 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004488 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004489 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004490 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004491 testOutsideTimeout = testInsideTimeout
4492
4493 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004494 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004495 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004496 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004497
4498 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004499 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004500 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004501
4502
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004503class TCPTimeoutTest(SocketTCPTest):
4504
4505 def testTCPTimeout(self):
4506 def raise_timeout(*args, **kwargs):
4507 self.serv.settimeout(1.0)
4508 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004509 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004510 "Error generating a timeout exception (TCP)")
4511
4512 def testTimeoutZero(self):
4513 ok = False
4514 try:
4515 self.serv.settimeout(0.0)
4516 foo = self.serv.accept()
4517 except socket.timeout:
4518 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004519 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004520 ok = True
4521 except:
4522 self.fail("caught unexpected exception (TCP)")
4523 if not ok:
4524 self.fail("accept() returned success when we did not expect it")
4525
Serhiy Storchaka43767632013-11-03 21:31:38 +02004526 @unittest.skipUnless(hasattr(signal, 'alarm'),
4527 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004528 def testInterruptedTimeout(self):
4529 # XXX I don't know how to do this test on MSWindows or any other
4530 # plaform that doesn't support signal.alarm() or os.kill(), though
4531 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004532 self.serv.settimeout(5.0) # must be longer than alarm
4533 class Alarm(Exception):
4534 pass
4535 def alarm_handler(signal, frame):
4536 raise Alarm
4537 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4538 try:
4539 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4540 try:
4541 foo = self.serv.accept()
4542 except socket.timeout:
4543 self.fail("caught timeout instead of Alarm")
4544 except Alarm:
4545 pass
4546 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004547 self.fail("caught other exception instead of Alarm:"
4548 " %s(%s):\n%s" %
4549 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004550 else:
4551 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004552 finally:
4553 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004554 except Alarm:
4555 self.fail("got Alarm in wrong place")
4556 finally:
4557 # no alarm can be pending. Safe to restore old handler.
4558 signal.signal(signal.SIGALRM, old_alarm)
4559
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004560class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004561
4562 def testUDPTimeout(self):
4563 def raise_timeout(*args, **kwargs):
4564 self.serv.settimeout(1.0)
4565 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004566 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004567 "Error generating a timeout exception (UDP)")
4568
4569 def testTimeoutZero(self):
4570 ok = False
4571 try:
4572 self.serv.settimeout(0.0)
4573 foo = self.serv.recv(1024)
4574 except socket.timeout:
4575 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004576 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004577 ok = True
4578 except:
4579 self.fail("caught unexpected exception (UDP)")
4580 if not ok:
4581 self.fail("recv() returned success when we did not expect it")
4582
4583class TestExceptions(unittest.TestCase):
4584
4585 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004586 self.assertTrue(issubclass(OSError, Exception))
4587 self.assertTrue(issubclass(socket.herror, OSError))
4588 self.assertTrue(issubclass(socket.gaierror, OSError))
4589 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004590
Serhiy Storchaka43767632013-11-03 21:31:38 +02004591@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004592class TestLinuxAbstractNamespace(unittest.TestCase):
4593
4594 UNIX_PATH_MAX = 108
4595
4596 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004597 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004598 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4599 s1.bind(address)
4600 s1.listen(1)
4601 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4602 s2.connect(s1.getsockname())
4603 with s1.accept()[0] as s3:
4604 self.assertEqual(s1.getsockname(), address)
4605 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004606
4607 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004608 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004609 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4610 s.bind(address)
4611 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004612
4613 def testNameOverflow(self):
4614 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004615 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004616 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004617
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004618 def testStrName(self):
4619 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004620 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4621 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004622 s.bind("\x00python\x00test\x00")
4623 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004624 finally:
4625 s.close()
4626
Serhiy Storchaka43767632013-11-03 21:31:38 +02004627@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004628class TestUnixDomain(unittest.TestCase):
4629
4630 def setUp(self):
4631 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4632
4633 def tearDown(self):
4634 self.sock.close()
4635
4636 def encoded(self, path):
4637 # Return the given path encoded in the file system encoding,
4638 # or skip the test if this is not possible.
4639 try:
4640 return os.fsencode(path)
4641 except UnicodeEncodeError:
4642 self.skipTest(
4643 "Pathname {0!a} cannot be represented in file "
4644 "system encoding {1!r}".format(
4645 path, sys.getfilesystemencoding()))
4646
Antoine Pitrou16374872011-12-16 15:04:12 +01004647 def bind(self, sock, path):
4648 # Bind the socket
4649 try:
4650 sock.bind(path)
4651 except OSError as e:
4652 if str(e) == "AF_UNIX path too long":
4653 self.skipTest(
4654 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4655 .format(path))
4656 else:
4657 raise
4658
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004659 def testStrAddr(self):
4660 # Test binding to and retrieving a normal string pathname.
4661 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004662 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004663 self.addCleanup(support.unlink, path)
4664 self.assertEqual(self.sock.getsockname(), path)
4665
4666 def testBytesAddr(self):
4667 # Test binding to a bytes pathname.
4668 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004669 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004670 self.addCleanup(support.unlink, path)
4671 self.assertEqual(self.sock.getsockname(), path)
4672
4673 def testSurrogateescapeBind(self):
4674 # Test binding to a valid non-ASCII pathname, with the
4675 # non-ASCII bytes supplied using surrogateescape encoding.
4676 path = os.path.abspath(support.TESTFN_UNICODE)
4677 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004678 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004679 self.addCleanup(support.unlink, path)
4680 self.assertEqual(self.sock.getsockname(), path)
4681
4682 def testUnencodableAddr(self):
4683 # Test binding to a pathname that cannot be encoded in the
4684 # file system encoding.
4685 if support.TESTFN_UNENCODABLE is None:
4686 self.skipTest("No unencodable filename available")
4687 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004688 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004689 self.addCleanup(support.unlink, path)
4690 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004691
Victor Stinner45df8202010-04-28 22:31:17 +00004692@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004693class BufferIOTest(SocketConnectedTest):
4694 """
4695 Test the buffer versions of socket.recv() and socket.send().
4696 """
4697 def __init__(self, methodName='runTest'):
4698 SocketConnectedTest.__init__(self, methodName=methodName)
4699
Antoine Pitrou25480782010-03-17 22:50:28 +00004700 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004701 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004702 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004703 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004704 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004705 self.assertEqual(msg, MSG)
4706
Antoine Pitrou25480782010-03-17 22:50:28 +00004707 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004708 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004709 self.serv_conn.send(buf)
4710
Antoine Pitrou25480782010-03-17 22:50:28 +00004711 def testRecvIntoBytearray(self):
4712 buf = bytearray(1024)
4713 nbytes = self.cli_conn.recv_into(buf)
4714 self.assertEqual(nbytes, len(MSG))
4715 msg = buf[:len(MSG)]
4716 self.assertEqual(msg, MSG)
4717
4718 _testRecvIntoBytearray = _testRecvIntoArray
4719
4720 def testRecvIntoMemoryview(self):
4721 buf = bytearray(1024)
4722 nbytes = self.cli_conn.recv_into(memoryview(buf))
4723 self.assertEqual(nbytes, len(MSG))
4724 msg = buf[:len(MSG)]
4725 self.assertEqual(msg, MSG)
4726
4727 _testRecvIntoMemoryview = _testRecvIntoArray
4728
4729 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004730 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004731 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004732 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004733 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004734 self.assertEqual(msg, MSG)
4735
Antoine Pitrou25480782010-03-17 22:50:28 +00004736 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004737 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004738 self.serv_conn.send(buf)
4739
Antoine Pitrou25480782010-03-17 22:50:28 +00004740 def testRecvFromIntoBytearray(self):
4741 buf = bytearray(1024)
4742 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4743 self.assertEqual(nbytes, len(MSG))
4744 msg = buf[:len(MSG)]
4745 self.assertEqual(msg, MSG)
4746
4747 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4748
4749 def testRecvFromIntoMemoryview(self):
4750 buf = bytearray(1024)
4751 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4752 self.assertEqual(nbytes, len(MSG))
4753 msg = buf[:len(MSG)]
4754 self.assertEqual(msg, MSG)
4755
4756 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4757
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004758 def testRecvFromIntoSmallBuffer(self):
4759 # See issue #20246.
4760 buf = bytearray(8)
4761 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4762
4763 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004764 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004765
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004766 def testRecvFromIntoEmptyBuffer(self):
4767 buf = bytearray()
4768 self.cli_conn.recvfrom_into(buf)
4769 self.cli_conn.recvfrom_into(buf, 0)
4770
4771 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4772
Christian Heimes043d6f62008-01-07 17:19:16 +00004773
4774TIPC_STYPE = 2000
4775TIPC_LOWER = 200
4776TIPC_UPPER = 210
4777
4778def isTipcAvailable():
4779 """Check if the TIPC module is loaded
4780
4781 The TIPC module is not loaded automatically on Ubuntu and probably
4782 other Linux distros.
4783 """
4784 if not hasattr(socket, "AF_TIPC"):
4785 return False
4786 if not os.path.isfile("/proc/modules"):
4787 return False
4788 with open("/proc/modules") as f:
4789 for line in f:
4790 if line.startswith("tipc "):
4791 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004792 return False
4793
Serhiy Storchaka43767632013-11-03 21:31:38 +02004794@unittest.skipUnless(isTipcAvailable(),
4795 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004796class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004797 def testRDM(self):
4798 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4799 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004800 self.addCleanup(srv.close)
4801 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004802
4803 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4804 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4805 TIPC_LOWER, TIPC_UPPER)
4806 srv.bind(srvaddr)
4807
4808 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4809 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4810 cli.sendto(MSG, sendaddr)
4811
4812 msg, recvaddr = srv.recvfrom(1024)
4813
4814 self.assertEqual(cli.getsockname(), recvaddr)
4815 self.assertEqual(msg, MSG)
4816
4817
Serhiy Storchaka43767632013-11-03 21:31:38 +02004818@unittest.skipUnless(isTipcAvailable(),
4819 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004820class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004821 def __init__(self, methodName = 'runTest'):
4822 unittest.TestCase.__init__(self, methodName = methodName)
4823 ThreadableTest.__init__(self)
4824
4825 def setUp(self):
4826 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004827 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004828 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4829 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4830 TIPC_LOWER, TIPC_UPPER)
4831 self.srv.bind(srvaddr)
4832 self.srv.listen(5)
4833 self.serverExplicitReady()
4834 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004835 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004836
4837 def clientSetUp(self):
4838 # The is a hittable race between serverExplicitReady() and the
4839 # accept() call; sleep a little while to avoid it, otherwise
4840 # we could get an exception
4841 time.sleep(0.1)
4842 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004843 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004844 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4845 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4846 self.cli.connect(addr)
4847 self.cliaddr = self.cli.getsockname()
4848
4849 def testStream(self):
4850 msg = self.conn.recv(1024)
4851 self.assertEqual(msg, MSG)
4852 self.assertEqual(self.cliaddr, self.connaddr)
4853
4854 def _testStream(self):
4855 self.cli.send(MSG)
4856 self.cli.close()
4857
4858
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004859@unittest.skipUnless(thread, 'Threading required for this test.')
4860class ContextManagersTest(ThreadedTCPSocketTest):
4861
4862 def _testSocketClass(self):
4863 # base test
4864 with socket.socket() as sock:
4865 self.assertFalse(sock._closed)
4866 self.assertTrue(sock._closed)
4867 # close inside with block
4868 with socket.socket() as sock:
4869 sock.close()
4870 self.assertTrue(sock._closed)
4871 # exception inside with block
4872 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004873 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004874 self.assertTrue(sock._closed)
4875
4876 def testCreateConnectionBase(self):
4877 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004878 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004879 data = conn.recv(1024)
4880 conn.sendall(data)
4881
4882 def _testCreateConnectionBase(self):
4883 address = self.serv.getsockname()
4884 with socket.create_connection(address) as sock:
4885 self.assertFalse(sock._closed)
4886 sock.sendall(b'foo')
4887 self.assertEqual(sock.recv(1024), b'foo')
4888 self.assertTrue(sock._closed)
4889
4890 def testCreateConnectionClose(self):
4891 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004892 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004893 data = conn.recv(1024)
4894 conn.sendall(data)
4895
4896 def _testCreateConnectionClose(self):
4897 address = self.serv.getsockname()
4898 with socket.create_connection(address) as sock:
4899 sock.close()
4900 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004901 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004902
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004903
Victor Stinnerdaf45552013-08-28 00:53:59 +02004904class InheritanceTest(unittest.TestCase):
4905 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4906 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004907 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004908 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004909 with socket.socket(socket.AF_INET,
4910 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4911 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004912 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004913
4914 def test_default_inheritable(self):
4915 sock = socket.socket()
4916 with sock:
4917 self.assertEqual(sock.get_inheritable(), False)
4918
4919 def test_dup(self):
4920 sock = socket.socket()
4921 with sock:
4922 newsock = sock.dup()
4923 sock.close()
4924 with newsock:
4925 self.assertEqual(newsock.get_inheritable(), False)
4926
4927 def test_set_inheritable(self):
4928 sock = socket.socket()
4929 with sock:
4930 sock.set_inheritable(True)
4931 self.assertEqual(sock.get_inheritable(), True)
4932
4933 sock.set_inheritable(False)
4934 self.assertEqual(sock.get_inheritable(), False)
4935
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004936 @unittest.skipIf(fcntl is None, "need fcntl")
4937 def test_get_inheritable_cloexec(self):
4938 sock = socket.socket()
4939 with sock:
4940 fd = sock.fileno()
4941 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004942
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004943 # clear FD_CLOEXEC flag
4944 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4945 flags &= ~fcntl.FD_CLOEXEC
4946 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004947
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004948 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004949
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004950 @unittest.skipIf(fcntl is None, "need fcntl")
4951 def test_set_inheritable_cloexec(self):
4952 sock = socket.socket()
4953 with sock:
4954 fd = sock.fileno()
4955 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4956 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004957
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004958 sock.set_inheritable(True)
4959 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4960 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004961
4962
Victor Stinnerdaf45552013-08-28 00:53:59 +02004963 @unittest.skipUnless(hasattr(socket, "socketpair"),
4964 "need socket.socketpair()")
4965 def test_socketpair(self):
4966 s1, s2 = socket.socketpair()
4967 self.addCleanup(s1.close)
4968 self.addCleanup(s2.close)
4969 self.assertEqual(s1.get_inheritable(), False)
4970 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004971
4972
4973@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4974 "SOCK_NONBLOCK not defined")
4975class NonblockConstantTest(unittest.TestCase):
4976 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4977 if nonblock:
4978 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4979 self.assertEqual(s.gettimeout(), timeout)
4980 else:
4981 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4982 self.assertEqual(s.gettimeout(), None)
4983
Charles-François Natali239bb962011-06-03 12:55:15 +02004984 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004985 def test_SOCK_NONBLOCK(self):
4986 # a lot of it seems silly and redundant, but I wanted to test that
4987 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004988 with socket.socket(socket.AF_INET,
4989 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4990 self.checkNonblock(s)
4991 s.setblocking(1)
4992 self.checkNonblock(s, False)
4993 s.setblocking(0)
4994 self.checkNonblock(s)
4995 s.settimeout(None)
4996 self.checkNonblock(s, False)
4997 s.settimeout(2.0)
4998 self.checkNonblock(s, timeout=2.0)
4999 s.setblocking(1)
5000 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005001 # defaulttimeout
5002 t = socket.getdefaulttimeout()
5003 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005004 with socket.socket() as s:
5005 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005006 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005007 with socket.socket() as s:
5008 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005009 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005010 with socket.socket() as s:
5011 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005012 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005013 with socket.socket() as s:
5014 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005015 socket.setdefaulttimeout(t)
5016
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005017
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005018@unittest.skipUnless(os.name == "nt", "Windows specific")
5019@unittest.skipUnless(multiprocessing, "need multiprocessing")
5020class TestSocketSharing(SocketTCPTest):
5021 # This must be classmethod and not staticmethod or multiprocessing
5022 # won't be able to bootstrap it.
5023 @classmethod
5024 def remoteProcessServer(cls, q):
5025 # Recreate socket from shared data
5026 sdata = q.get()
5027 message = q.get()
5028
5029 s = socket.fromshare(sdata)
5030 s2, c = s.accept()
5031
5032 # Send the message
5033 s2.sendall(message)
5034 s2.close()
5035 s.close()
5036
5037 def testShare(self):
5038 # Transfer the listening server socket to another process
5039 # and service it from there.
5040
5041 # Create process:
5042 q = multiprocessing.Queue()
5043 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5044 p.start()
5045
5046 # Get the shared socket data
5047 data = self.serv.share(p.pid)
5048
5049 # Pass the shared socket to the other process
5050 addr = self.serv.getsockname()
5051 self.serv.close()
5052 q.put(data)
5053
5054 # The data that the server will send us
5055 message = b"slapmahfro"
5056 q.put(message)
5057
5058 # Connect
5059 s = socket.create_connection(addr)
5060 # listen for the data
5061 m = []
5062 while True:
5063 data = s.recv(100)
5064 if not data:
5065 break
5066 m.append(data)
5067 s.close()
5068 received = b"".join(m)
5069 self.assertEqual(received, message)
5070 p.join()
5071
5072 def testShareLength(self):
5073 data = self.serv.share(os.getpid())
5074 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5075 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5076
5077 def compareSockets(self, org, other):
5078 # socket sharing is expected to work only for blocking socket
5079 # since the internal python timout value isn't transfered.
5080 self.assertEqual(org.gettimeout(), None)
5081 self.assertEqual(org.gettimeout(), other.gettimeout())
5082
5083 self.assertEqual(org.family, other.family)
5084 self.assertEqual(org.type, other.type)
5085 # If the user specified "0" for proto, then
5086 # internally windows will have picked the correct value.
5087 # Python introspection on the socket however will still return
5088 # 0. For the shared socket, the python value is recreated
5089 # from the actual value, so it may not compare correctly.
5090 if org.proto != 0:
5091 self.assertEqual(org.proto, other.proto)
5092
5093 def testShareLocal(self):
5094 data = self.serv.share(os.getpid())
5095 s = socket.fromshare(data)
5096 try:
5097 self.compareSockets(self.serv, s)
5098 finally:
5099 s.close()
5100
5101 def testTypes(self):
5102 families = [socket.AF_INET, socket.AF_INET6]
5103 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5104 for f in families:
5105 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005106 try:
5107 source = socket.socket(f, t)
5108 except OSError:
5109 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005110 try:
5111 data = source.share(os.getpid())
5112 shared = socket.fromshare(data)
5113 try:
5114 self.compareSockets(source, shared)
5115 finally:
5116 shared.close()
5117 finally:
5118 source.close()
5119
5120
Guido van Rossumb995eb72002-07-31 16:08:40 +00005121def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005122 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005123 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005124
5125 tests.extend([
5126 NonBlockingTCPTests,
5127 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005128 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00005129 UnbufferedFileObjectClassTestCase,
5130 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005131 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005132 UnicodeReadFileObjectClassTestCase,
5133 UnicodeWriteFileObjectClassTestCase,
5134 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005135 NetworkConnectionNoServer,
5136 NetworkConnectionAttributesTest,
5137 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005138 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005139 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005140 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005141 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005142 tests.append(BasicSocketPairTest)
5143 tests.append(TestUnixDomain)
5144 tests.append(TestLinuxAbstractNamespace)
5145 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005146 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005147 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005148 tests.extend([
5149 CmsgMacroTests,
5150 SendmsgUDPTest,
5151 RecvmsgUDPTest,
5152 RecvmsgIntoUDPTest,
5153 SendmsgUDP6Test,
5154 RecvmsgUDP6Test,
5155 RecvmsgRFC3542AncillaryUDP6Test,
5156 RecvmsgIntoRFC3542AncillaryUDP6Test,
5157 RecvmsgIntoUDP6Test,
5158 SendmsgTCPTest,
5159 RecvmsgTCPTest,
5160 RecvmsgIntoTCPTest,
5161 SendmsgSCTPStreamTest,
5162 RecvmsgSCTPStreamTest,
5163 RecvmsgIntoSCTPStreamTest,
5164 SendmsgUnixStreamTest,
5165 RecvmsgUnixStreamTest,
5166 RecvmsgIntoUnixStreamTest,
5167 RecvmsgSCMRightsStreamTest,
5168 RecvmsgIntoSCMRightsStreamTest,
5169 # These are slow when setitimer() is not available
5170 InterruptedRecvTimeoutTest,
5171 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005172 TestSocketSharing,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005173 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005174
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005175 thread_info = support.threading_setup()
5176 support.run_unittest(*tests)
5177 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005178
5179if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005180 test_main()