blob: 02bc0c0d7035cbd5a1fb630907929536d8b36293 [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
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020023import random
24import string
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000026 import multiprocessing
27except ImportError:
28 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020029try:
30 import fcntl
31except ImportError:
32 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000033
Benjamin Petersonee8712c2008-05-20 21:35:26 +000034HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000035MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Victor Stinner45df8202010-04-28 22:31:17 +000037try:
38 import _thread as thread
39 import threading
40except ImportError:
41 thread = None
42 threading = None
Victor Stinnere254e532014-07-26 14:36:55 +020043try:
44 import _socket
45except ImportError:
46 _socket = None
47
Victor Stinner45df8202010-04-28 22:31:17 +000048
Charles-François Natali47413c12011-10-06 19:47:44 +020049def _have_socket_can():
50 """Check whether CAN sockets are supported on this host."""
51 try:
52 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020053 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020054 return False
55 else:
56 s.close()
57 return True
58
Charles-François Natali10b8cf42011-11-10 19:21:37 +010059def _have_socket_rds():
60 """Check whether RDS sockets are supported on this host."""
61 try:
62 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
63 except (AttributeError, OSError):
64 return False
65 else:
66 s.close()
67 return True
68
Charles-François Natali47413c12011-10-06 19:47:44 +020069HAVE_SOCKET_CAN = _have_socket_can()
70
Charles-François Natali10b8cf42011-11-10 19:21:37 +010071HAVE_SOCKET_RDS = _have_socket_rds()
72
Nick Coghlan96fe56a2011-08-22 11:55:57 +100073# Size in bytes of the int type
74SIZEOF_INT = array.array("i").itemsize
75
Guido van Rossum24e4af82002-06-12 19:18:08 +000076class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078 def setUp(self):
79 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000080 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +010081 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +000082
Guido van Rossum24e4af82002-06-12 19:18:08 +000083 def tearDown(self):
84 self.serv.close()
85 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000086
Guido van Rossum24e4af82002-06-12 19:18:08 +000087class SocketUDPTest(unittest.TestCase):
88
89 def setUp(self):
90 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000091 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000092
93 def tearDown(self):
94 self.serv.close()
95 self.serv = None
96
Nick Coghlan96fe56a2011-08-22 11:55:57 +100097class ThreadSafeCleanupTestCase(unittest.TestCase):
98 """Subclass of unittest.TestCase with thread-safe cleanup methods.
99
100 This subclass protects the addCleanup() and doCleanups() methods
101 with a recursive lock.
102 """
103
104 if threading:
105 def __init__(self, *args, **kwargs):
106 super().__init__(*args, **kwargs)
107 self._cleanup_lock = threading.RLock()
108
109 def addCleanup(self, *args, **kwargs):
110 with self._cleanup_lock:
111 return super().addCleanup(*args, **kwargs)
112
113 def doCleanups(self, *args, **kwargs):
114 with self._cleanup_lock:
115 return super().doCleanups(*args, **kwargs)
116
Charles-François Natali47413c12011-10-06 19:47:44 +0200117class SocketCANTest(unittest.TestCase):
118
119 """To be able to run this test, a `vcan0` CAN interface can be created with
120 the following commands:
121 # modprobe vcan
122 # ip link add dev vcan0 type vcan
123 # ifconfig vcan0 up
124 """
125 interface = 'vcan0'
126 bufsize = 128
127
Charles-François Natali773e42d2013-02-05 19:42:01 +0100128 """The CAN frame structure is defined in <linux/can.h>:
129
130 struct can_frame {
131 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
132 __u8 can_dlc; /* data length code: 0 .. 8 */
133 __u8 data[8] __attribute__((aligned(8)));
134 };
135 """
136 can_frame_fmt = "=IB3x8s"
137 can_frame_size = struct.calcsize(can_frame_fmt)
138
139 """The Broadcast Management Command frame structure is defined
140 in <linux/can/bcm.h>:
141
142 struct bcm_msg_head {
143 __u32 opcode;
144 __u32 flags;
145 __u32 count;
146 struct timeval ival1, ival2;
147 canid_t can_id;
148 __u32 nframes;
149 struct can_frame frames[0];
150 }
151
152 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
153 `struct can_frame` definition). Must use native not standard types for packing.
154 """
155 bcm_cmd_msg_fmt = "@3I4l2I"
156 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
157
Charles-François Natali47413c12011-10-06 19:47:44 +0200158 def setUp(self):
159 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200160 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200161 try:
162 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200163 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200164 self.skipTest('network interface `%s` does not exist' %
165 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200166
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100167
168class SocketRDSTest(unittest.TestCase):
169
170 """To be able to run this test, the `rds` kernel module must be loaded:
171 # modprobe rds
172 """
173 bufsize = 8192
174
175 def setUp(self):
176 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
177 self.addCleanup(self.serv.close)
178 try:
179 self.port = support.bind_port(self.serv)
180 except OSError:
181 self.skipTest('unable to bind RDS socket')
182
183
Guido van Rossum24e4af82002-06-12 19:18:08 +0000184class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000185 """Threadable Test class
186
187 The ThreadableTest class makes it easy to create a threaded
188 client/server pair from an existing unit test. To create a
189 new threaded class from an existing unit test, use multiple
190 inheritance:
191
192 class NewClass (OldClass, ThreadableTest):
193 pass
194
195 This class defines two new fixture functions with obvious
196 purposes for overriding:
197
198 clientSetUp ()
199 clientTearDown ()
200
201 Any new test functions within the class must then define
202 tests in pairs, where the test name is preceeded with a
203 '_' to indicate the client portion of the test. Ex:
204
205 def testFoo(self):
206 # Server portion
207
208 def _testFoo(self):
209 # Client portion
210
211 Any exceptions raised by the clients during their tests
212 are caught and transferred to the main thread to alert
213 the testing framework.
214
215 Note, the server setup function cannot call any blocking
216 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000218 the blocking call (such as in setting up a client/server
219 connection and performing the accept() in setUp().
220 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000221
222 def __init__(self):
223 # Swap the true setup function
224 self.__setUp = self.setUp
225 self.__tearDown = self.tearDown
226 self.setUp = self._setUp
227 self.tearDown = self._tearDown
228
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000229 def serverExplicitReady(self):
230 """This method allows the server to explicitly indicate that
231 it wants the client thread to proceed. This is useful if the
232 server is about to execute a blocking routine that is
233 dependent upon the client thread during its setup routine."""
234 self.server_ready.set()
235
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000237 self.server_ready = threading.Event()
238 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000239 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000240 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200241 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242
243 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000244 methodname = self.id()
245 i = methodname.rfind('.')
246 methodname = methodname[i+1:]
247 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000248 self.client_thread = thread.start_new_thread(
249 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200251 try:
252 self.__setUp()
253 except:
254 self.server_crashed = True
255 raise
256 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000257 self.server_ready.set()
258 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000259
260 def _tearDown(self):
261 self.__tearDown()
262 self.done.wait()
263
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000264 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000265 exc = self.queue.get()
266 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267
268 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000269 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200271 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200272 if self.server_crashed:
273 self.clientTearDown()
274 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000275 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000276 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 try:
278 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000279 except BaseException as e:
280 self.queue.put(e)
281 finally:
282 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283
284 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000285 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286
287 def clientTearDown(self):
288 self.done.set()
289 thread.exit()
290
291class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
292
293 def __init__(self, methodName='runTest'):
294 SocketTCPTest.__init__(self, methodName=methodName)
295 ThreadableTest.__init__(self)
296
297 def clientSetUp(self):
298 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
299
300 def clientTearDown(self):
301 self.cli.close()
302 self.cli = None
303 ThreadableTest.clientTearDown(self)
304
305class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
306
307 def __init__(self, methodName='runTest'):
308 SocketUDPTest.__init__(self, methodName=methodName)
309 ThreadableTest.__init__(self)
310
311 def clientSetUp(self):
312 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
313
Brian Curtin3beb38f2010-11-04 03:41:43 +0000314 def clientTearDown(self):
315 self.cli.close()
316 self.cli = None
317 ThreadableTest.clientTearDown(self)
318
Charles-François Natali47413c12011-10-06 19:47:44 +0200319class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
320
321 def __init__(self, methodName='runTest'):
322 SocketCANTest.__init__(self, methodName=methodName)
323 ThreadableTest.__init__(self)
324
325 def clientSetUp(self):
326 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
327 try:
328 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200329 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200330 # skipTest should not be called here, and will be called in the
331 # server instead
332 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200333
334 def clientTearDown(self):
335 self.cli.close()
336 self.cli = None
337 ThreadableTest.clientTearDown(self)
338
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100339class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
340
341 def __init__(self, methodName='runTest'):
342 SocketRDSTest.__init__(self, methodName=methodName)
343 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100344
345 def clientSetUp(self):
346 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
347 try:
348 # RDS sockets must be bound explicitly to send or receive data
349 self.cli.bind((HOST, 0))
350 self.cli_addr = self.cli.getsockname()
351 except OSError:
352 # skipTest should not be called here, and will be called in the
353 # server instead
354 pass
355
356 def clientTearDown(self):
357 self.cli.close()
358 self.cli = None
359 ThreadableTest.clientTearDown(self)
360
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000362 """Socket tests for client-server connection.
363
364 self.cli_conn is a client socket connected to the server. The
365 setUp() method guarantees that it is connected to the server.
366 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000367
368 def __init__(self, methodName='runTest'):
369 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
370
371 def setUp(self):
372 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000373 # Indicate explicitly we're ready for the client thread to
374 # proceed and then perform the blocking call to accept
375 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376 conn, addr = self.serv.accept()
377 self.cli_conn = conn
378
379 def tearDown(self):
380 self.cli_conn.close()
381 self.cli_conn = None
382 ThreadedTCPSocketTest.tearDown(self)
383
384 def clientSetUp(self):
385 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000386 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000387 self.serv_conn = self.cli
388
389 def clientTearDown(self):
390 self.serv_conn.close()
391 self.serv_conn = None
392 ThreadedTCPSocketTest.clientTearDown(self)
393
Dave Cole331708b2004-08-09 04:51:41 +0000394class SocketPairTest(unittest.TestCase, ThreadableTest):
395
396 def __init__(self, methodName='runTest'):
397 unittest.TestCase.__init__(self, methodName=methodName)
398 ThreadableTest.__init__(self)
399
400 def setUp(self):
401 self.serv, self.cli = socket.socketpair()
402
403 def tearDown(self):
404 self.serv.close()
405 self.serv = None
406
407 def clientSetUp(self):
408 pass
409
410 def clientTearDown(self):
411 self.cli.close()
412 self.cli = None
413 ThreadableTest.clientTearDown(self)
414
Tim Peters494aaee2004-08-09 18:54:11 +0000415
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000416# The following classes are used by the sendmsg()/recvmsg() tests.
417# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
418# gives a drop-in replacement for SocketConnectedTest, but different
419# address families can be used, and the attributes serv_addr and
420# cli_addr will be set to the addresses of the endpoints.
421
422class SocketTestBase(unittest.TestCase):
423 """A base class for socket tests.
424
425 Subclasses must provide methods newSocket() to return a new socket
426 and bindSock(sock) to bind it to an unused address.
427
428 Creates a socket self.serv and sets self.serv_addr to its address.
429 """
430
431 def setUp(self):
432 self.serv = self.newSocket()
433 self.bindServer()
434
435 def bindServer(self):
436 """Bind server socket and set self.serv_addr to its address."""
437 self.bindSock(self.serv)
438 self.serv_addr = self.serv.getsockname()
439
440 def tearDown(self):
441 self.serv.close()
442 self.serv = None
443
444
445class SocketListeningTestMixin(SocketTestBase):
446 """Mixin to listen on the server socket."""
447
448 def setUp(self):
449 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100450 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000451
452
453class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
454 ThreadableTest):
455 """Mixin to add client socket and allow client/server tests.
456
457 Client socket is self.cli and its address is self.cli_addr. See
458 ThreadableTest for usage information.
459 """
460
461 def __init__(self, *args, **kwargs):
462 super().__init__(*args, **kwargs)
463 ThreadableTest.__init__(self)
464
465 def clientSetUp(self):
466 self.cli = self.newClientSocket()
467 self.bindClient()
468
469 def newClientSocket(self):
470 """Return a new socket for use as client."""
471 return self.newSocket()
472
473 def bindClient(self):
474 """Bind client socket and set self.cli_addr to its address."""
475 self.bindSock(self.cli)
476 self.cli_addr = self.cli.getsockname()
477
478 def clientTearDown(self):
479 self.cli.close()
480 self.cli = None
481 ThreadableTest.clientTearDown(self)
482
483
484class ConnectedStreamTestMixin(SocketListeningTestMixin,
485 ThreadedSocketTestMixin):
486 """Mixin to allow client/server stream tests with connected client.
487
488 Server's socket representing connection to client is self.cli_conn
489 and client's connection to server is self.serv_conn. (Based on
490 SocketConnectedTest.)
491 """
492
493 def setUp(self):
494 super().setUp()
495 # Indicate explicitly we're ready for the client thread to
496 # proceed and then perform the blocking call to accept
497 self.serverExplicitReady()
498 conn, addr = self.serv.accept()
499 self.cli_conn = conn
500
501 def tearDown(self):
502 self.cli_conn.close()
503 self.cli_conn = None
504 super().tearDown()
505
506 def clientSetUp(self):
507 super().clientSetUp()
508 self.cli.connect(self.serv_addr)
509 self.serv_conn = self.cli
510
511 def clientTearDown(self):
512 self.serv_conn.close()
513 self.serv_conn = None
514 super().clientTearDown()
515
516
517class UnixSocketTestBase(SocketTestBase):
518 """Base class for Unix-domain socket tests."""
519
520 # This class is used for file descriptor passing tests, so we
521 # create the sockets in a private directory so that other users
522 # can't send anything that might be problematic for a privileged
523 # user running the tests.
524
525 def setUp(self):
526 self.dir_path = tempfile.mkdtemp()
527 self.addCleanup(os.rmdir, self.dir_path)
528 super().setUp()
529
530 def bindSock(self, sock):
531 path = tempfile.mktemp(dir=self.dir_path)
532 sock.bind(path)
533 self.addCleanup(support.unlink, path)
534
535class UnixStreamBase(UnixSocketTestBase):
536 """Base class for Unix-domain SOCK_STREAM tests."""
537
538 def newSocket(self):
539 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
540
541
542class InetTestBase(SocketTestBase):
543 """Base class for IPv4 socket tests."""
544
545 host = HOST
546
547 def setUp(self):
548 super().setUp()
549 self.port = self.serv_addr[1]
550
551 def bindSock(self, sock):
552 support.bind_port(sock, host=self.host)
553
554class TCPTestBase(InetTestBase):
555 """Base class for TCP-over-IPv4 tests."""
556
557 def newSocket(self):
558 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
559
560class UDPTestBase(InetTestBase):
561 """Base class for UDP-over-IPv4 tests."""
562
563 def newSocket(self):
564 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
565
566class SCTPStreamBase(InetTestBase):
567 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
568
569 def newSocket(self):
570 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
571 socket.IPPROTO_SCTP)
572
573
574class Inet6TestBase(InetTestBase):
575 """Base class for IPv6 socket tests."""
576
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200577 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000578
579class UDP6TestBase(Inet6TestBase):
580 """Base class for UDP-over-IPv6 tests."""
581
582 def newSocket(self):
583 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
584
585
586# Test-skipping decorators for use with ThreadableTest.
587
588def skipWithClientIf(condition, reason):
589 """Skip decorated test if condition is true, add client_skip decorator.
590
591 If the decorated object is not a class, sets its attribute
592 "client_skip" to a decorator which will return an empty function
593 if the test is to be skipped, or the original function if it is
594 not. This can be used to avoid running the client part of a
595 skipped test when using ThreadableTest.
596 """
597 def client_pass(*args, **kwargs):
598 pass
599 def skipdec(obj):
600 retval = unittest.skip(reason)(obj)
601 if not isinstance(obj, type):
602 retval.client_skip = lambda f: client_pass
603 return retval
604 def noskipdec(obj):
605 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
606 obj.client_skip = lambda f: f
607 return obj
608 return skipdec if condition else noskipdec
609
610
611def requireAttrs(obj, *attributes):
612 """Skip decorated test if obj is missing any of the given attributes.
613
614 Sets client_skip attribute as skipWithClientIf() does.
615 """
616 missing = [name for name in attributes if not hasattr(obj, name)]
617 return skipWithClientIf(
618 missing, "don't have " + ", ".join(name for name in missing))
619
620
621def requireSocket(*args):
622 """Skip decorated test if a socket cannot be created with given arguments.
623
624 When an argument is given as a string, will use the value of that
625 attribute of the socket module, or skip the test if it doesn't
626 exist. Sets client_skip attribute as skipWithClientIf() does.
627 """
628 err = None
629 missing = [obj for obj in args if
630 isinstance(obj, str) and not hasattr(socket, obj)]
631 if missing:
632 err = "don't have " + ", ".join(name for name in missing)
633 else:
634 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
635 for obj in args]
636 try:
637 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200638 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000639 # XXX: check errno?
640 err = str(e)
641 else:
642 s.close()
643 return skipWithClientIf(
644 err is not None,
645 "can't create socket({0}): {1}".format(
646 ", ".join(str(o) for o in args), err))
647
648
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649#######################################################################
650## Begin Tests
651
652class GeneralModuleTests(unittest.TestCase):
653
Ethan Furman7184bac2014-10-14 18:56:53 -0700654 def test_SocketType_is_socketobject(self):
655 import _socket
656 self.assertTrue(socket.SocketType is _socket.socket)
657 s = socket.socket()
658 self.assertIsInstance(s, socket.SocketType)
659 s.close()
660
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000661 def test_repr(self):
662 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200663 with s:
664 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000665 self.assertIn('family=%s' % socket.AF_INET, repr(s))
666 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200667 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200668 self.assertNotIn('raddr', repr(s))
669 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200670 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200671 self.assertIn(str(s.getsockname()), repr(s))
672 self.assertIn('[closed]', repr(s))
673 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000674
Victor Stinnere254e532014-07-26 14:36:55 +0200675 @unittest.skipUnless(_socket is not None, 'need _socket module')
676 def test_csocket_repr(self):
677 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
678 try:
679 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
680 % (s.fileno(), s.family, s.type, s.proto))
681 self.assertEqual(repr(s), expected)
682 finally:
683 s.close()
684 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
685 % (s.family, s.type, s.proto))
686 self.assertEqual(repr(s), expected)
687
Raymond Hettinger027bb632004-05-31 03:09:25 +0000688 def test_weakref(self):
689 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
690 p = proxy(s)
691 self.assertEqual(p.fileno(), s.fileno())
692 s.close()
693 s = None
694 try:
695 p.fileno()
696 except ReferenceError:
697 pass
698 else:
699 self.fail('Socket proxy still exists')
700
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300703 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200704 with self.assertRaises(OSError, msg=msg % 'OSError'):
705 raise OSError
706 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200708 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710
Ezio Melotti63e42302011-05-07 19:47:48 +0300711 def testSendtoErrors(self):
Berker Peksag4882cac2015-04-14 09:30:01 +0300712 # Testing that sendto doesn't masks failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300713 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
714 self.addCleanup(s.close)
715 s.bind(('', 0))
716 sockname = s.getsockname()
717 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300718 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300719 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300720 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400721 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300722 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300723 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300724 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400725 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300726 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300727 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300728 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300729 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300730 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300731 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300732 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400733 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300734 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300735 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300736 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400737 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300738 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300739 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300740 self.assertIn('not NoneType', str(cm.exception))
741 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300742 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300743 self.assertIn('an integer is required', str(cm.exception))
744 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300745 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300746 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300747 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300748 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300749 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300750 self.assertIn('(1 given)', str(cm.exception))
751 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300752 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300753 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300754
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757 socket.AF_INET
758 socket.SOCK_STREAM
759 socket.SOCK_DGRAM
760 socket.SOCK_RAW
761 socket.SOCK_RDM
762 socket.SOCK_SEQPACKET
763 socket.SOL_SOCKET
764 socket.SO_REUSEADDR
765
Guido van Rossum654c11e2002-06-13 20:24:17 +0000766 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000768 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000769 try:
770 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200771 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000772 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600773 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000774 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000775 try:
776 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200777 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000778 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600779 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000780 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000781 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000782 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000783 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000784
Charles-François Natali0cc86852013-09-13 19:53:08 +0200785 def test_host_resolution(self):
786 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
787 '1:1:1:1:1:1:1:1:1']:
788 self.assertRaises(OSError, socket.gethostbyname, addr)
789 self.assertRaises(OSError, socket.gethostbyaddr, addr)
790
791 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
792 self.assertEqual(socket.gethostbyname(addr), addr)
793
794 # we don't test support.HOSTv6 because there's a chance it doesn't have
795 # a matching name entry (e.g. 'ip6-localhost')
796 for host in [support.HOST]:
797 self.assertIn(host, socket.gethostbyaddr(host)[2])
798
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000799 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
800 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
801 def test_sethostname(self):
802 oldhn = socket.gethostname()
803 try:
804 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200805 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000806 if e.errno == errno.EPERM:
807 self.skipTest("test should be run as root")
808 else:
809 raise
810 try:
811 # running test as root!
812 self.assertEqual(socket.gethostname(), 'new')
813 # Should work with bytes objects too
814 socket.sethostname(b'bar')
815 self.assertEqual(socket.gethostname(), 'bar')
816 finally:
817 socket.sethostname(oldhn)
818
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700819 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
820 'socket.if_nameindex() not available.')
821 def testInterfaceNameIndex(self):
822 interfaces = socket.if_nameindex()
823 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200824 self.assertIsInstance(index, int)
825 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700826 # interface indices are non-zero integers
827 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200828 _index = socket.if_nametoindex(name)
829 self.assertIsInstance(_index, int)
830 self.assertEqual(index, _index)
831 _name = socket.if_indextoname(index)
832 self.assertIsInstance(_name, str)
833 self.assertEqual(name, _name)
834
835 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
836 'socket.if_nameindex() not available.')
837 def testInvalidInterfaceNameIndex(self):
838 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200839 self.assertRaises(OSError, socket.if_indextoname, 0)
840 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200841 # test with invalid values
842 self.assertRaises(TypeError, socket.if_nametoindex, 0)
843 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700844
Serhiy Storchaka43767632013-11-03 21:31:38 +0200845 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
846 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000847 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200849 try:
850 # On some versions, this loses a reference
851 orig = sys.getrefcount(__name__)
852 socket.getnameinfo(__name__,0)
853 except TypeError:
854 if sys.getrefcount(__name__) != orig:
855 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000856
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859 try:
860 # On some versions, this crashes the interpreter.
861 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200862 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000864
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000865 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000866 # This just checks that htons etc. are their own inverse,
867 # when looking at the lower 16 or 32 bits.
868 sizes = {socket.htonl: 32, socket.ntohl: 32,
869 socket.htons: 16, socket.ntohs: 16}
870 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000871 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000872 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
873 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000874
Guido van Rossuma2627af2002-09-14 00:58:46 +0000875 swapped = func(mask)
876 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000877 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000878
Guido van Rossum018919a2007-01-15 00:07:32 +0000879 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000880 good_values = [ 1, 2, 3, 1, 2, 3 ]
881 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000882 for k in good_values:
883 socket.ntohl(k)
884 socket.ntohs(k)
885 socket.htonl(k)
886 socket.htons(k)
887 for k in bad_values:
888 self.assertRaises(OverflowError, socket.ntohl, k)
889 self.assertRaises(OverflowError, socket.ntohs, k)
890 self.assertRaises(OverflowError, socket.htonl, k)
891 self.assertRaises(OverflowError, socket.htons, k)
892
Barry Warsaw11b91a02004-06-28 00:50:43 +0000893 def testGetServBy(self):
894 eq = self.assertEqual
895 # Find one service that exists, then check all the related interfaces.
896 # I've ordered this by protocols that have both a tcp and udp
897 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +0200898 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +0200899 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000900 # avoid the 'echo' service on this platform, as there is an
901 # assumption breaking non-standard port/protocol entry
902 services = ('daytime', 'qotd', 'domain')
903 else:
904 services = ('echo', 'daytime', 'domain')
905 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000906 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000907 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000908 break
Andrew Svetlov0832af62012-12-18 23:10:48 +0200909 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +0000910 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000911 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +0200912 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +0000913 # Try same call with optional protocol omitted
914 port2 = socket.getservbyname(service)
915 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -0400916 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000917 try:
918 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200919 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000920 udpport = None
921 else:
922 eq(udpport, port)
923 # Now make sure the lookup by port returns the same service name
924 eq(socket.getservbyport(port2), service)
925 eq(socket.getservbyport(port, 'tcp'), service)
926 if udpport is not None:
927 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000928 # Make sure getservbyport does not accept out of range ports.
929 self.assertRaises(OverflowError, socket.getservbyport, -1)
930 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000932 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000934 # The default timeout should initially be None
935 self.assertEqual(socket.getdefaulttimeout(), None)
936 s = socket.socket()
937 self.assertEqual(s.gettimeout(), None)
938 s.close()
939
940 # Set the default timeout to 10, and see if it propagates
941 socket.setdefaulttimeout(10)
942 self.assertEqual(socket.getdefaulttimeout(), 10)
943 s = socket.socket()
944 self.assertEqual(s.gettimeout(), 10)
945 s.close()
946
947 # Reset the default timeout to None, and see if it propagates
948 socket.setdefaulttimeout(None)
949 self.assertEqual(socket.getdefaulttimeout(), None)
950 s = socket.socket()
951 self.assertEqual(s.gettimeout(), None)
952 s.close()
953
954 # Check that setting it to an invalid value raises ValueError
955 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
956
957 # Check that setting it to an invalid type raises TypeError
958 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
959
Serhiy Storchaka43767632013-11-03 21:31:38 +0200960 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
961 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +0000962 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000963 # Test that issue1008086 and issue767150 are fixed.
964 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000965 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
966 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000967
Serhiy Storchaka43767632013-11-03 21:31:38 +0200968 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
969 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000970 def testIPv4toString(self):
971 from socket import inet_aton as f, inet_pton, AF_INET
972 g = lambda a: inet_pton(AF_INET, a)
973
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100974 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +0200975 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100976 )
977
Ezio Melottib3aedd42010-11-20 19:04:17 +0000978 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
979 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
980 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
981 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
982 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100983 assertInvalid(f, '0.0.0.')
984 assertInvalid(f, '300.0.0.0')
985 assertInvalid(f, 'a.0.0.0')
986 assertInvalid(f, '1.2.3.4.5')
987 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000988
Ezio Melottib3aedd42010-11-20 19:04:17 +0000989 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
990 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
991 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
992 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100993 assertInvalid(g, '0.0.0.')
994 assertInvalid(g, '300.0.0.0')
995 assertInvalid(g, 'a.0.0.0')
996 assertInvalid(g, '1.2.3.4.5')
997 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000998
Serhiy Storchaka43767632013-11-03 21:31:38 +0200999 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1000 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001001 def testIPv6toString(self):
1002 try:
1003 from socket import inet_pton, AF_INET6, has_ipv6
1004 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001005 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001006 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001007 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001008
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001009 if sys.platform == "win32":
1010 try:
1011 inet_pton(AF_INET6, '::')
1012 except OSError as e:
1013 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001014 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001015
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001016 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001017 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001018 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001019 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001020
Ezio Melottib3aedd42010-11-20 19:04:17 +00001021 self.assertEqual(b'\x00' * 16, f('::'))
1022 self.assertEqual(b'\x00' * 16, f('0::0'))
1023 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1024 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001025 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 +00001026 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1027 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001028 self.assertEqual(
1029 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1030 f('ad42:abc::127:0:254:2')
1031 )
1032 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1033 assertInvalid('0x20::')
1034 assertInvalid(':::')
1035 assertInvalid('::0::')
1036 assertInvalid('1::abc::')
1037 assertInvalid('1::abc::def')
1038 assertInvalid('1:2:3:4:5:6:')
1039 assertInvalid('1:2:3:4:5:6')
1040 assertInvalid('1:2:3:4:5:6:7:8:')
1041 assertInvalid('1:2:3:4:5:6:7:8:0')
1042
1043 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1044 f('::254.42.23.64')
1045 )
1046 self.assertEqual(
1047 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1048 f('42::a29b:254.42.23.64')
1049 )
1050 self.assertEqual(
1051 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1052 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1053 )
1054 assertInvalid('255.254.253.252')
1055 assertInvalid('1::260.2.3.0')
1056 assertInvalid('1::0.be.e.0')
1057 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1058 assertInvalid('::1.2.3.4:0')
1059 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001060
Serhiy Storchaka43767632013-11-03 21:31:38 +02001061 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1062 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001063 def testStringToIPv4(self):
1064 from socket import inet_ntoa as f, inet_ntop, AF_INET
1065 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001066 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001067 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001068 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001069
Ezio Melottib3aedd42010-11-20 19:04:17 +00001070 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1071 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1072 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1073 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001074 assertInvalid(f, b'\x00' * 3)
1075 assertInvalid(f, b'\x00' * 5)
1076 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001077 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001078
Ezio Melottib3aedd42010-11-20 19:04:17 +00001079 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1080 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1081 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001082 assertInvalid(g, b'\x00' * 3)
1083 assertInvalid(g, b'\x00' * 5)
1084 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001085 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001086
Serhiy Storchaka43767632013-11-03 21:31:38 +02001087 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1088 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001089 def testStringToIPv6(self):
1090 try:
1091 from socket import inet_ntop, AF_INET6, has_ipv6
1092 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001093 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001094 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001095 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001096
1097 if sys.platform == "win32":
1098 try:
1099 inet_ntop(AF_INET6, b'\x00' * 16)
1100 except OSError as e:
1101 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001102 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001103
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001104 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001105 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001106 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001107 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001108
Ezio Melottib3aedd42010-11-20 19:04:17 +00001109 self.assertEqual('::', f(b'\x00' * 16))
1110 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1111 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001112 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001113 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 +00001114 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001115 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001116
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001117 assertInvalid(b'\x12' * 15)
1118 assertInvalid(b'\x12' * 17)
1119 assertInvalid(b'\x12' * 4)
1120
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001121 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001122
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001123 def testSockName(self):
1124 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001125 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001126 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001127 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001128 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001129 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001130 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1131 # it reasonable to get the host's addr in addition to 0.0.0.0.
1132 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001133 try:
1134 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001135 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001136 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001137 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001138 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001139 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001140
1141 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001142 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001143 # We know a socket should start without reuse==0
1144 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001145 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001146 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001147 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001148
1149 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001150 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001151 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001152 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001153 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1154 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001155 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001156
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001157 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001158 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001159 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1160 sock.settimeout(1)
1161 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001162 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001163
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001164 def testNewAttributes(self):
1165 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001166
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001167 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1168 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001169 if hasattr(socket, 'SOCK_CLOEXEC'):
1170 self.assertIn(sock.type,
1171 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1172 socket.SOCK_STREAM))
1173 else:
1174 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001175 self.assertEqual(sock.proto, 0)
1176 sock.close()
1177
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001178 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001179 sock = socket.socket()
1180 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001181 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001182 big_port = port + 65536
1183 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001184 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1185 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1186 # Since find_unused_port() is inherently subject to race conditions, we
1187 # call it a couple times if necessary.
1188 for i in itertools.count():
1189 port = support.find_unused_port()
1190 try:
1191 sock.bind((HOST, port))
1192 except OSError as e:
1193 if e.errno != errno.EADDRINUSE or i == 5:
1194 raise
1195 else:
1196 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001197
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001198 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001199 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001200 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1201 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1202 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1203 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001204 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1205 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001206 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001207 self.assertRaises(ValueError, s.ioctl, -1, None)
1208 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001209
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001210 def testGetaddrinfo(self):
1211 try:
1212 socket.getaddrinfo('localhost', 80)
1213 except socket.gaierror as err:
1214 if err.errno == socket.EAI_SERVICE:
1215 # see http://bugs.python.org/issue1282647
1216 self.skipTest("buggy libc version")
1217 raise
1218 # len of every sequence is supposed to be == 5
1219 for info in socket.getaddrinfo(HOST, None):
1220 self.assertEqual(len(info), 5)
1221 # host can be a domain name, a string representation of an
1222 # IPv4/v6 address or None
1223 socket.getaddrinfo('localhost', 80)
1224 socket.getaddrinfo('127.0.0.1', 80)
1225 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001226 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001227 socket.getaddrinfo('::1', 80)
1228 # port can be a string service name such as "http", a numeric
1229 # port number or None
1230 socket.getaddrinfo(HOST, "http")
1231 socket.getaddrinfo(HOST, 80)
1232 socket.getaddrinfo(HOST, None)
1233 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001234 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1235 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001236 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001237 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1238 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001239 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001240 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1241 for _, socktype, _, _, _ in infos:
1242 self.assertEqual(socktype, socket.SOCK_STREAM)
1243 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001244 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001245 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1246 # a server willing to support both IPv4 and IPv6 will
1247 # usually do this
1248 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1249 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001250 # test keyword arguments
1251 a = socket.getaddrinfo(HOST, None)
1252 b = socket.getaddrinfo(host=HOST, port=None)
1253 self.assertEqual(a, b)
1254 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1255 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1256 self.assertEqual(a, b)
1257 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1258 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1259 self.assertEqual(a, b)
1260 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1261 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1262 self.assertEqual(a, b)
1263 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1264 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1265 self.assertEqual(a, b)
1266 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1267 socket.AI_PASSIVE)
1268 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1269 type=socket.SOCK_STREAM, proto=0,
1270 flags=socket.AI_PASSIVE)
1271 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001272 # Issue #6697.
1273 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001274
Ned Deilyb24f4812014-02-13 22:50:42 -08001275 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001276 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001277 try:
1278 # The arguments here are undefined and the call may succeed
1279 # or fail. All we care here is that it doesn't segfault.
1280 socket.getaddrinfo("localhost", None, 0, 0, 0,
1281 socket.AI_NUMERICSERV)
1282 except socket.gaierror:
1283 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001284
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001285 def test_getnameinfo(self):
1286 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001287 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001288
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001289 @unittest.skipUnless(support.is_resource_enabled('network'),
1290 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001291 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001292 # Check for internet access before running test
1293 # (issue #12804, issue #25138).
1294 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001295 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001296
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001297 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001298 domain = 'испытание.pythontest.net'
1299 socket.gethostbyname(domain)
1300 socket.gethostbyname_ex(domain)
1301 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001302 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1303 # have a reverse entry yet
1304 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001305
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001306 def check_sendall_interrupted(self, with_timeout):
1307 # socketpair() is not stricly required, but it makes things easier.
1308 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1309 self.skipTest("signal.alarm and socket.socketpair required for this test")
1310 # Our signal handlers clobber the C errno by calling a math function
1311 # with an invalid domain value.
1312 def ok_handler(*args):
1313 self.assertRaises(ValueError, math.acosh, 0)
1314 def raising_handler(*args):
1315 self.assertRaises(ValueError, math.acosh, 0)
1316 1 // 0
1317 c, s = socket.socketpair()
1318 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1319 try:
1320 if with_timeout:
1321 # Just above the one second minimum for signal.alarm
1322 c.settimeout(1.5)
1323 with self.assertRaises(ZeroDivisionError):
1324 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001325 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001326 if with_timeout:
1327 signal.signal(signal.SIGALRM, ok_handler)
1328 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001329 self.assertRaises(socket.timeout, c.sendall,
1330 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001331 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001332 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001333 signal.signal(signal.SIGALRM, old_alarm)
1334 c.close()
1335 s.close()
1336
1337 def test_sendall_interrupted(self):
1338 self.check_sendall_interrupted(False)
1339
1340 def test_sendall_interrupted_with_timeout(self):
1341 self.check_sendall_interrupted(True)
1342
Antoine Pitroue033e062010-10-29 10:38:18 +00001343 def test_dealloc_warn(self):
1344 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1345 r = repr(sock)
1346 with self.assertWarns(ResourceWarning) as cm:
1347 sock = None
1348 support.gc_collect()
1349 self.assertIn(r, str(cm.warning.args[0]))
1350 # An open socket file object gets dereferenced after the socket
1351 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1352 f = sock.makefile('rb')
1353 r = repr(sock)
1354 sock = None
1355 support.gc_collect()
1356 with self.assertWarns(ResourceWarning):
1357 f = None
1358 support.gc_collect()
1359
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001360 def test_name_closed_socketio(self):
1361 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1362 fp = sock.makefile("rb")
1363 fp.close()
1364 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1365
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001366 def test_unusable_closed_socketio(self):
1367 with socket.socket() as sock:
1368 fp = sock.makefile("rb", buffering=0)
1369 self.assertTrue(fp.readable())
1370 self.assertFalse(fp.writable())
1371 self.assertFalse(fp.seekable())
1372 fp.close()
1373 self.assertRaises(ValueError, fp.readable)
1374 self.assertRaises(ValueError, fp.writable)
1375 self.assertRaises(ValueError, fp.seekable)
1376
Berker Peksag3fe64d02016-02-18 17:34:00 +02001377 def test_makefile_mode(self):
1378 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1379 with self.subTest(mode=mode):
1380 with socket.socket() as sock:
1381 with sock.makefile(mode) as fp:
1382 self.assertEqual(fp.mode, mode)
1383
1384 def test_makefile_invalid_mode(self):
1385 for mode in 'rt', 'x', '+', 'a':
1386 with self.subTest(mode=mode):
1387 with socket.socket() as sock:
1388 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1389 sock.makefile(mode)
1390
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001391 def test_pickle(self):
1392 sock = socket.socket()
1393 with sock:
1394 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1395 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001396 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1397 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1398 self.assertEqual(family, socket.AF_INET)
1399 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1400 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001401
Serhiy Storchaka78980432013-01-15 01:12:17 +02001402 def test_listen_backlog(self):
1403 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001404 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1405 srv.bind((HOST, 0))
1406 srv.listen(backlog)
1407
1408 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001409 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001410 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001411
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001412 @support.cpython_only
1413 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001414 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001415 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001416 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1417 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001418 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001419 srv.close()
1420
Charles-François Natali42663332012-01-02 15:57:30 +01001421 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001422 def test_flowinfo(self):
1423 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001424 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001425 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001426 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001427
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001428 def test_str_for_enums(self):
1429 # Make sure that the AF_* and SOCK_* constants have enum-like string
1430 # reprs.
1431 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1432 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001433 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001434
1435 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1436 def test_uknown_socket_family_repr(self):
1437 # Test that when created with a family that's not one of the known
1438 # AF_*/SOCK_* constants, socket.family just returns the number.
1439 #
1440 # To do this we fool socket.socket into believing it already has an
1441 # open fd because on this path it doesn't actually verify the family and
1442 # type and populates the socket object.
1443 #
1444 # On Windows this trick won't work, so the test is skipped.
1445 fd, _ = tempfile.mkstemp()
1446 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1447 self.assertEqual(s.family, 42424)
1448 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001449
Charles-François Natali47413c12011-10-06 19:47:44 +02001450@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1451class BasicCANTest(unittest.TestCase):
1452
1453 def testCrucialConstants(self):
1454 socket.AF_CAN
1455 socket.PF_CAN
1456 socket.CAN_RAW
1457
Charles-François Natali773e42d2013-02-05 19:42:01 +01001458 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1459 'socket.CAN_BCM required for this test.')
1460 def testBCMConstants(self):
1461 socket.CAN_BCM
1462
1463 # opcodes
1464 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1465 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1466 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1467 socket.CAN_BCM_TX_SEND # send one CAN frame
1468 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1469 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1470 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1471 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1472 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1473 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1474 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1475 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1476
Charles-François Natali47413c12011-10-06 19:47:44 +02001477 def testCreateSocket(self):
1478 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1479 pass
1480
Charles-François Natali773e42d2013-02-05 19:42:01 +01001481 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1482 'socket.CAN_BCM required for this test.')
1483 def testCreateBCMSocket(self):
1484 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1485 pass
1486
Charles-François Natali47413c12011-10-06 19:47:44 +02001487 def testBindAny(self):
1488 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1489 s.bind(('', ))
1490
1491 def testTooLongInterfaceName(self):
1492 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1493 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001494 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001495 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001496
1497 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1498 'socket.CAN_RAW_LOOPBACK required for this test.')
1499 def testLoopback(self):
1500 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1501 for loopback in (0, 1):
1502 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1503 loopback)
1504 self.assertEqual(loopback,
1505 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1506
1507 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1508 'socket.CAN_RAW_FILTER required for this test.')
1509 def testFilter(self):
1510 can_id, can_mask = 0x200, 0x700
1511 can_filter = struct.pack("=II", can_id, can_mask)
1512 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1513 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1514 self.assertEqual(can_filter,
1515 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001516 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001517
1518
1519@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001520@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001521class CANTest(ThreadedCANSocketTest):
1522
Charles-François Natali47413c12011-10-06 19:47:44 +02001523 def __init__(self, methodName='runTest'):
1524 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1525
1526 @classmethod
1527 def build_can_frame(cls, can_id, data):
1528 """Build a CAN frame."""
1529 can_dlc = len(data)
1530 data = data.ljust(8, b'\x00')
1531 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1532
1533 @classmethod
1534 def dissect_can_frame(cls, frame):
1535 """Dissect a CAN frame."""
1536 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1537 return (can_id, can_dlc, data[:can_dlc])
1538
1539 def testSendFrame(self):
1540 cf, addr = self.s.recvfrom(self.bufsize)
1541 self.assertEqual(self.cf, cf)
1542 self.assertEqual(addr[0], self.interface)
1543 self.assertEqual(addr[1], socket.AF_CAN)
1544
1545 def _testSendFrame(self):
1546 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1547 self.cli.send(self.cf)
1548
1549 def testSendMaxFrame(self):
1550 cf, addr = self.s.recvfrom(self.bufsize)
1551 self.assertEqual(self.cf, cf)
1552
1553 def _testSendMaxFrame(self):
1554 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1555 self.cli.send(self.cf)
1556
1557 def testSendMultiFrames(self):
1558 cf, addr = self.s.recvfrom(self.bufsize)
1559 self.assertEqual(self.cf1, cf)
1560
1561 cf, addr = self.s.recvfrom(self.bufsize)
1562 self.assertEqual(self.cf2, cf)
1563
1564 def _testSendMultiFrames(self):
1565 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1566 self.cli.send(self.cf1)
1567
1568 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1569 self.cli.send(self.cf2)
1570
Charles-François Natali773e42d2013-02-05 19:42:01 +01001571 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1572 'socket.CAN_BCM required for this test.')
1573 def _testBCM(self):
1574 cf, addr = self.cli.recvfrom(self.bufsize)
1575 self.assertEqual(self.cf, cf)
1576 can_id, can_dlc, data = self.dissect_can_frame(cf)
1577 self.assertEqual(self.can_id, can_id)
1578 self.assertEqual(self.data, data)
1579
1580 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1581 'socket.CAN_BCM required for this test.')
1582 def testBCM(self):
1583 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1584 self.addCleanup(bcm.close)
1585 bcm.connect((self.interface,))
1586 self.can_id = 0x123
1587 self.data = bytes([0xc0, 0xff, 0xee])
1588 self.cf = self.build_can_frame(self.can_id, self.data)
1589 opcode = socket.CAN_BCM_TX_SEND
1590 flags = 0
1591 count = 0
1592 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1593 bcm_can_id = 0x0222
1594 nframes = 1
1595 assert len(self.cf) == 16
1596 header = struct.pack(self.bcm_cmd_msg_fmt,
1597 opcode,
1598 flags,
1599 count,
1600 ival1_seconds,
1601 ival1_usec,
1602 ival2_seconds,
1603 ival2_usec,
1604 bcm_can_id,
1605 nframes,
1606 )
1607 header_plus_frame = header + self.cf
1608 bytes_sent = bcm.send(header_plus_frame)
1609 self.assertEqual(bytes_sent, len(header_plus_frame))
1610
Charles-François Natali47413c12011-10-06 19:47:44 +02001611
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001612@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1613class BasicRDSTest(unittest.TestCase):
1614
1615 def testCrucialConstants(self):
1616 socket.AF_RDS
1617 socket.PF_RDS
1618
1619 def testCreateSocket(self):
1620 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1621 pass
1622
1623 def testSocketBufferSize(self):
1624 bufsize = 16384
1625 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1626 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1627 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1628
1629
1630@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1631@unittest.skipUnless(thread, 'Threading required for this test.')
1632class RDSTest(ThreadedRDSSocketTest):
1633
1634 def __init__(self, methodName='runTest'):
1635 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1636
Charles-François Natali240c55f2011-11-10 20:33:36 +01001637 def setUp(self):
1638 super().setUp()
1639 self.evt = threading.Event()
1640
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001641 def testSendAndRecv(self):
1642 data, addr = self.serv.recvfrom(self.bufsize)
1643 self.assertEqual(self.data, data)
1644 self.assertEqual(self.cli_addr, addr)
1645
1646 def _testSendAndRecv(self):
1647 self.data = b'spam'
1648 self.cli.sendto(self.data, 0, (HOST, self.port))
1649
1650 def testPeek(self):
1651 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1652 self.assertEqual(self.data, data)
1653 data, addr = self.serv.recvfrom(self.bufsize)
1654 self.assertEqual(self.data, data)
1655
1656 def _testPeek(self):
1657 self.data = b'spam'
1658 self.cli.sendto(self.data, 0, (HOST, self.port))
1659
1660 @requireAttrs(socket.socket, 'recvmsg')
1661 def testSendAndRecvMsg(self):
1662 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1663 self.assertEqual(self.data, data)
1664
1665 @requireAttrs(socket.socket, 'sendmsg')
1666 def _testSendAndRecvMsg(self):
1667 self.data = b'hello ' * 10
1668 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1669
1670 def testSendAndRecvMulti(self):
1671 data, addr = self.serv.recvfrom(self.bufsize)
1672 self.assertEqual(self.data1, data)
1673
1674 data, addr = self.serv.recvfrom(self.bufsize)
1675 self.assertEqual(self.data2, data)
1676
1677 def _testSendAndRecvMulti(self):
1678 self.data1 = b'bacon'
1679 self.cli.sendto(self.data1, 0, (HOST, self.port))
1680
1681 self.data2 = b'egg'
1682 self.cli.sendto(self.data2, 0, (HOST, self.port))
1683
1684 def testSelect(self):
1685 r, w, x = select.select([self.serv], [], [], 3.0)
1686 self.assertIn(self.serv, r)
1687 data, addr = self.serv.recvfrom(self.bufsize)
1688 self.assertEqual(self.data, data)
1689
1690 def _testSelect(self):
1691 self.data = b'select'
1692 self.cli.sendto(self.data, 0, (HOST, self.port))
1693
1694 def testCongestion(self):
1695 # wait until the sender is done
1696 self.evt.wait()
1697
1698 def _testCongestion(self):
1699 # test the behavior in case of congestion
1700 self.data = b'fill'
1701 self.cli.setblocking(False)
1702 try:
1703 # try to lower the receiver's socket buffer size
1704 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1705 except OSError:
1706 pass
1707 with self.assertRaises(OSError) as cm:
1708 try:
1709 # fill the receiver's socket buffer
1710 while True:
1711 self.cli.sendto(self.data, 0, (HOST, self.port))
1712 finally:
1713 # signal the receiver we're done
1714 self.evt.set()
1715 # sendto() should have failed with ENOBUFS
1716 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1717 # and we should have received a congestion notification through poll
1718 r, w, x = select.select([self.serv], [], [], 3.0)
1719 self.assertIn(self.serv, r)
1720
1721
Victor Stinner45df8202010-04-28 22:31:17 +00001722@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001723class BasicTCPTest(SocketConnectedTest):
1724
1725 def __init__(self, methodName='runTest'):
1726 SocketConnectedTest.__init__(self, methodName=methodName)
1727
1728 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001729 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001730 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001731 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001732
1733 def _testRecv(self):
1734 self.serv_conn.send(MSG)
1735
1736 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001737 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001738 seg1 = self.cli_conn.recv(len(MSG) - 3)
1739 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001740 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001741 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001742
1743 def _testOverFlowRecv(self):
1744 self.serv_conn.send(MSG)
1745
1746 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001747 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001748 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001749 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001750
1751 def _testRecvFrom(self):
1752 self.serv_conn.send(MSG)
1753
1754 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001755 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001756 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1757 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001758 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001759 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001760
1761 def _testOverFlowRecvFrom(self):
1762 self.serv_conn.send(MSG)
1763
1764 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001765 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001766 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001767 while 1:
1768 read = self.cli_conn.recv(1024)
1769 if not read:
1770 break
Guido van Rossume531e292002-08-08 20:28:34 +00001771 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001772 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001773
1774 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001775 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001776 self.serv_conn.sendall(big_chunk)
1777
1778 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001779 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001780 fd = self.cli_conn.fileno()
1781 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001782 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001783 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001784 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001785 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001786
1787 def _testFromFd(self):
1788 self.serv_conn.send(MSG)
1789
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001790 def testDup(self):
1791 # Testing dup()
1792 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001793 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001794 msg = sock.recv(1024)
1795 self.assertEqual(msg, MSG)
1796
1797 def _testDup(self):
1798 self.serv_conn.send(MSG)
1799
Guido van Rossum24e4af82002-06-12 19:18:08 +00001800 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001801 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001802 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001803 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001804 # wait for _testShutdown to finish: on OS X, when the server
1805 # closes the connection the client also becomes disconnected,
1806 # and the client's shutdown call will fail. (Issue #4397.)
1807 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001808
1809 def _testShutdown(self):
1810 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001811 self.serv_conn.shutdown(2)
1812
1813 testShutdown_overflow = support.cpython_only(testShutdown)
1814
1815 @support.cpython_only
1816 def _testShutdown_overflow(self):
1817 import _testcapi
1818 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02001819 # Issue 15989
1820 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1821 _testcapi.INT_MAX + 1)
1822 self.assertRaises(OverflowError, self.serv_conn.shutdown,
1823 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001824 self.serv_conn.shutdown(2)
1825
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001826 def testDetach(self):
1827 # Testing detach()
1828 fileno = self.cli_conn.fileno()
1829 f = self.cli_conn.detach()
1830 self.assertEqual(f, fileno)
1831 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001832 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02001833 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001834 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001835 # ...but we can create another socket using the (still open)
1836 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001837 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001838 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001839 msg = sock.recv(1024)
1840 self.assertEqual(msg, MSG)
1841
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001842 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001843 self.serv_conn.send(MSG)
1844
Victor Stinner45df8202010-04-28 22:31:17 +00001845@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001846class BasicUDPTest(ThreadedUDPSocketTest):
1847
1848 def __init__(self, methodName='runTest'):
1849 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1850
1851 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001852 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001853 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001854 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001855
1856 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001857 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001858
Guido van Rossum1c938012002-06-12 21:17:20 +00001859 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001860 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001861 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001862 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001863
Guido van Rossum1c938012002-06-12 21:17:20 +00001864 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001865 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001866
Guido van Rossumd8faa362007-04-27 19:54:29 +00001867 def testRecvFromNegative(self):
1868 # Negative lengths passed to recvfrom should give ValueError.
1869 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1870
1871 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001872 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001873
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001874# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1875# same test code is used with different families and types of socket
1876# (e.g. stream, datagram), and tests using recvmsg() are repeated
1877# using recvmsg_into().
1878#
1879# The generic test classes such as SendmsgTests and
1880# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1881# supplied with sockets cli_sock and serv_sock representing the
1882# client's and the server's end of the connection respectively, and
1883# attributes cli_addr and serv_addr holding their (numeric where
1884# appropriate) addresses.
1885#
1886# The final concrete test classes combine these with subclasses of
1887# SocketTestBase which set up client and server sockets of a specific
1888# type, and with subclasses of SendrecvmsgBase such as
1889# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1890# sockets to cli_sock and serv_sock and override the methods and
1891# attributes of SendrecvmsgBase to fill in destination addresses if
1892# needed when sending, check for specific flags in msg_flags, etc.
1893#
1894# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1895# recvmsg_into().
1896
1897# XXX: like the other datagram (UDP) tests in this module, the code
1898# here assumes that datagram delivery on the local machine will be
1899# reliable.
1900
1901class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1902 # Base class for sendmsg()/recvmsg() tests.
1903
1904 # Time in seconds to wait before considering a test failed, or
1905 # None for no timeout. Not all tests actually set a timeout.
1906 fail_timeout = 3.0
1907
1908 def setUp(self):
1909 self.misc_event = threading.Event()
1910 super().setUp()
1911
1912 def sendToServer(self, msg):
1913 # Send msg to the server.
1914 return self.cli_sock.send(msg)
1915
1916 # Tuple of alternative default arguments for sendmsg() when called
1917 # via sendmsgToServer() (e.g. to include a destination address).
1918 sendmsg_to_server_defaults = ()
1919
1920 def sendmsgToServer(self, *args):
1921 # Call sendmsg() on self.cli_sock with the given arguments,
1922 # filling in any arguments which are not supplied with the
1923 # corresponding items of self.sendmsg_to_server_defaults, if
1924 # any.
1925 return self.cli_sock.sendmsg(
1926 *(args + self.sendmsg_to_server_defaults[len(args):]))
1927
1928 def doRecvmsg(self, sock, bufsize, *args):
1929 # Call recvmsg() on sock with given arguments and return its
1930 # result. Should be used for tests which can use either
1931 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1932 # this method with one which emulates it using recvmsg_into(),
1933 # thus allowing the same test to be used for both methods.
1934 result = sock.recvmsg(bufsize, *args)
1935 self.registerRecvmsgResult(result)
1936 return result
1937
1938 def registerRecvmsgResult(self, result):
1939 # Called by doRecvmsg() with the return value of recvmsg() or
1940 # recvmsg_into(). Can be overridden to arrange cleanup based
1941 # on the returned ancillary data, for instance.
1942 pass
1943
1944 def checkRecvmsgAddress(self, addr1, addr2):
1945 # Called to compare the received address with the address of
1946 # the peer.
1947 self.assertEqual(addr1, addr2)
1948
1949 # Flags that are normally unset in msg_flags
1950 msg_flags_common_unset = 0
1951 for name in ("MSG_CTRUNC", "MSG_OOB"):
1952 msg_flags_common_unset |= getattr(socket, name, 0)
1953
1954 # Flags that are normally set
1955 msg_flags_common_set = 0
1956
1957 # Flags set when a complete record has been received (e.g. MSG_EOR
1958 # for SCTP)
1959 msg_flags_eor_indicator = 0
1960
1961 # Flags set when a complete record has not been received
1962 # (e.g. MSG_TRUNC for datagram sockets)
1963 msg_flags_non_eor_indicator = 0
1964
1965 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1966 # Method to check the value of msg_flags returned by recvmsg[_into]().
1967 #
1968 # Checks that all bits in msg_flags_common_set attribute are
1969 # set in "flags" and all bits in msg_flags_common_unset are
1970 # unset.
1971 #
1972 # The "eor" argument specifies whether the flags should
1973 # indicate that a full record (or datagram) has been received.
1974 # If "eor" is None, no checks are done; otherwise, checks
1975 # that:
1976 #
1977 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1978 # set and all bits in msg_flags_non_eor_indicator are unset
1979 #
1980 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1981 # are set and all bits in msg_flags_eor_indicator are unset
1982 #
1983 # If "checkset" and/or "checkunset" are supplied, they require
1984 # the given bits to be set or unset respectively, overriding
1985 # what the attributes require for those bits.
1986 #
1987 # If any bits are set in "ignore", they will not be checked,
1988 # regardless of the other inputs.
1989 #
1990 # Will raise Exception if the inputs require a bit to be both
1991 # set and unset, and it is not ignored.
1992
1993 defaultset = self.msg_flags_common_set
1994 defaultunset = self.msg_flags_common_unset
1995
1996 if eor:
1997 defaultset |= self.msg_flags_eor_indicator
1998 defaultunset |= self.msg_flags_non_eor_indicator
1999 elif eor is not None:
2000 defaultset |= self.msg_flags_non_eor_indicator
2001 defaultunset |= self.msg_flags_eor_indicator
2002
2003 # Function arguments override defaults
2004 defaultset &= ~checkunset
2005 defaultunset &= ~checkset
2006
2007 # Merge arguments with remaining defaults, and check for conflicts
2008 checkset |= defaultset
2009 checkunset |= defaultunset
2010 inboth = checkset & checkunset & ~ignore
2011 if inboth:
2012 raise Exception("contradictory set, unset requirements for flags "
2013 "{0:#x}".format(inboth))
2014
2015 # Compare with given msg_flags value
2016 mask = (checkset | checkunset) & ~ignore
2017 self.assertEqual(flags & mask, checkset & mask)
2018
2019
2020class RecvmsgIntoMixin(SendrecvmsgBase):
2021 # Mixin to implement doRecvmsg() using recvmsg_into().
2022
2023 def doRecvmsg(self, sock, bufsize, *args):
2024 buf = bytearray(bufsize)
2025 result = sock.recvmsg_into([buf], *args)
2026 self.registerRecvmsgResult(result)
2027 self.assertGreaterEqual(result[0], 0)
2028 self.assertLessEqual(result[0], bufsize)
2029 return (bytes(buf[:result[0]]),) + result[1:]
2030
2031
2032class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2033 # Defines flags to be checked in msg_flags for datagram sockets.
2034
2035 @property
2036 def msg_flags_non_eor_indicator(self):
2037 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2038
2039
2040class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2041 # Defines flags to be checked in msg_flags for SCTP sockets.
2042
2043 @property
2044 def msg_flags_eor_indicator(self):
2045 return super().msg_flags_eor_indicator | socket.MSG_EOR
2046
2047
2048class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2049 # Base class for tests on connectionless-mode sockets. Users must
2050 # supply sockets on attributes cli and serv to be mapped to
2051 # cli_sock and serv_sock respectively.
2052
2053 @property
2054 def serv_sock(self):
2055 return self.serv
2056
2057 @property
2058 def cli_sock(self):
2059 return self.cli
2060
2061 @property
2062 def sendmsg_to_server_defaults(self):
2063 return ([], [], 0, self.serv_addr)
2064
2065 def sendToServer(self, msg):
2066 return self.cli_sock.sendto(msg, self.serv_addr)
2067
2068
2069class SendrecvmsgConnectedBase(SendrecvmsgBase):
2070 # Base class for tests on connected sockets. Users must supply
2071 # sockets on attributes serv_conn and cli_conn (representing the
2072 # connections *to* the server and the client), to be mapped to
2073 # cli_sock and serv_sock respectively.
2074
2075 @property
2076 def serv_sock(self):
2077 return self.cli_conn
2078
2079 @property
2080 def cli_sock(self):
2081 return self.serv_conn
2082
2083 def checkRecvmsgAddress(self, addr1, addr2):
2084 # Address is currently "unspecified" for a connected socket,
2085 # so we don't examine it
2086 pass
2087
2088
2089class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2090 # Base class to set a timeout on server's socket.
2091
2092 def setUp(self):
2093 super().setUp()
2094 self.serv_sock.settimeout(self.fail_timeout)
2095
2096
2097class SendmsgTests(SendrecvmsgServerTimeoutBase):
2098 # Tests for sendmsg() which can use any socket type and do not
2099 # involve recvmsg() or recvmsg_into().
2100
2101 def testSendmsg(self):
2102 # Send a simple message with sendmsg().
2103 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2104
2105 def _testSendmsg(self):
2106 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2107
2108 def testSendmsgDataGenerator(self):
2109 # Send from buffer obtained from a generator (not a sequence).
2110 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2111
2112 def _testSendmsgDataGenerator(self):
2113 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2114 len(MSG))
2115
2116 def testSendmsgAncillaryGenerator(self):
2117 # Gather (empty) ancillary data from a generator.
2118 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2119
2120 def _testSendmsgAncillaryGenerator(self):
2121 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2122 len(MSG))
2123
2124 def testSendmsgArray(self):
2125 # Send data from an array instead of the usual bytes object.
2126 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2127
2128 def _testSendmsgArray(self):
2129 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2130 len(MSG))
2131
2132 def testSendmsgGather(self):
2133 # Send message data from more than one buffer (gather write).
2134 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2135
2136 def _testSendmsgGather(self):
2137 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2138
2139 def testSendmsgBadArgs(self):
2140 # Check that sendmsg() rejects invalid arguments.
2141 self.assertEqual(self.serv_sock.recv(1000), b"done")
2142
2143 def _testSendmsgBadArgs(self):
2144 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2145 self.assertRaises(TypeError, self.sendmsgToServer,
2146 b"not in an iterable")
2147 self.assertRaises(TypeError, self.sendmsgToServer,
2148 object())
2149 self.assertRaises(TypeError, self.sendmsgToServer,
2150 [object()])
2151 self.assertRaises(TypeError, self.sendmsgToServer,
2152 [MSG, object()])
2153 self.assertRaises(TypeError, self.sendmsgToServer,
2154 [MSG], object())
2155 self.assertRaises(TypeError, self.sendmsgToServer,
2156 [MSG], [], object())
2157 self.assertRaises(TypeError, self.sendmsgToServer,
2158 [MSG], [], 0, object())
2159 self.sendToServer(b"done")
2160
2161 def testSendmsgBadCmsg(self):
2162 # Check that invalid ancillary data items are rejected.
2163 self.assertEqual(self.serv_sock.recv(1000), b"done")
2164
2165 def _testSendmsgBadCmsg(self):
2166 self.assertRaises(TypeError, self.sendmsgToServer,
2167 [MSG], [object()])
2168 self.assertRaises(TypeError, self.sendmsgToServer,
2169 [MSG], [(object(), 0, b"data")])
2170 self.assertRaises(TypeError, self.sendmsgToServer,
2171 [MSG], [(0, object(), b"data")])
2172 self.assertRaises(TypeError, self.sendmsgToServer,
2173 [MSG], [(0, 0, object())])
2174 self.assertRaises(TypeError, self.sendmsgToServer,
2175 [MSG], [(0, 0)])
2176 self.assertRaises(TypeError, self.sendmsgToServer,
2177 [MSG], [(0, 0, b"data", 42)])
2178 self.sendToServer(b"done")
2179
2180 @requireAttrs(socket, "CMSG_SPACE")
2181 def testSendmsgBadMultiCmsg(self):
2182 # Check that invalid ancillary data items are rejected when
2183 # more than one item is present.
2184 self.assertEqual(self.serv_sock.recv(1000), b"done")
2185
2186 @testSendmsgBadMultiCmsg.client_skip
2187 def _testSendmsgBadMultiCmsg(self):
2188 self.assertRaises(TypeError, self.sendmsgToServer,
2189 [MSG], [0, 0, b""])
2190 self.assertRaises(TypeError, self.sendmsgToServer,
2191 [MSG], [(0, 0, b""), object()])
2192 self.sendToServer(b"done")
2193
2194 def testSendmsgExcessCmsgReject(self):
2195 # Check that sendmsg() rejects excess ancillary data items
2196 # when the number that can be sent is limited.
2197 self.assertEqual(self.serv_sock.recv(1000), b"done")
2198
2199 def _testSendmsgExcessCmsgReject(self):
2200 if not hasattr(socket, "CMSG_SPACE"):
2201 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002202 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002203 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2204 self.assertIsNone(cm.exception.errno)
2205 self.sendToServer(b"done")
2206
2207 def testSendmsgAfterClose(self):
2208 # Check that sendmsg() fails on a closed socket.
2209 pass
2210
2211 def _testSendmsgAfterClose(self):
2212 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002213 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002214
2215
2216class SendmsgStreamTests(SendmsgTests):
2217 # Tests for sendmsg() which require a stream socket and do not
2218 # involve recvmsg() or recvmsg_into().
2219
2220 def testSendmsgExplicitNoneAddr(self):
2221 # Check that peer address can be specified as None.
2222 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2223
2224 def _testSendmsgExplicitNoneAddr(self):
2225 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2226
2227 def testSendmsgTimeout(self):
2228 # Check that timeout works with sendmsg().
2229 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2230 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2231
2232 def _testSendmsgTimeout(self):
2233 try:
2234 self.cli_sock.settimeout(0.03)
2235 with self.assertRaises(socket.timeout):
2236 while True:
2237 self.sendmsgToServer([b"a"*512])
2238 finally:
2239 self.misc_event.set()
2240
2241 # XXX: would be nice to have more tests for sendmsg flags argument.
2242
2243 # Linux supports MSG_DONTWAIT when sending, but in general, it
2244 # only works when receiving. Could add other platforms if they
2245 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002246 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002247 "MSG_DONTWAIT not known to work on this platform when "
2248 "sending")
2249 def testSendmsgDontWait(self):
2250 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2251 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2252 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2253
2254 @testSendmsgDontWait.client_skip
2255 def _testSendmsgDontWait(self):
2256 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002257 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002258 while True:
2259 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2260 self.assertIn(cm.exception.errno,
2261 (errno.EAGAIN, errno.EWOULDBLOCK))
2262 finally:
2263 self.misc_event.set()
2264
2265
2266class SendmsgConnectionlessTests(SendmsgTests):
2267 # Tests for sendmsg() which require a connectionless-mode
2268 # (e.g. datagram) socket, and do not involve recvmsg() or
2269 # recvmsg_into().
2270
2271 def testSendmsgNoDestAddr(self):
2272 # Check that sendmsg() fails when no destination address is
2273 # given for unconnected socket.
2274 pass
2275
2276 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002277 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002278 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002279 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002280 [MSG], [], 0, None)
2281
2282
2283class RecvmsgGenericTests(SendrecvmsgBase):
2284 # Tests for recvmsg() which can also be emulated using
2285 # recvmsg_into(), and can use any socket type.
2286
2287 def testRecvmsg(self):
2288 # Receive a simple message with recvmsg[_into]().
2289 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2290 self.assertEqual(msg, MSG)
2291 self.checkRecvmsgAddress(addr, self.cli_addr)
2292 self.assertEqual(ancdata, [])
2293 self.checkFlags(flags, eor=True)
2294
2295 def _testRecvmsg(self):
2296 self.sendToServer(MSG)
2297
2298 def testRecvmsgExplicitDefaults(self):
2299 # Test recvmsg[_into]() with default arguments provided explicitly.
2300 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2301 len(MSG), 0, 0)
2302 self.assertEqual(msg, MSG)
2303 self.checkRecvmsgAddress(addr, self.cli_addr)
2304 self.assertEqual(ancdata, [])
2305 self.checkFlags(flags, eor=True)
2306
2307 def _testRecvmsgExplicitDefaults(self):
2308 self.sendToServer(MSG)
2309
2310 def testRecvmsgShorter(self):
2311 # Receive a message smaller than buffer.
2312 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2313 len(MSG) + 42)
2314 self.assertEqual(msg, MSG)
2315 self.checkRecvmsgAddress(addr, self.cli_addr)
2316 self.assertEqual(ancdata, [])
2317 self.checkFlags(flags, eor=True)
2318
2319 def _testRecvmsgShorter(self):
2320 self.sendToServer(MSG)
2321
Charles-François Natali8619cd72011-10-03 19:43:15 +02002322 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2323 # datagram is received (issue #13001).
2324 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002325 def testRecvmsgTrunc(self):
2326 # Receive part of message, check for truncation indicators.
2327 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2328 len(MSG) - 3)
2329 self.assertEqual(msg, MSG[:-3])
2330 self.checkRecvmsgAddress(addr, self.cli_addr)
2331 self.assertEqual(ancdata, [])
2332 self.checkFlags(flags, eor=False)
2333
Charles-François Natali8619cd72011-10-03 19:43:15 +02002334 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002335 def _testRecvmsgTrunc(self):
2336 self.sendToServer(MSG)
2337
2338 def testRecvmsgShortAncillaryBuf(self):
2339 # Test ancillary data buffer too small to hold any ancillary data.
2340 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2341 len(MSG), 1)
2342 self.assertEqual(msg, MSG)
2343 self.checkRecvmsgAddress(addr, self.cli_addr)
2344 self.assertEqual(ancdata, [])
2345 self.checkFlags(flags, eor=True)
2346
2347 def _testRecvmsgShortAncillaryBuf(self):
2348 self.sendToServer(MSG)
2349
2350 def testRecvmsgLongAncillaryBuf(self):
2351 # Test large ancillary data buffer.
2352 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2353 len(MSG), 10240)
2354 self.assertEqual(msg, MSG)
2355 self.checkRecvmsgAddress(addr, self.cli_addr)
2356 self.assertEqual(ancdata, [])
2357 self.checkFlags(flags, eor=True)
2358
2359 def _testRecvmsgLongAncillaryBuf(self):
2360 self.sendToServer(MSG)
2361
2362 def testRecvmsgAfterClose(self):
2363 # Check that recvmsg[_into]() fails on a closed socket.
2364 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002365 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002366
2367 def _testRecvmsgAfterClose(self):
2368 pass
2369
2370 def testRecvmsgTimeout(self):
2371 # Check that timeout works.
2372 try:
2373 self.serv_sock.settimeout(0.03)
2374 self.assertRaises(socket.timeout,
2375 self.doRecvmsg, self.serv_sock, len(MSG))
2376 finally:
2377 self.misc_event.set()
2378
2379 def _testRecvmsgTimeout(self):
2380 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2381
2382 @requireAttrs(socket, "MSG_PEEK")
2383 def testRecvmsgPeek(self):
2384 # Check that MSG_PEEK in flags enables examination of pending
2385 # data without consuming it.
2386
2387 # Receive part of data with MSG_PEEK.
2388 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2389 len(MSG) - 3, 0,
2390 socket.MSG_PEEK)
2391 self.assertEqual(msg, MSG[:-3])
2392 self.checkRecvmsgAddress(addr, self.cli_addr)
2393 self.assertEqual(ancdata, [])
2394 # Ignoring MSG_TRUNC here (so this test is the same for stream
2395 # and datagram sockets). Some wording in POSIX seems to
2396 # suggest that it needn't be set when peeking, but that may
2397 # just be a slip.
2398 self.checkFlags(flags, eor=False,
2399 ignore=getattr(socket, "MSG_TRUNC", 0))
2400
2401 # Receive all data with MSG_PEEK.
2402 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2403 len(MSG), 0,
2404 socket.MSG_PEEK)
2405 self.assertEqual(msg, MSG)
2406 self.checkRecvmsgAddress(addr, self.cli_addr)
2407 self.assertEqual(ancdata, [])
2408 self.checkFlags(flags, eor=True)
2409
2410 # Check that the same data can still be received normally.
2411 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2412 self.assertEqual(msg, MSG)
2413 self.checkRecvmsgAddress(addr, self.cli_addr)
2414 self.assertEqual(ancdata, [])
2415 self.checkFlags(flags, eor=True)
2416
2417 @testRecvmsgPeek.client_skip
2418 def _testRecvmsgPeek(self):
2419 self.sendToServer(MSG)
2420
2421 @requireAttrs(socket.socket, "sendmsg")
2422 def testRecvmsgFromSendmsg(self):
2423 # Test receiving with recvmsg[_into]() when message is sent
2424 # using sendmsg().
2425 self.serv_sock.settimeout(self.fail_timeout)
2426 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2427 self.assertEqual(msg, MSG)
2428 self.checkRecvmsgAddress(addr, self.cli_addr)
2429 self.assertEqual(ancdata, [])
2430 self.checkFlags(flags, eor=True)
2431
2432 @testRecvmsgFromSendmsg.client_skip
2433 def _testRecvmsgFromSendmsg(self):
2434 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2435
2436
2437class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2438 # Tests which require a stream socket and can use either recvmsg()
2439 # or recvmsg_into().
2440
2441 def testRecvmsgEOF(self):
2442 # Receive end-of-stream indicator (b"", peer socket closed).
2443 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2444 self.assertEqual(msg, b"")
2445 self.checkRecvmsgAddress(addr, self.cli_addr)
2446 self.assertEqual(ancdata, [])
2447 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2448
2449 def _testRecvmsgEOF(self):
2450 self.cli_sock.close()
2451
2452 def testRecvmsgOverflow(self):
2453 # Receive a message in more than one chunk.
2454 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2455 len(MSG) - 3)
2456 self.checkRecvmsgAddress(addr, self.cli_addr)
2457 self.assertEqual(ancdata, [])
2458 self.checkFlags(flags, eor=False)
2459
2460 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2461 self.checkRecvmsgAddress(addr, self.cli_addr)
2462 self.assertEqual(ancdata, [])
2463 self.checkFlags(flags, eor=True)
2464
2465 msg = seg1 + seg2
2466 self.assertEqual(msg, MSG)
2467
2468 def _testRecvmsgOverflow(self):
2469 self.sendToServer(MSG)
2470
2471
2472class RecvmsgTests(RecvmsgGenericTests):
2473 # Tests for recvmsg() which can use any socket type.
2474
2475 def testRecvmsgBadArgs(self):
2476 # Check that recvmsg() rejects invalid arguments.
2477 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2478 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2479 -1, 0, 0)
2480 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2481 len(MSG), -1, 0)
2482 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2483 [bytearray(10)], 0, 0)
2484 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2485 object(), 0, 0)
2486 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2487 len(MSG), object(), 0)
2488 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2489 len(MSG), 0, object())
2490
2491 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2492 self.assertEqual(msg, MSG)
2493 self.checkRecvmsgAddress(addr, self.cli_addr)
2494 self.assertEqual(ancdata, [])
2495 self.checkFlags(flags, eor=True)
2496
2497 def _testRecvmsgBadArgs(self):
2498 self.sendToServer(MSG)
2499
2500
2501class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2502 # Tests for recvmsg_into() which can use any socket type.
2503
2504 def testRecvmsgIntoBadArgs(self):
2505 # Check that recvmsg_into() rejects invalid arguments.
2506 buf = bytearray(len(MSG))
2507 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2508 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2509 len(MSG), 0, 0)
2510 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2511 buf, 0, 0)
2512 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2513 [object()], 0, 0)
2514 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2515 [b"I'm not writable"], 0, 0)
2516 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2517 [buf, object()], 0, 0)
2518 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2519 [buf], -1, 0)
2520 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2521 [buf], object(), 0)
2522 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2523 [buf], 0, object())
2524
2525 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2526 self.assertEqual(nbytes, len(MSG))
2527 self.assertEqual(buf, bytearray(MSG))
2528 self.checkRecvmsgAddress(addr, self.cli_addr)
2529 self.assertEqual(ancdata, [])
2530 self.checkFlags(flags, eor=True)
2531
2532 def _testRecvmsgIntoBadArgs(self):
2533 self.sendToServer(MSG)
2534
2535 def testRecvmsgIntoGenerator(self):
2536 # Receive into buffer obtained from a generator (not a sequence).
2537 buf = bytearray(len(MSG))
2538 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2539 (o for o in [buf]))
2540 self.assertEqual(nbytes, len(MSG))
2541 self.assertEqual(buf, bytearray(MSG))
2542 self.checkRecvmsgAddress(addr, self.cli_addr)
2543 self.assertEqual(ancdata, [])
2544 self.checkFlags(flags, eor=True)
2545
2546 def _testRecvmsgIntoGenerator(self):
2547 self.sendToServer(MSG)
2548
2549 def testRecvmsgIntoArray(self):
2550 # Receive into an array rather than the usual bytearray.
2551 buf = array.array("B", [0] * len(MSG))
2552 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2553 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002554 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002555 self.checkRecvmsgAddress(addr, self.cli_addr)
2556 self.assertEqual(ancdata, [])
2557 self.checkFlags(flags, eor=True)
2558
2559 def _testRecvmsgIntoArray(self):
2560 self.sendToServer(MSG)
2561
2562 def testRecvmsgIntoScatter(self):
2563 # Receive into multiple buffers (scatter write).
2564 b1 = bytearray(b"----")
2565 b2 = bytearray(b"0123456789")
2566 b3 = bytearray(b"--------------")
2567 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2568 [b1, memoryview(b2)[2:9], b3])
2569 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2570 self.assertEqual(b1, bytearray(b"Mary"))
2571 self.assertEqual(b2, bytearray(b"01 had a 9"))
2572 self.assertEqual(b3, bytearray(b"little lamb---"))
2573 self.checkRecvmsgAddress(addr, self.cli_addr)
2574 self.assertEqual(ancdata, [])
2575 self.checkFlags(flags, eor=True)
2576
2577 def _testRecvmsgIntoScatter(self):
2578 self.sendToServer(b"Mary had a little lamb")
2579
2580
2581class CmsgMacroTests(unittest.TestCase):
2582 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2583 # assumptions used by sendmsg() and recvmsg[_into](), which share
2584 # code with these functions.
2585
2586 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002587 try:
2588 import _testcapi
2589 except ImportError:
2590 socklen_t_limit = 0x7fffffff
2591 else:
2592 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002593
2594 @requireAttrs(socket, "CMSG_LEN")
2595 def testCMSG_LEN(self):
2596 # Test CMSG_LEN() with various valid and invalid values,
2597 # checking the assumptions used by recvmsg() and sendmsg().
2598 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2599 values = list(range(257)) + list(range(toobig - 257, toobig))
2600
2601 # struct cmsghdr has at least three members, two of which are ints
2602 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2603 for n in values:
2604 ret = socket.CMSG_LEN(n)
2605 # This is how recvmsg() calculates the data size
2606 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2607 self.assertLessEqual(ret, self.socklen_t_limit)
2608
2609 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2610 # sendmsg() shares code with these functions, and requires
2611 # that it reject values over the limit.
2612 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2613 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2614
2615 @requireAttrs(socket, "CMSG_SPACE")
2616 def testCMSG_SPACE(self):
2617 # Test CMSG_SPACE() with various valid and invalid values,
2618 # checking the assumptions used by sendmsg().
2619 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2620 values = list(range(257)) + list(range(toobig - 257, toobig))
2621
2622 last = socket.CMSG_SPACE(0)
2623 # struct cmsghdr has at least three members, two of which are ints
2624 self.assertGreater(last, array.array("i").itemsize * 2)
2625 for n in values:
2626 ret = socket.CMSG_SPACE(n)
2627 self.assertGreaterEqual(ret, last)
2628 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2629 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2630 self.assertLessEqual(ret, self.socklen_t_limit)
2631 last = ret
2632
2633 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2634 # sendmsg() shares code with these functions, and requires
2635 # that it reject values over the limit.
2636 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2637 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2638
2639
2640class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2641 # Tests for file descriptor passing on Unix-domain sockets.
2642
2643 # Invalid file descriptor value that's unlikely to evaluate to a
2644 # real FD even if one of its bytes is replaced with a different
2645 # value (which shouldn't actually happen).
2646 badfd = -0x5555
2647
2648 def newFDs(self, n):
2649 # Return a list of n file descriptors for newly-created files
2650 # containing their list indices as ASCII numbers.
2651 fds = []
2652 for i in range(n):
2653 fd, path = tempfile.mkstemp()
2654 self.addCleanup(os.unlink, path)
2655 self.addCleanup(os.close, fd)
2656 os.write(fd, str(i).encode())
2657 fds.append(fd)
2658 return fds
2659
2660 def checkFDs(self, fds):
2661 # Check that the file descriptors in the given list contain
2662 # their correct list indices as ASCII numbers.
2663 for n, fd in enumerate(fds):
2664 os.lseek(fd, 0, os.SEEK_SET)
2665 self.assertEqual(os.read(fd, 1024), str(n).encode())
2666
2667 def registerRecvmsgResult(self, result):
2668 self.addCleanup(self.closeRecvmsgFDs, result)
2669
2670 def closeRecvmsgFDs(self, recvmsg_result):
2671 # Close all file descriptors specified in the ancillary data
2672 # of the given return value from recvmsg() or recvmsg_into().
2673 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2674 if (cmsg_level == socket.SOL_SOCKET and
2675 cmsg_type == socket.SCM_RIGHTS):
2676 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002677 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002678 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2679 for fd in fds:
2680 os.close(fd)
2681
2682 def createAndSendFDs(self, n):
2683 # Send n new file descriptors created by newFDs() to the
2684 # server, with the constant MSG as the non-ancillary data.
2685 self.assertEqual(
2686 self.sendmsgToServer([MSG],
2687 [(socket.SOL_SOCKET,
2688 socket.SCM_RIGHTS,
2689 array.array("i", self.newFDs(n)))]),
2690 len(MSG))
2691
2692 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2693 # Check that constant MSG was received with numfds file
2694 # descriptors in a maximum of maxcmsgs control messages (which
2695 # must contain only complete integers). By default, check
2696 # that MSG_CTRUNC is unset, but ignore any flags in
2697 # ignoreflags.
2698 msg, ancdata, flags, addr = result
2699 self.assertEqual(msg, MSG)
2700 self.checkRecvmsgAddress(addr, self.cli_addr)
2701 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2702 ignore=ignoreflags)
2703
2704 self.assertIsInstance(ancdata, list)
2705 self.assertLessEqual(len(ancdata), maxcmsgs)
2706 fds = array.array("i")
2707 for item in ancdata:
2708 self.assertIsInstance(item, tuple)
2709 cmsg_level, cmsg_type, cmsg_data = item
2710 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2711 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2712 self.assertIsInstance(cmsg_data, bytes)
2713 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002714 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002715
2716 self.assertEqual(len(fds), numfds)
2717 self.checkFDs(fds)
2718
2719 def testFDPassSimple(self):
2720 # Pass a single FD (array read from bytes object).
2721 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2722 len(MSG), 10240))
2723
2724 def _testFDPassSimple(self):
2725 self.assertEqual(
2726 self.sendmsgToServer(
2727 [MSG],
2728 [(socket.SOL_SOCKET,
2729 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002730 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002731 len(MSG))
2732
2733 def testMultipleFDPass(self):
2734 # Pass multiple FDs in a single array.
2735 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2736 len(MSG), 10240))
2737
2738 def _testMultipleFDPass(self):
2739 self.createAndSendFDs(4)
2740
2741 @requireAttrs(socket, "CMSG_SPACE")
2742 def testFDPassCMSG_SPACE(self):
2743 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2744 self.checkRecvmsgFDs(
2745 4, self.doRecvmsg(self.serv_sock, len(MSG),
2746 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2747
2748 @testFDPassCMSG_SPACE.client_skip
2749 def _testFDPassCMSG_SPACE(self):
2750 self.createAndSendFDs(4)
2751
2752 def testFDPassCMSG_LEN(self):
2753 # Test using CMSG_LEN() to calculate ancillary buffer size.
2754 self.checkRecvmsgFDs(1,
2755 self.doRecvmsg(self.serv_sock, len(MSG),
2756 socket.CMSG_LEN(4 * SIZEOF_INT)),
2757 # RFC 3542 says implementations may set
2758 # MSG_CTRUNC if there isn't enough space
2759 # for trailing padding.
2760 ignoreflags=socket.MSG_CTRUNC)
2761
2762 def _testFDPassCMSG_LEN(self):
2763 self.createAndSendFDs(1)
2764
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002765 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002766 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002767 @requireAttrs(socket, "CMSG_SPACE")
2768 def testFDPassSeparate(self):
2769 # Pass two FDs in two separate arrays. Arrays may be combined
2770 # into a single control message by the OS.
2771 self.checkRecvmsgFDs(2,
2772 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2773 maxcmsgs=2)
2774
2775 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002776 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002777 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002778 def _testFDPassSeparate(self):
2779 fd0, fd1 = self.newFDs(2)
2780 self.assertEqual(
2781 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2782 socket.SCM_RIGHTS,
2783 array.array("i", [fd0])),
2784 (socket.SOL_SOCKET,
2785 socket.SCM_RIGHTS,
2786 array.array("i", [fd1]))]),
2787 len(MSG))
2788
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002789 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002790 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002791 @requireAttrs(socket, "CMSG_SPACE")
2792 def testFDPassSeparateMinSpace(self):
2793 # Pass two FDs in two separate arrays, receiving them into the
2794 # minimum space for two arrays.
2795 self.checkRecvmsgFDs(2,
2796 self.doRecvmsg(self.serv_sock, len(MSG),
2797 socket.CMSG_SPACE(SIZEOF_INT) +
2798 socket.CMSG_LEN(SIZEOF_INT)),
2799 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2800
2801 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02002802 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12002803 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002804 def _testFDPassSeparateMinSpace(self):
2805 fd0, fd1 = self.newFDs(2)
2806 self.assertEqual(
2807 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2808 socket.SCM_RIGHTS,
2809 array.array("i", [fd0])),
2810 (socket.SOL_SOCKET,
2811 socket.SCM_RIGHTS,
2812 array.array("i", [fd1]))]),
2813 len(MSG))
2814
2815 def sendAncillaryIfPossible(self, msg, ancdata):
2816 # Try to send msg and ancdata to server, but if the system
2817 # call fails, just send msg with no ancillary data.
2818 try:
2819 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002820 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002821 # Check that it was the system call that failed
2822 self.assertIsInstance(e.errno, int)
2823 nbytes = self.sendmsgToServer([msg])
2824 self.assertEqual(nbytes, len(msg))
2825
Brett Cannon3bbad122015-12-28 17:21:44 -08002826 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002827 def testFDPassEmpty(self):
2828 # Try to pass an empty FD array. Can receive either no array
2829 # or an empty array.
2830 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2831 len(MSG), 10240),
2832 ignoreflags=socket.MSG_CTRUNC)
2833
2834 def _testFDPassEmpty(self):
2835 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2836 socket.SCM_RIGHTS,
2837 b"")])
2838
2839 def testFDPassPartialInt(self):
2840 # Try to pass a truncated FD array.
2841 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2842 len(MSG), 10240)
2843 self.assertEqual(msg, MSG)
2844 self.checkRecvmsgAddress(addr, self.cli_addr)
2845 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2846 self.assertLessEqual(len(ancdata), 1)
2847 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2848 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2849 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2850 self.assertLess(len(cmsg_data), SIZEOF_INT)
2851
2852 def _testFDPassPartialInt(self):
2853 self.sendAncillaryIfPossible(
2854 MSG,
2855 [(socket.SOL_SOCKET,
2856 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002857 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002858
2859 @requireAttrs(socket, "CMSG_SPACE")
2860 def testFDPassPartialIntInMiddle(self):
2861 # Try to pass two FD arrays, the first of which is truncated.
2862 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2863 len(MSG), 10240)
2864 self.assertEqual(msg, MSG)
2865 self.checkRecvmsgAddress(addr, self.cli_addr)
2866 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2867 self.assertLessEqual(len(ancdata), 2)
2868 fds = array.array("i")
2869 # Arrays may have been combined in a single control message
2870 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2871 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2872 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002873 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002874 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2875 self.assertLessEqual(len(fds), 2)
2876 self.checkFDs(fds)
2877
2878 @testFDPassPartialIntInMiddle.client_skip
2879 def _testFDPassPartialIntInMiddle(self):
2880 fd0, fd1 = self.newFDs(2)
2881 self.sendAncillaryIfPossible(
2882 MSG,
2883 [(socket.SOL_SOCKET,
2884 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002885 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002886 (socket.SOL_SOCKET,
2887 socket.SCM_RIGHTS,
2888 array.array("i", [fd1]))])
2889
2890 def checkTruncatedHeader(self, result, ignoreflags=0):
2891 # Check that no ancillary data items are returned when data is
2892 # truncated inside the cmsghdr structure.
2893 msg, ancdata, flags, addr = result
2894 self.assertEqual(msg, MSG)
2895 self.checkRecvmsgAddress(addr, self.cli_addr)
2896 self.assertEqual(ancdata, [])
2897 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2898 ignore=ignoreflags)
2899
2900 def testCmsgTruncNoBufSize(self):
2901 # Check that no ancillary data is received when no buffer size
2902 # is specified.
2903 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2904 # BSD seems to set MSG_CTRUNC only
2905 # if an item has been partially
2906 # received.
2907 ignoreflags=socket.MSG_CTRUNC)
2908
2909 def _testCmsgTruncNoBufSize(self):
2910 self.createAndSendFDs(1)
2911
2912 def testCmsgTrunc0(self):
2913 # Check that no ancillary data is received when buffer size is 0.
2914 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2915 ignoreflags=socket.MSG_CTRUNC)
2916
2917 def _testCmsgTrunc0(self):
2918 self.createAndSendFDs(1)
2919
2920 # Check that no ancillary data is returned for various non-zero
2921 # (but still too small) buffer sizes.
2922
2923 def testCmsgTrunc1(self):
2924 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2925
2926 def _testCmsgTrunc1(self):
2927 self.createAndSendFDs(1)
2928
2929 def testCmsgTrunc2Int(self):
2930 # The cmsghdr structure has at least three members, two of
2931 # which are ints, so we still shouldn't see any ancillary
2932 # data.
2933 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2934 SIZEOF_INT * 2))
2935
2936 def _testCmsgTrunc2Int(self):
2937 self.createAndSendFDs(1)
2938
2939 def testCmsgTruncLen0Minus1(self):
2940 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2941 socket.CMSG_LEN(0) - 1))
2942
2943 def _testCmsgTruncLen0Minus1(self):
2944 self.createAndSendFDs(1)
2945
2946 # The following tests try to truncate the control message in the
2947 # middle of the FD array.
2948
2949 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2950 # Check that file descriptor data is truncated to between
2951 # mindata and maxdata bytes when received with buffer size
2952 # ancbuf, and that any complete file descriptor numbers are
2953 # valid.
2954 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2955 len(MSG), ancbuf)
2956 self.assertEqual(msg, MSG)
2957 self.checkRecvmsgAddress(addr, self.cli_addr)
2958 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2959
2960 if mindata == 0 and ancdata == []:
2961 return
2962 self.assertEqual(len(ancdata), 1)
2963 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2964 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2965 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2966 self.assertGreaterEqual(len(cmsg_data), mindata)
2967 self.assertLessEqual(len(cmsg_data), maxdata)
2968 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002969 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002970 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2971 self.checkFDs(fds)
2972
2973 def testCmsgTruncLen0(self):
2974 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2975
2976 def _testCmsgTruncLen0(self):
2977 self.createAndSendFDs(1)
2978
2979 def testCmsgTruncLen0Plus1(self):
2980 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2981
2982 def _testCmsgTruncLen0Plus1(self):
2983 self.createAndSendFDs(2)
2984
2985 def testCmsgTruncLen1(self):
2986 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2987 maxdata=SIZEOF_INT)
2988
2989 def _testCmsgTruncLen1(self):
2990 self.createAndSendFDs(2)
2991
2992 def testCmsgTruncLen2Minus1(self):
2993 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2994 maxdata=(2 * SIZEOF_INT) - 1)
2995
2996 def _testCmsgTruncLen2Minus1(self):
2997 self.createAndSendFDs(2)
2998
2999
3000class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3001 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3002 # features of the RFC 3542 Advanced Sockets API for IPv6.
3003 # Currently we can only handle certain data items (e.g. traffic
3004 # class, hop limit, MTU discovery and fragmentation settings)
3005 # without resorting to unportable means such as the struct module,
3006 # but the tests here are aimed at testing the ancillary data
3007 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3008 # itself.
3009
3010 # Test value to use when setting hop limit of packet
3011 hop_limit = 2
3012
3013 # Test value to use when setting traffic class of packet.
3014 # -1 means "use kernel default".
3015 traffic_class = -1
3016
3017 def ancillaryMapping(self, ancdata):
3018 # Given ancillary data list ancdata, return a mapping from
3019 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3020 # Check that no (level, type) pair appears more than once.
3021 d = {}
3022 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3023 self.assertNotIn((cmsg_level, cmsg_type), d)
3024 d[(cmsg_level, cmsg_type)] = cmsg_data
3025 return d
3026
3027 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3028 # Receive hop limit into ancbufsize bytes of ancillary data
3029 # space. Check that data is MSG, ancillary data is not
3030 # truncated (but ignore any flags in ignoreflags), and hop
3031 # limit is between 0 and maxhop inclusive.
3032 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3033 socket.IPV6_RECVHOPLIMIT, 1)
3034 self.misc_event.set()
3035 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3036 len(MSG), ancbufsize)
3037
3038 self.assertEqual(msg, MSG)
3039 self.checkRecvmsgAddress(addr, self.cli_addr)
3040 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3041 ignore=ignoreflags)
3042
3043 self.assertEqual(len(ancdata), 1)
3044 self.assertIsInstance(ancdata[0], tuple)
3045 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3046 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3047 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3048 self.assertIsInstance(cmsg_data, bytes)
3049 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3050 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003051 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003052 self.assertGreaterEqual(a[0], 0)
3053 self.assertLessEqual(a[0], maxhop)
3054
3055 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3056 def testRecvHopLimit(self):
3057 # Test receiving the packet hop limit as ancillary data.
3058 self.checkHopLimit(ancbufsize=10240)
3059
3060 @testRecvHopLimit.client_skip
3061 def _testRecvHopLimit(self):
3062 # Need to wait until server has asked to receive ancillary
3063 # data, as implementations are not required to buffer it
3064 # otherwise.
3065 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3066 self.sendToServer(MSG)
3067
3068 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3069 def testRecvHopLimitCMSG_SPACE(self):
3070 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3071 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3072
3073 @testRecvHopLimitCMSG_SPACE.client_skip
3074 def _testRecvHopLimitCMSG_SPACE(self):
3075 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3076 self.sendToServer(MSG)
3077
3078 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3079 # 3542 says portable applications must provide space for trailing
3080 # padding. Implementations may set MSG_CTRUNC if there isn't
3081 # enough space for the padding.
3082
3083 @requireAttrs(socket.socket, "sendmsg")
3084 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3085 def testSetHopLimit(self):
3086 # Test setting hop limit on outgoing packet and receiving it
3087 # at the other end.
3088 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3089
3090 @testSetHopLimit.client_skip
3091 def _testSetHopLimit(self):
3092 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3093 self.assertEqual(
3094 self.sendmsgToServer([MSG],
3095 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3096 array.array("i", [self.hop_limit]))]),
3097 len(MSG))
3098
3099 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3100 ignoreflags=0):
3101 # Receive traffic class and hop limit into ancbufsize bytes of
3102 # ancillary data space. Check that data is MSG, ancillary
3103 # data is not truncated (but ignore any flags in ignoreflags),
3104 # and traffic class and hop limit are in range (hop limit no
3105 # more than maxhop).
3106 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3107 socket.IPV6_RECVHOPLIMIT, 1)
3108 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3109 socket.IPV6_RECVTCLASS, 1)
3110 self.misc_event.set()
3111 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3112 len(MSG), ancbufsize)
3113
3114 self.assertEqual(msg, MSG)
3115 self.checkRecvmsgAddress(addr, self.cli_addr)
3116 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3117 ignore=ignoreflags)
3118 self.assertEqual(len(ancdata), 2)
3119 ancmap = self.ancillaryMapping(ancdata)
3120
3121 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3122 self.assertEqual(len(tcdata), SIZEOF_INT)
3123 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003124 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003125 self.assertGreaterEqual(a[0], 0)
3126 self.assertLessEqual(a[0], 255)
3127
3128 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3129 self.assertEqual(len(hldata), SIZEOF_INT)
3130 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003131 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003132 self.assertGreaterEqual(a[0], 0)
3133 self.assertLessEqual(a[0], maxhop)
3134
3135 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3136 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3137 def testRecvTrafficClassAndHopLimit(self):
3138 # Test receiving traffic class and hop limit as ancillary data.
3139 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3140
3141 @testRecvTrafficClassAndHopLimit.client_skip
3142 def _testRecvTrafficClassAndHopLimit(self):
3143 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3144 self.sendToServer(MSG)
3145
3146 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3147 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3148 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3149 # Test receiving traffic class and hop limit, using
3150 # CMSG_SPACE() to calculate buffer size.
3151 self.checkTrafficClassAndHopLimit(
3152 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3153
3154 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3155 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3156 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3157 self.sendToServer(MSG)
3158
3159 @requireAttrs(socket.socket, "sendmsg")
3160 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3161 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3162 def testSetTrafficClassAndHopLimit(self):
3163 # Test setting traffic class and hop limit on outgoing packet,
3164 # and receiving them at the other end.
3165 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3166 maxhop=self.hop_limit)
3167
3168 @testSetTrafficClassAndHopLimit.client_skip
3169 def _testSetTrafficClassAndHopLimit(self):
3170 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3171 self.assertEqual(
3172 self.sendmsgToServer([MSG],
3173 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3174 array.array("i", [self.traffic_class])),
3175 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3176 array.array("i", [self.hop_limit]))]),
3177 len(MSG))
3178
3179 @requireAttrs(socket.socket, "sendmsg")
3180 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3181 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3182 def testOddCmsgSize(self):
3183 # Try to send ancillary data with first item one byte too
3184 # long. Fall back to sending with correct size if this fails,
3185 # and check that second item was handled correctly.
3186 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3187 maxhop=self.hop_limit)
3188
3189 @testOddCmsgSize.client_skip
3190 def _testOddCmsgSize(self):
3191 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3192 try:
3193 nbytes = self.sendmsgToServer(
3194 [MSG],
3195 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003196 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003197 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3198 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003199 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003200 self.assertIsInstance(e.errno, int)
3201 nbytes = self.sendmsgToServer(
3202 [MSG],
3203 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3204 array.array("i", [self.traffic_class])),
3205 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3206 array.array("i", [self.hop_limit]))])
3207 self.assertEqual(nbytes, len(MSG))
3208
3209 # Tests for proper handling of truncated ancillary data
3210
3211 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3212 # Receive hop limit into ancbufsize bytes of ancillary data
3213 # space, which should be too small to contain the ancillary
3214 # data header (if ancbufsize is None, pass no second argument
3215 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3216 # (unless included in ignoreflags), and no ancillary data is
3217 # returned.
3218 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3219 socket.IPV6_RECVHOPLIMIT, 1)
3220 self.misc_event.set()
3221 args = () if ancbufsize is None else (ancbufsize,)
3222 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3223 len(MSG), *args)
3224
3225 self.assertEqual(msg, MSG)
3226 self.checkRecvmsgAddress(addr, self.cli_addr)
3227 self.assertEqual(ancdata, [])
3228 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3229 ignore=ignoreflags)
3230
3231 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3232 def testCmsgTruncNoBufSize(self):
3233 # Check that no ancillary data is received when no ancillary
3234 # buffer size is provided.
3235 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3236 # BSD seems to set
3237 # MSG_CTRUNC only if an item
3238 # has been partially
3239 # received.
3240 ignoreflags=socket.MSG_CTRUNC)
3241
3242 @testCmsgTruncNoBufSize.client_skip
3243 def _testCmsgTruncNoBufSize(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 testSingleCmsgTrunc0(self):
3249 # Check that no ancillary data is received when ancillary
3250 # buffer size is zero.
3251 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3252 ignoreflags=socket.MSG_CTRUNC)
3253
3254 @testSingleCmsgTrunc0.client_skip
3255 def _testSingleCmsgTrunc0(self):
3256 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3257 self.sendToServer(MSG)
3258
3259 # Check that no ancillary data is returned for various non-zero
3260 # (but still too small) buffer sizes.
3261
3262 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3263 def testSingleCmsgTrunc1(self):
3264 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3265
3266 @testSingleCmsgTrunc1.client_skip
3267 def _testSingleCmsgTrunc1(self):
3268 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3269 self.sendToServer(MSG)
3270
3271 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3272 def testSingleCmsgTrunc2Int(self):
3273 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3274
3275 @testSingleCmsgTrunc2Int.client_skip
3276 def _testSingleCmsgTrunc2Int(self):
3277 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3278 self.sendToServer(MSG)
3279
3280 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3281 def testSingleCmsgTruncLen0Minus1(self):
3282 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3283
3284 @testSingleCmsgTruncLen0Minus1.client_skip
3285 def _testSingleCmsgTruncLen0Minus1(self):
3286 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3287 self.sendToServer(MSG)
3288
3289 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3290 def testSingleCmsgTruncInData(self):
3291 # Test truncation of a control message inside its associated
3292 # data. The message may be returned with its data truncated,
3293 # or not returned at all.
3294 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3295 socket.IPV6_RECVHOPLIMIT, 1)
3296 self.misc_event.set()
3297 msg, ancdata, flags, addr = self.doRecvmsg(
3298 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3299
3300 self.assertEqual(msg, MSG)
3301 self.checkRecvmsgAddress(addr, self.cli_addr)
3302 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3303
3304 self.assertLessEqual(len(ancdata), 1)
3305 if ancdata:
3306 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3307 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3308 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3309 self.assertLess(len(cmsg_data), SIZEOF_INT)
3310
3311 @testSingleCmsgTruncInData.client_skip
3312 def _testSingleCmsgTruncInData(self):
3313 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3314 self.sendToServer(MSG)
3315
3316 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3317 # Receive traffic class and hop limit into ancbufsize bytes of
3318 # ancillary data space, which should be large enough to
3319 # contain the first item, but too small to contain the header
3320 # of the second. Check that data is MSG, MSG_CTRUNC is set
3321 # (unless included in ignoreflags), and only one ancillary
3322 # data item is returned.
3323 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3324 socket.IPV6_RECVHOPLIMIT, 1)
3325 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3326 socket.IPV6_RECVTCLASS, 1)
3327 self.misc_event.set()
3328 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3329 len(MSG), ancbufsize)
3330
3331 self.assertEqual(msg, MSG)
3332 self.checkRecvmsgAddress(addr, self.cli_addr)
3333 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3334 ignore=ignoreflags)
3335
3336 self.assertEqual(len(ancdata), 1)
3337 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3338 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3339 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3340 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3341 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003342 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003343 self.assertGreaterEqual(a[0], 0)
3344 self.assertLessEqual(a[0], 255)
3345
3346 # Try the above test with various buffer sizes.
3347
3348 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3349 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3350 def testSecondCmsgTrunc0(self):
3351 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3352 ignoreflags=socket.MSG_CTRUNC)
3353
3354 @testSecondCmsgTrunc0.client_skip
3355 def _testSecondCmsgTrunc0(self):
3356 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3357 self.sendToServer(MSG)
3358
3359 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3360 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3361 def testSecondCmsgTrunc1(self):
3362 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3363
3364 @testSecondCmsgTrunc1.client_skip
3365 def _testSecondCmsgTrunc1(self):
3366 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3367 self.sendToServer(MSG)
3368
3369 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3370 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3371 def testSecondCmsgTrunc2Int(self):
3372 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3373 2 * SIZEOF_INT)
3374
3375 @testSecondCmsgTrunc2Int.client_skip
3376 def _testSecondCmsgTrunc2Int(self):
3377 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3378 self.sendToServer(MSG)
3379
3380 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3381 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3382 def testSecondCmsgTruncLen0Minus1(self):
3383 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3384 socket.CMSG_LEN(0) - 1)
3385
3386 @testSecondCmsgTruncLen0Minus1.client_skip
3387 def _testSecondCmsgTruncLen0Minus1(self):
3388 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3389 self.sendToServer(MSG)
3390
3391 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3392 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3393 def testSecomdCmsgTruncInData(self):
3394 # Test truncation of the second of two control messages inside
3395 # its associated data.
3396 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3397 socket.IPV6_RECVHOPLIMIT, 1)
3398 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3399 socket.IPV6_RECVTCLASS, 1)
3400 self.misc_event.set()
3401 msg, ancdata, flags, addr = self.doRecvmsg(
3402 self.serv_sock, len(MSG),
3403 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3404
3405 self.assertEqual(msg, MSG)
3406 self.checkRecvmsgAddress(addr, self.cli_addr)
3407 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3408
3409 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3410
3411 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3412 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3413 cmsg_types.remove(cmsg_type)
3414 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3415 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003416 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003417 self.assertGreaterEqual(a[0], 0)
3418 self.assertLessEqual(a[0], 255)
3419
3420 if ancdata:
3421 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3422 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3423 cmsg_types.remove(cmsg_type)
3424 self.assertLess(len(cmsg_data), SIZEOF_INT)
3425
3426 self.assertEqual(ancdata, [])
3427
3428 @testSecomdCmsgTruncInData.client_skip
3429 def _testSecomdCmsgTruncInData(self):
3430 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3431 self.sendToServer(MSG)
3432
3433
3434# Derive concrete test classes for different socket types.
3435
3436class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3437 SendrecvmsgConnectionlessBase,
3438 ThreadedSocketTestMixin, UDPTestBase):
3439 pass
3440
3441@requireAttrs(socket.socket, "sendmsg")
3442@unittest.skipUnless(thread, 'Threading required for this test.')
3443class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3444 pass
3445
3446@requireAttrs(socket.socket, "recvmsg")
3447@unittest.skipUnless(thread, 'Threading required for this test.')
3448class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3449 pass
3450
3451@requireAttrs(socket.socket, "recvmsg_into")
3452@unittest.skipUnless(thread, 'Threading required for this test.')
3453class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3454 pass
3455
3456
3457class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3458 SendrecvmsgConnectionlessBase,
3459 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003460
3461 def checkRecvmsgAddress(self, addr1, addr2):
3462 # Called to compare the received address with the address of
3463 # the peer, ignoring scope ID
3464 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003465
3466@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003467@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003468@requireSocket("AF_INET6", "SOCK_DGRAM")
3469@unittest.skipUnless(thread, 'Threading required for this test.')
3470class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3471 pass
3472
3473@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003474@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003475@requireSocket("AF_INET6", "SOCK_DGRAM")
3476@unittest.skipUnless(thread, 'Threading required for this test.')
3477class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3478 pass
3479
3480@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003481@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003482@requireSocket("AF_INET6", "SOCK_DGRAM")
3483@unittest.skipUnless(thread, 'Threading required for this test.')
3484class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3485 pass
3486
3487@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003488@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003489@requireAttrs(socket, "IPPROTO_IPV6")
3490@requireSocket("AF_INET6", "SOCK_DGRAM")
3491@unittest.skipUnless(thread, 'Threading required for this test.')
3492class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3493 SendrecvmsgUDP6TestBase):
3494 pass
3495
3496@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003497@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003498@requireAttrs(socket, "IPPROTO_IPV6")
3499@requireSocket("AF_INET6", "SOCK_DGRAM")
3500@unittest.skipUnless(thread, 'Threading required for this test.')
3501class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3502 RFC3542AncillaryTest,
3503 SendrecvmsgUDP6TestBase):
3504 pass
3505
3506
3507class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3508 ConnectedStreamTestMixin, TCPTestBase):
3509 pass
3510
3511@requireAttrs(socket.socket, "sendmsg")
3512@unittest.skipUnless(thread, 'Threading required for this test.')
3513class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3514 pass
3515
3516@requireAttrs(socket.socket, "recvmsg")
3517@unittest.skipUnless(thread, 'Threading required for this test.')
3518class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3519 SendrecvmsgTCPTestBase):
3520 pass
3521
3522@requireAttrs(socket.socket, "recvmsg_into")
3523@unittest.skipUnless(thread, 'Threading required for this test.')
3524class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3525 SendrecvmsgTCPTestBase):
3526 pass
3527
3528
3529class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3530 SendrecvmsgConnectedBase,
3531 ConnectedStreamTestMixin, SCTPStreamBase):
3532 pass
3533
3534@requireAttrs(socket.socket, "sendmsg")
3535@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3536@unittest.skipUnless(thread, 'Threading required for this test.')
3537class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3538 pass
3539
3540@requireAttrs(socket.socket, "recvmsg")
3541@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3542@unittest.skipUnless(thread, 'Threading required for this test.')
3543class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3544 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003545
3546 def testRecvmsgEOF(self):
3547 try:
3548 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3549 except OSError as e:
3550 if e.errno != errno.ENOTCONN:
3551 raise
3552 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003553
3554@requireAttrs(socket.socket, "recvmsg_into")
3555@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3556@unittest.skipUnless(thread, 'Threading required for this test.')
3557class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3558 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003559
3560 def testRecvmsgEOF(self):
3561 try:
3562 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3563 except OSError as e:
3564 if e.errno != errno.ENOTCONN:
3565 raise
3566 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003567
3568
3569class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3570 ConnectedStreamTestMixin, UnixStreamBase):
3571 pass
3572
3573@requireAttrs(socket.socket, "sendmsg")
3574@requireAttrs(socket, "AF_UNIX")
3575@unittest.skipUnless(thread, 'Threading required for this test.')
3576class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3577 pass
3578
3579@requireAttrs(socket.socket, "recvmsg")
3580@requireAttrs(socket, "AF_UNIX")
3581@unittest.skipUnless(thread, 'Threading required for this test.')
3582class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3583 SendrecvmsgUnixStreamTestBase):
3584 pass
3585
3586@requireAttrs(socket.socket, "recvmsg_into")
3587@requireAttrs(socket, "AF_UNIX")
3588@unittest.skipUnless(thread, 'Threading required for this test.')
3589class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3590 SendrecvmsgUnixStreamTestBase):
3591 pass
3592
3593@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3594@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3595@unittest.skipUnless(thread, 'Threading required for this test.')
3596class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3597 pass
3598
3599@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3600@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3601@unittest.skipUnless(thread, 'Threading required for this test.')
3602class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3603 SendrecvmsgUnixStreamTestBase):
3604 pass
3605
3606
3607# Test interrupting the interruptible send/receive methods with a
3608# signal when a timeout is set. These tests avoid having multiple
3609# threads alive during the test so that the OS cannot deliver the
3610# signal to the wrong one.
3611
3612class InterruptedTimeoutBase(unittest.TestCase):
3613 # Base class for interrupted send/receive tests. Installs an
3614 # empty handler for SIGALRM and removes it on teardown, along with
3615 # any scheduled alarms.
3616
3617 def setUp(self):
3618 super().setUp()
3619 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003620 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003621 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3622 self.addCleanup(self.setAlarm, 0)
3623
3624 # Timeout for socket operations
3625 timeout = 4.0
3626
3627 # Provide setAlarm() method to schedule delivery of SIGALRM after
3628 # given number of seconds, or cancel it if zero, and an
3629 # appropriate time value to use. Use setitimer() if available.
3630 if hasattr(signal, "setitimer"):
3631 alarm_time = 0.05
3632
3633 def setAlarm(self, seconds):
3634 signal.setitimer(signal.ITIMER_REAL, seconds)
3635 else:
3636 # Old systems may deliver the alarm up to one second early
3637 alarm_time = 2
3638
3639 def setAlarm(self, seconds):
3640 signal.alarm(seconds)
3641
3642
3643# Require siginterrupt() in order to ensure that system calls are
3644# interrupted by default.
3645@requireAttrs(signal, "siginterrupt")
3646@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3647 "Don't have signal.alarm or signal.setitimer")
3648class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3649 # Test interrupting the recv*() methods with signals when a
3650 # timeout is set.
3651
3652 def setUp(self):
3653 super().setUp()
3654 self.serv.settimeout(self.timeout)
3655
3656 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003657 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003658 # errno of EINTR when interrupted by a signal.
3659 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003660 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003661 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003662
3663 def testInterruptedRecvTimeout(self):
3664 self.checkInterruptedRecv(self.serv.recv, 1024)
3665
3666 def testInterruptedRecvIntoTimeout(self):
3667 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3668
3669 def testInterruptedRecvfromTimeout(self):
3670 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3671
3672 def testInterruptedRecvfromIntoTimeout(self):
3673 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3674
3675 @requireAttrs(socket.socket, "recvmsg")
3676 def testInterruptedRecvmsgTimeout(self):
3677 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3678
3679 @requireAttrs(socket.socket, "recvmsg_into")
3680 def testInterruptedRecvmsgIntoTimeout(self):
3681 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3682
3683
3684# Require siginterrupt() in order to ensure that system calls are
3685# interrupted by default.
3686@requireAttrs(signal, "siginterrupt")
3687@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3688 "Don't have signal.alarm or signal.setitimer")
3689@unittest.skipUnless(thread, 'Threading required for this test.')
3690class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3691 ThreadSafeCleanupTestCase,
3692 SocketListeningTestMixin, TCPTestBase):
3693 # Test interrupting the interruptible send*() methods with signals
3694 # when a timeout is set.
3695
3696 def setUp(self):
3697 super().setUp()
3698 self.serv_conn = self.newSocket()
3699 self.addCleanup(self.serv_conn.close)
3700 # Use a thread to complete the connection, but wait for it to
3701 # terminate before running the test, so that there is only one
3702 # thread to accept the signal.
3703 cli_thread = threading.Thread(target=self.doConnect)
3704 cli_thread.start()
3705 self.cli_conn, addr = self.serv.accept()
3706 self.addCleanup(self.cli_conn.close)
3707 cli_thread.join()
3708 self.serv_conn.settimeout(self.timeout)
3709
3710 def doConnect(self):
3711 self.serv_conn.connect(self.serv_addr)
3712
3713 def checkInterruptedSend(self, func, *args, **kwargs):
3714 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003715 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003716 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003717 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003718 while True:
3719 self.setAlarm(self.alarm_time)
3720 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003721
Ned Deilyc5640382014-02-03 13:58:31 -08003722 # Issue #12958: The following tests have problems on OS X prior to 10.7
3723 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003724 def testInterruptedSendTimeout(self):
3725 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3726
Ned Deilyc5640382014-02-03 13:58:31 -08003727 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003728 def testInterruptedSendtoTimeout(self):
3729 # Passing an actual address here as Python's wrapper for
3730 # sendto() doesn't allow passing a zero-length one; POSIX
3731 # requires that the address is ignored since the socket is
3732 # connection-mode, however.
3733 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3734 self.serv_addr)
3735
Ned Deilyc5640382014-02-03 13:58:31 -08003736 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003737 @requireAttrs(socket.socket, "sendmsg")
3738 def testInterruptedSendmsgTimeout(self):
3739 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3740
3741
Victor Stinner45df8202010-04-28 22:31:17 +00003742@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003743class TCPCloserTest(ThreadedTCPSocketTest):
3744
3745 def testClose(self):
3746 conn, addr = self.serv.accept()
3747 conn.close()
3748
3749 sd = self.cli
3750 read, write, err = select.select([sd], [], [], 1.0)
3751 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003752 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003753
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003754 # Calling close() many times should be safe.
3755 conn.close()
3756 conn.close()
3757
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003758 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003759 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003760 time.sleep(1.0)
3761
Victor Stinner45df8202010-04-28 22:31:17 +00003762@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003763class BasicSocketPairTest(SocketPairTest):
3764
3765 def __init__(self, methodName='runTest'):
3766 SocketPairTest.__init__(self, methodName=methodName)
3767
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003768 def _check_defaults(self, sock):
3769 self.assertIsInstance(sock, socket.socket)
3770 if hasattr(socket, 'AF_UNIX'):
3771 self.assertEqual(sock.family, socket.AF_UNIX)
3772 else:
3773 self.assertEqual(sock.family, socket.AF_INET)
3774 self.assertEqual(sock.type, socket.SOCK_STREAM)
3775 self.assertEqual(sock.proto, 0)
3776
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003777 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003778 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003779
3780 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003781 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003782
Dave Cole331708b2004-08-09 04:51:41 +00003783 def testRecv(self):
3784 msg = self.serv.recv(1024)
3785 self.assertEqual(msg, MSG)
3786
3787 def _testRecv(self):
3788 self.cli.send(MSG)
3789
3790 def testSend(self):
3791 self.serv.send(MSG)
3792
3793 def _testSend(self):
3794 msg = self.cli.recv(1024)
3795 self.assertEqual(msg, MSG)
3796
Victor Stinner45df8202010-04-28 22:31:17 +00003797@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003798class NonBlockingTCPTests(ThreadedTCPSocketTest):
3799
3800 def __init__(self, methodName='runTest'):
3801 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3802
3803 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003804 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02003805 self.serv.setblocking(True)
3806 self.assertIsNone(self.serv.gettimeout())
3807 self.serv.setblocking(False)
3808 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003809 start = time.time()
3810 try:
3811 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003812 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003813 pass
3814 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003815 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003816
3817 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003818 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003819
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02003820 @support.cpython_only
3821 def testSetBlocking_overflow(self):
3822 # Issue 15989
3823 import _testcapi
3824 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
3825 self.skipTest('needs UINT_MAX < ULONG_MAX')
3826 self.serv.setblocking(False)
3827 self.assertEqual(self.serv.gettimeout(), 0.0)
3828 self.serv.setblocking(_testcapi.UINT_MAX + 1)
3829 self.assertIsNone(self.serv.gettimeout())
3830
3831 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
3832
Serhiy Storchaka43767632013-11-03 21:31:38 +02003833 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
3834 'test needs socket.SOCK_NONBLOCK')
3835 @support.requires_linux_version(2, 6, 28)
3836 def testInitNonBlocking(self):
3837 # reinit server socket
3838 self.serv.close()
3839 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
3840 socket.SOCK_NONBLOCK)
3841 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01003842 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02003843 # actual testing
3844 start = time.time()
3845 try:
3846 self.serv.accept()
3847 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00003848 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02003849 end = time.time()
3850 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3851
3852 def _testInitNonBlocking(self):
3853 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00003854
Antoine Pitrou600232b2011-01-05 21:03:42 +00003855 def testInheritFlags(self):
3856 # Issue #7995: when calling accept() on a listening socket with a
3857 # timeout, the resulting socket should not be non-blocking.
3858 self.serv.settimeout(10)
3859 try:
3860 conn, addr = self.serv.accept()
3861 message = conn.recv(len(MSG))
3862 finally:
3863 conn.close()
3864 self.serv.settimeout(None)
3865
3866 def _testInheritFlags(self):
3867 time.sleep(0.1)
3868 self.cli.connect((HOST, self.port))
3869 time.sleep(0.5)
3870 self.cli.send(MSG)
3871
Guido van Rossum24e4af82002-06-12 19:18:08 +00003872 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003873 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003874 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003875 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003876 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02003877 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003878 pass
3879 else:
3880 self.fail("Error trying to do non-blocking accept.")
3881 read, write, err = select.select([self.serv], [], [])
3882 if self.serv in read:
3883 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07003884 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00003885 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003886 else:
3887 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003888
Guido van Rossum24e4af82002-06-12 19:18:08 +00003889 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003890 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003891 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003892
3893 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003894 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003895 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003896 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003897
3898 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003899 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003900 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003901
3902 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003903 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003904 conn, addr = self.serv.accept()
3905 conn.setblocking(0)
3906 try:
3907 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02003908 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003909 pass
3910 else:
3911 self.fail("Error trying to do non-blocking recv.")
3912 read, write, err = select.select([conn], [], [])
3913 if conn in read:
3914 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003915 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003916 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003917 else:
3918 self.fail("Error during select call to non-blocking socket.")
3919
3920 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003921 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003922 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003923 self.cli.send(MSG)
3924
Victor Stinner45df8202010-04-28 22:31:17 +00003925@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003926class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003927 """Unit tests for the object returned by socket.makefile()
3928
Antoine Pitrou834bd812010-10-13 16:17:14 +00003929 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003930 the client connection. You can read from this file to
3931 get output from the server.
3932
Antoine Pitrou834bd812010-10-13 16:17:14 +00003933 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003934 server connection. You can write to this file to send output
3935 to the client.
3936 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003937
Guido van Rossume9f66142002-08-07 15:46:19 +00003938 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003939 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003940 errors = 'strict'
3941 newline = None
3942
3943 read_mode = 'rb'
3944 read_msg = MSG
3945 write_mode = 'wb'
3946 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003947
Guido van Rossum24e4af82002-06-12 19:18:08 +00003948 def __init__(self, methodName='runTest'):
3949 SocketConnectedTest.__init__(self, methodName=methodName)
3950
3951 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003952 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3953 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003954 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003955 self.read_file = self.cli_conn.makefile(
3956 self.read_mode, self.bufsize,
3957 encoding = self.encoding,
3958 errors = self.errors,
3959 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003960
3961 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003962 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003963 self.read_file.close()
3964 self.assertTrue(self.read_file.closed)
3965 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003966 SocketConnectedTest.tearDown(self)
3967
3968 def clientSetUp(self):
3969 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003970 self.write_file = self.serv_conn.makefile(
3971 self.write_mode, self.bufsize,
3972 encoding = self.encoding,
3973 errors = self.errors,
3974 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003975
3976 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003977 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003978 self.write_file.close()
3979 self.assertTrue(self.write_file.closed)
3980 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003981 SocketConnectedTest.clientTearDown(self)
3982
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003983 def testReadAfterTimeout(self):
3984 # Issue #7322: A file object must disallow further reads
3985 # after a timeout has occurred.
3986 self.cli_conn.settimeout(1)
3987 self.read_file.read(3)
3988 # First read raises a timeout
3989 self.assertRaises(socket.timeout, self.read_file.read, 1)
3990 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02003991 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003992 self.read_file.read(1)
3993 self.assertIn("cannot read from timed out object", str(ctx.exception))
3994
3995 def _testReadAfterTimeout(self):
3996 self.write_file.write(self.write_msg[0:3])
3997 self.write_file.flush()
3998 self.serv_finished.wait()
3999
Guido van Rossum24e4af82002-06-12 19:18:08 +00004000 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004001 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004002 first_seg = self.read_file.read(len(self.read_msg)-3)
4003 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004004 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004005 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004006
4007 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004008 self.write_file.write(self.write_msg)
4009 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004010
Guido van Rossum8c943832002-08-08 01:00:28 +00004011 def testFullRead(self):
4012 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004013 msg = self.read_file.read()
4014 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004015
4016 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004017 self.write_file.write(self.write_msg)
4018 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004019
Guido van Rossum24e4af82002-06-12 19:18:08 +00004020 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004021 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004022 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004023 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004024 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004025 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004026 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004027 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004029
4030 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004031 self.write_file.write(self.write_msg)
4032 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004033
4034 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004035 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004036 line = self.read_file.readline()
4037 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004038
4039 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004040 self.write_file.write(self.write_msg)
4041 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004042
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004043 def testCloseAfterMakefile(self):
4044 # The file returned by makefile should keep the socket open.
4045 self.cli_conn.close()
4046 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004047 msg = self.read_file.read()
4048 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004049
4050 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004051 self.write_file.write(self.write_msg)
4052 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004053
4054 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004055 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004056 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004057 if isinstance(self.read_msg, str):
4058 msg = msg.decode()
4059 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004060
4061 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004062 self.write_file.write(self.write_msg)
4063 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004064
Tim Peters116d83c2004-03-28 02:20:45 +00004065 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004066 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004067
4068 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004069 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004070
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004071 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004072 self.assertEqual(self.read_file.mode, self.read_mode)
4073 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004074
4075 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004076 self.assertEqual(self.write_file.mode, self.write_mode)
4077 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004078
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004079 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004080 self.read_file.close()
4081 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004082 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004083 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004084
4085 def _testRealClose(self):
4086 pass
4087
4088
Guido van Rossume9f66142002-08-07 15:46:19 +00004089class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4090
4091 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004092
Guido van Rossume9f66142002-08-07 15:46:19 +00004093 In this case (and in this case only), it should be possible to
4094 create a file object, read a line from it, create another file
4095 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004096 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004097 when reading multiple requests from the same socket."""
4098
4099 bufsize = 0 # Use unbuffered mode
4100
4101 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004102 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004103 line = self.read_file.readline() # first line
4104 self.assertEqual(line, b"A. " + self.write_msg) # first line
4105 self.read_file = self.cli_conn.makefile('rb', 0)
4106 line = self.read_file.readline() # second line
4107 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004108
4109 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004110 self.write_file.write(b"A. " + self.write_msg)
4111 self.write_file.write(b"B. " + self.write_msg)
4112 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004113
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004114 def testMakefileClose(self):
4115 # The file returned by makefile should keep the socket open...
4116 self.cli_conn.close()
4117 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004118 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004119 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004120 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004121 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004122
4123 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004124 self.write_file.write(self.write_msg)
4125 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004126
4127 def testMakefileCloseSocketDestroy(self):
4128 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004129 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004130 refcount_after = sys.getrefcount(self.cli_conn)
4131 self.assertEqual(refcount_before - 1, refcount_after)
4132
4133 def _testMakefileCloseSocketDestroy(self):
4134 pass
4135
Antoine Pitrou98b46702010-09-18 22:59:00 +00004136 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004137 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004138 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4139
4140 def testSmallReadNonBlocking(self):
4141 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004142 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4143 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004144 self.evt1.set()
4145 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004146 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004147 if first_seg is None:
4148 # Data not arrived (can happen under Windows), wait a bit
4149 time.sleep(0.5)
4150 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004151 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004152 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004153 self.assertEqual(n, 3)
4154 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004155 self.assertEqual(msg, self.read_msg)
4156 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4157 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004158
4159 def _testSmallReadNonBlocking(self):
4160 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004161 self.write_file.write(self.write_msg)
4162 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004163 self.evt2.set()
4164 # Avoid cloding the socket before the server test has finished,
4165 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4166 self.serv_finished.wait(5.0)
4167
4168 def testWriteNonBlocking(self):
4169 self.cli_finished.wait(5.0)
4170 # The client thread can't skip directly - the SkipTest exception
4171 # would appear as a failure.
4172 if self.serv_skipped:
4173 self.skipTest(self.serv_skipped)
4174
4175 def _testWriteNonBlocking(self):
4176 self.serv_skipped = None
4177 self.serv_conn.setblocking(False)
4178 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004179 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004180 LIMIT = 10
4181 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004182 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004183 self.assertGreater(n, 0)
4184 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004185 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004186 if n is None:
4187 # Succeeded
4188 break
4189 self.assertGreater(n, 0)
4190 else:
4191 # Let us know that this test didn't manage to establish
4192 # the expected conditions. This is not a failure in itself but,
4193 # if it happens repeatedly, the test should be fixed.
4194 self.serv_skipped = "failed to saturate the socket buffer"
4195
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004196
Guido van Rossum8c943832002-08-08 01:00:28 +00004197class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4198
4199 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4200
4201
4202class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4203
4204 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004205
Thomas Woutersb2137042007-02-01 18:02:27 +00004206
Antoine Pitrou834bd812010-10-13 16:17:14 +00004207class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4208 """Tests for socket.makefile() in text mode (rather than binary)"""
4209
4210 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004211 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004212 write_mode = 'wb'
4213 write_msg = MSG
4214 newline = ''
4215
4216
4217class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4218 """Tests for socket.makefile() in text mode (rather than binary)"""
4219
4220 read_mode = 'rb'
4221 read_msg = MSG
4222 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004223 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004224 newline = ''
4225
4226
4227class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4228 """Tests for socket.makefile() in text mode (rather than binary)"""
4229
4230 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004231 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004232 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004233 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004234 newline = ''
4235
4236
Guido van Rossumd8faa362007-04-27 19:54:29 +00004237class NetworkConnectionTest(object):
4238 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004239
Guido van Rossumd8faa362007-04-27 19:54:29 +00004240 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004241 # We're inherited below by BasicTCPTest2, which also inherits
4242 # BasicTCPTest, which defines self.port referenced below.
4243 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004244 self.serv_conn = self.cli
4245
4246class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4247 """Tests that NetworkConnection does not break existing TCP functionality.
4248 """
4249
4250class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004251
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004252 class MockSocket(socket.socket):
4253 def connect(self, *args):
4254 raise socket.timeout('timed out')
4255
4256 @contextlib.contextmanager
4257 def mocked_socket_module(self):
4258 """Return a socket which times out on connect"""
4259 old_socket = socket.socket
4260 socket.socket = self.MockSocket
4261 try:
4262 yield
4263 finally:
4264 socket.socket = old_socket
4265
4266 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004267 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004268 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004269 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004270 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004271 cli.connect((HOST, port))
4272 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4273
4274 def test_create_connection(self):
4275 # Issue #9792: errors raised by create_connection() should have
4276 # a proper errno attribute.
4277 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004278 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004279 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004280
4281 # Issue #16257: create_connection() calls getaddrinfo() against
4282 # 'localhost'. This may result in an IPV6 addr being returned
4283 # as well as an IPV4 one:
4284 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4285 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4286 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4287 #
4288 # create_connection() enumerates through all the addresses returned
4289 # and if it doesn't successfully bind to any of them, it propagates
4290 # the last exception it encountered.
4291 #
4292 # On Solaris, ENETUNREACH is returned in this circumstance instead
4293 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4294 # expected errnos.
4295 expected_errnos = [ errno.ECONNREFUSED, ]
4296 if hasattr(errno, 'ENETUNREACH'):
4297 expected_errnos.append(errno.ENETUNREACH)
4298
4299 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004300
4301 def test_create_connection_timeout(self):
4302 # Issue #9792: create_connection() should not recast timeout errors
4303 # as generic socket errors.
4304 with self.mocked_socket_module():
4305 with self.assertRaises(socket.timeout):
4306 socket.create_connection((HOST, 1234))
4307
Guido van Rossumd8faa362007-04-27 19:54:29 +00004308
Victor Stinner45df8202010-04-28 22:31:17 +00004309@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004310class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4311
4312 def __init__(self, methodName='runTest'):
4313 SocketTCPTest.__init__(self, methodName=methodName)
4314 ThreadableTest.__init__(self)
4315
4316 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004317 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004318
4319 def clientTearDown(self):
4320 self.cli.close()
4321 self.cli = None
4322 ThreadableTest.clientTearDown(self)
4323
4324 def _justAccept(self):
4325 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004326 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004327
4328 testFamily = _justAccept
4329 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004330 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004331 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004332 self.assertEqual(self.cli.family, 2)
4333
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004334 testSourceAddress = _justAccept
4335 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004336 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4337 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004338 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004339 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004340 # The port number being used is sufficient to show that the bind()
4341 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004342
Guido van Rossumd8faa362007-04-27 19:54:29 +00004343 testTimeoutDefault = _justAccept
4344 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004345 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004346 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004347 socket.setdefaulttimeout(42)
4348 try:
4349 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004350 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004351 finally:
4352 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004353 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004354
4355 testTimeoutNone = _justAccept
4356 def _testTimeoutNone(self):
4357 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004358 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004359 socket.setdefaulttimeout(30)
4360 try:
4361 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004362 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004363 finally:
4364 socket.setdefaulttimeout(None)
4365 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004366
4367 testTimeoutValueNamed = _justAccept
4368 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004369 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004370 self.assertEqual(self.cli.gettimeout(), 30)
4371
4372 testTimeoutValueNonamed = _justAccept
4373 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004374 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004375 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004376 self.assertEqual(self.cli.gettimeout(), 30)
4377
Victor Stinner45df8202010-04-28 22:31:17 +00004378@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004379class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4380
4381 def __init__(self, methodName='runTest'):
4382 SocketTCPTest.__init__(self, methodName=methodName)
4383 ThreadableTest.__init__(self)
4384
4385 def clientSetUp(self):
4386 pass
4387
4388 def clientTearDown(self):
4389 self.cli.close()
4390 self.cli = None
4391 ThreadableTest.clientTearDown(self)
4392
4393 def testInsideTimeout(self):
4394 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004395 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004396 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004397 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004398 testOutsideTimeout = testInsideTimeout
4399
4400 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004401 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004402 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004403 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004404
4405 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004406 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004407 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004408
4409
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004410class TCPTimeoutTest(SocketTCPTest):
4411
4412 def testTCPTimeout(self):
4413 def raise_timeout(*args, **kwargs):
4414 self.serv.settimeout(1.0)
4415 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004416 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004417 "Error generating a timeout exception (TCP)")
4418
4419 def testTimeoutZero(self):
4420 ok = False
4421 try:
4422 self.serv.settimeout(0.0)
4423 foo = self.serv.accept()
4424 except socket.timeout:
4425 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004426 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004427 ok = True
4428 except:
4429 self.fail("caught unexpected exception (TCP)")
4430 if not ok:
4431 self.fail("accept() returned success when we did not expect it")
4432
Serhiy Storchaka43767632013-11-03 21:31:38 +02004433 @unittest.skipUnless(hasattr(signal, 'alarm'),
4434 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004435 def testInterruptedTimeout(self):
4436 # XXX I don't know how to do this test on MSWindows or any other
4437 # plaform that doesn't support signal.alarm() or os.kill(), though
4438 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004439 self.serv.settimeout(5.0) # must be longer than alarm
4440 class Alarm(Exception):
4441 pass
4442 def alarm_handler(signal, frame):
4443 raise Alarm
4444 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4445 try:
4446 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4447 try:
4448 foo = self.serv.accept()
4449 except socket.timeout:
4450 self.fail("caught timeout instead of Alarm")
4451 except Alarm:
4452 pass
4453 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004454 self.fail("caught other exception instead of Alarm:"
4455 " %s(%s):\n%s" %
4456 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004457 else:
4458 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004459 finally:
4460 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004461 except Alarm:
4462 self.fail("got Alarm in wrong place")
4463 finally:
4464 # no alarm can be pending. Safe to restore old handler.
4465 signal.signal(signal.SIGALRM, old_alarm)
4466
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004467class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004468
4469 def testUDPTimeout(self):
4470 def raise_timeout(*args, **kwargs):
4471 self.serv.settimeout(1.0)
4472 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004473 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004474 "Error generating a timeout exception (UDP)")
4475
4476 def testTimeoutZero(self):
4477 ok = False
4478 try:
4479 self.serv.settimeout(0.0)
4480 foo = self.serv.recv(1024)
4481 except socket.timeout:
4482 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004483 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004484 ok = True
4485 except:
4486 self.fail("caught unexpected exception (UDP)")
4487 if not ok:
4488 self.fail("recv() returned success when we did not expect it")
4489
4490class TestExceptions(unittest.TestCase):
4491
4492 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004493 self.assertTrue(issubclass(OSError, Exception))
4494 self.assertTrue(issubclass(socket.herror, OSError))
4495 self.assertTrue(issubclass(socket.gaierror, OSError))
4496 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004497
Serhiy Storchaka43767632013-11-03 21:31:38 +02004498@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004499class TestLinuxAbstractNamespace(unittest.TestCase):
4500
4501 UNIX_PATH_MAX = 108
4502
4503 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004504 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004505 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4506 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004507 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004508 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4509 s2.connect(s1.getsockname())
4510 with s1.accept()[0] as s3:
4511 self.assertEqual(s1.getsockname(), address)
4512 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004513
4514 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004515 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004516 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4517 s.bind(address)
4518 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004519
4520 def testNameOverflow(self):
4521 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004522 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004523 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004524
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004525 def testStrName(self):
4526 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004527 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4528 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004529 s.bind("\x00python\x00test\x00")
4530 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004531 finally:
4532 s.close()
4533
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004534 def testBytearrayName(self):
4535 # Check that an abstract name can be passed as a bytearray.
4536 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4537 s.bind(bytearray(b"\x00python\x00test\x00"))
4538 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4539
Serhiy Storchaka43767632013-11-03 21:31:38 +02004540@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004541class TestUnixDomain(unittest.TestCase):
4542
4543 def setUp(self):
4544 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4545
4546 def tearDown(self):
4547 self.sock.close()
4548
4549 def encoded(self, path):
4550 # Return the given path encoded in the file system encoding,
4551 # or skip the test if this is not possible.
4552 try:
4553 return os.fsencode(path)
4554 except UnicodeEncodeError:
4555 self.skipTest(
4556 "Pathname {0!a} cannot be represented in file "
4557 "system encoding {1!r}".format(
4558 path, sys.getfilesystemencoding()))
4559
Antoine Pitrou16374872011-12-16 15:04:12 +01004560 def bind(self, sock, path):
4561 # Bind the socket
4562 try:
4563 sock.bind(path)
4564 except OSError as e:
4565 if str(e) == "AF_UNIX path too long":
4566 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004567 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004568 .format(path))
4569 else:
4570 raise
4571
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004572 def testStrAddr(self):
4573 # Test binding to and retrieving a normal string pathname.
4574 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004575 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004576 self.addCleanup(support.unlink, path)
4577 self.assertEqual(self.sock.getsockname(), path)
4578
4579 def testBytesAddr(self):
4580 # Test binding to a bytes pathname.
4581 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004582 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004583 self.addCleanup(support.unlink, path)
4584 self.assertEqual(self.sock.getsockname(), path)
4585
4586 def testSurrogateescapeBind(self):
4587 # Test binding to a valid non-ASCII pathname, with the
4588 # non-ASCII bytes supplied using surrogateescape encoding.
4589 path = os.path.abspath(support.TESTFN_UNICODE)
4590 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004591 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004592 self.addCleanup(support.unlink, path)
4593 self.assertEqual(self.sock.getsockname(), path)
4594
4595 def testUnencodableAddr(self):
4596 # Test binding to a pathname that cannot be encoded in the
4597 # file system encoding.
4598 if support.TESTFN_UNENCODABLE is None:
4599 self.skipTest("No unencodable filename available")
4600 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004601 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004602 self.addCleanup(support.unlink, path)
4603 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004604
Victor Stinner45df8202010-04-28 22:31:17 +00004605@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004606class BufferIOTest(SocketConnectedTest):
4607 """
4608 Test the buffer versions of socket.recv() and socket.send().
4609 """
4610 def __init__(self, methodName='runTest'):
4611 SocketConnectedTest.__init__(self, methodName=methodName)
4612
Antoine Pitrou25480782010-03-17 22:50:28 +00004613 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004614 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004615 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004616 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004617 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004618 self.assertEqual(msg, MSG)
4619
Antoine Pitrou25480782010-03-17 22:50:28 +00004620 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004621 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004622 self.serv_conn.send(buf)
4623
Antoine Pitrou25480782010-03-17 22:50:28 +00004624 def testRecvIntoBytearray(self):
4625 buf = bytearray(1024)
4626 nbytes = self.cli_conn.recv_into(buf)
4627 self.assertEqual(nbytes, len(MSG))
4628 msg = buf[:len(MSG)]
4629 self.assertEqual(msg, MSG)
4630
4631 _testRecvIntoBytearray = _testRecvIntoArray
4632
4633 def testRecvIntoMemoryview(self):
4634 buf = bytearray(1024)
4635 nbytes = self.cli_conn.recv_into(memoryview(buf))
4636 self.assertEqual(nbytes, len(MSG))
4637 msg = buf[:len(MSG)]
4638 self.assertEqual(msg, MSG)
4639
4640 _testRecvIntoMemoryview = _testRecvIntoArray
4641
4642 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004643 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004644 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004645 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004646 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004647 self.assertEqual(msg, MSG)
4648
Antoine Pitrou25480782010-03-17 22:50:28 +00004649 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004650 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004651 self.serv_conn.send(buf)
4652
Antoine Pitrou25480782010-03-17 22:50:28 +00004653 def testRecvFromIntoBytearray(self):
4654 buf = bytearray(1024)
4655 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4656 self.assertEqual(nbytes, len(MSG))
4657 msg = buf[:len(MSG)]
4658 self.assertEqual(msg, MSG)
4659
4660 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4661
4662 def testRecvFromIntoMemoryview(self):
4663 buf = bytearray(1024)
4664 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4665 self.assertEqual(nbytes, len(MSG))
4666 msg = buf[:len(MSG)]
4667 self.assertEqual(msg, MSG)
4668
4669 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4670
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004671 def testRecvFromIntoSmallBuffer(self):
4672 # See issue #20246.
4673 buf = bytearray(8)
4674 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4675
4676 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004677 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004678
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004679 def testRecvFromIntoEmptyBuffer(self):
4680 buf = bytearray()
4681 self.cli_conn.recvfrom_into(buf)
4682 self.cli_conn.recvfrom_into(buf, 0)
4683
4684 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4685
Christian Heimes043d6f62008-01-07 17:19:16 +00004686
4687TIPC_STYPE = 2000
4688TIPC_LOWER = 200
4689TIPC_UPPER = 210
4690
4691def isTipcAvailable():
4692 """Check if the TIPC module is loaded
4693
4694 The TIPC module is not loaded automatically on Ubuntu and probably
4695 other Linux distros.
4696 """
4697 if not hasattr(socket, "AF_TIPC"):
4698 return False
4699 if not os.path.isfile("/proc/modules"):
4700 return False
4701 with open("/proc/modules") as f:
4702 for line in f:
4703 if line.startswith("tipc "):
4704 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004705 return False
4706
Serhiy Storchaka43767632013-11-03 21:31:38 +02004707@unittest.skipUnless(isTipcAvailable(),
4708 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004709class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004710 def testRDM(self):
4711 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4712 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004713 self.addCleanup(srv.close)
4714 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004715
4716 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4717 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4718 TIPC_LOWER, TIPC_UPPER)
4719 srv.bind(srvaddr)
4720
4721 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4722 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4723 cli.sendto(MSG, sendaddr)
4724
4725 msg, recvaddr = srv.recvfrom(1024)
4726
4727 self.assertEqual(cli.getsockname(), recvaddr)
4728 self.assertEqual(msg, MSG)
4729
4730
Serhiy Storchaka43767632013-11-03 21:31:38 +02004731@unittest.skipUnless(isTipcAvailable(),
4732 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004733class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004734 def __init__(self, methodName = 'runTest'):
4735 unittest.TestCase.__init__(self, methodName = methodName)
4736 ThreadableTest.__init__(self)
4737
4738 def setUp(self):
4739 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004740 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004741 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4742 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4743 TIPC_LOWER, TIPC_UPPER)
4744 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01004745 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00004746 self.serverExplicitReady()
4747 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004748 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004749
4750 def clientSetUp(self):
4751 # The is a hittable race between serverExplicitReady() and the
4752 # accept() call; sleep a little while to avoid it, otherwise
4753 # we could get an exception
4754 time.sleep(0.1)
4755 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004756 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004757 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4758 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4759 self.cli.connect(addr)
4760 self.cliaddr = self.cli.getsockname()
4761
4762 def testStream(self):
4763 msg = self.conn.recv(1024)
4764 self.assertEqual(msg, MSG)
4765 self.assertEqual(self.cliaddr, self.connaddr)
4766
4767 def _testStream(self):
4768 self.cli.send(MSG)
4769 self.cli.close()
4770
4771
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004772@unittest.skipUnless(thread, 'Threading required for this test.')
4773class ContextManagersTest(ThreadedTCPSocketTest):
4774
4775 def _testSocketClass(self):
4776 # base test
4777 with socket.socket() as sock:
4778 self.assertFalse(sock._closed)
4779 self.assertTrue(sock._closed)
4780 # close inside with block
4781 with socket.socket() as sock:
4782 sock.close()
4783 self.assertTrue(sock._closed)
4784 # exception inside with block
4785 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004786 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004787 self.assertTrue(sock._closed)
4788
4789 def testCreateConnectionBase(self):
4790 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004791 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004792 data = conn.recv(1024)
4793 conn.sendall(data)
4794
4795 def _testCreateConnectionBase(self):
4796 address = self.serv.getsockname()
4797 with socket.create_connection(address) as sock:
4798 self.assertFalse(sock._closed)
4799 sock.sendall(b'foo')
4800 self.assertEqual(sock.recv(1024), b'foo')
4801 self.assertTrue(sock._closed)
4802
4803 def testCreateConnectionClose(self):
4804 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004805 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004806 data = conn.recv(1024)
4807 conn.sendall(data)
4808
4809 def _testCreateConnectionClose(self):
4810 address = self.serv.getsockname()
4811 with socket.create_connection(address) as sock:
4812 sock.close()
4813 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004814 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004815
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004816
Victor Stinnerdaf45552013-08-28 00:53:59 +02004817class InheritanceTest(unittest.TestCase):
4818 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4819 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02004820 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004821 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004822 with socket.socket(socket.AF_INET,
4823 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4824 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02004825 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02004826
4827 def test_default_inheritable(self):
4828 sock = socket.socket()
4829 with sock:
4830 self.assertEqual(sock.get_inheritable(), False)
4831
4832 def test_dup(self):
4833 sock = socket.socket()
4834 with sock:
4835 newsock = sock.dup()
4836 sock.close()
4837 with newsock:
4838 self.assertEqual(newsock.get_inheritable(), False)
4839
4840 def test_set_inheritable(self):
4841 sock = socket.socket()
4842 with sock:
4843 sock.set_inheritable(True)
4844 self.assertEqual(sock.get_inheritable(), True)
4845
4846 sock.set_inheritable(False)
4847 self.assertEqual(sock.get_inheritable(), False)
4848
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004849 @unittest.skipIf(fcntl is None, "need fcntl")
4850 def test_get_inheritable_cloexec(self):
4851 sock = socket.socket()
4852 with sock:
4853 fd = sock.fileno()
4854 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004855
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004856 # clear FD_CLOEXEC flag
4857 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
4858 flags &= ~fcntl.FD_CLOEXEC
4859 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004860
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004861 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004862
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004863 @unittest.skipIf(fcntl is None, "need fcntl")
4864 def test_set_inheritable_cloexec(self):
4865 sock = socket.socket()
4866 with sock:
4867 fd = sock.fileno()
4868 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4869 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004870
Victor Stinner4f7a36f2013-09-08 14:14:38 +02004871 sock.set_inheritable(True)
4872 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
4873 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02004874
4875
Victor Stinnerdaf45552013-08-28 00:53:59 +02004876 @unittest.skipUnless(hasattr(socket, "socketpair"),
4877 "need socket.socketpair()")
4878 def test_socketpair(self):
4879 s1, s2 = socket.socketpair()
4880 self.addCleanup(s1.close)
4881 self.addCleanup(s2.close)
4882 self.assertEqual(s1.get_inheritable(), False)
4883 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004884
4885
4886@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4887 "SOCK_NONBLOCK not defined")
4888class NonblockConstantTest(unittest.TestCase):
4889 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4890 if nonblock:
4891 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4892 self.assertEqual(s.gettimeout(), timeout)
4893 else:
4894 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4895 self.assertEqual(s.gettimeout(), None)
4896
Charles-François Natali239bb962011-06-03 12:55:15 +02004897 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004898 def test_SOCK_NONBLOCK(self):
4899 # a lot of it seems silly and redundant, but I wanted to test that
4900 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004901 with socket.socket(socket.AF_INET,
4902 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4903 self.checkNonblock(s)
4904 s.setblocking(1)
4905 self.checkNonblock(s, False)
4906 s.setblocking(0)
4907 self.checkNonblock(s)
4908 s.settimeout(None)
4909 self.checkNonblock(s, False)
4910 s.settimeout(2.0)
4911 self.checkNonblock(s, timeout=2.0)
4912 s.setblocking(1)
4913 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004914 # defaulttimeout
4915 t = socket.getdefaulttimeout()
4916 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004917 with socket.socket() as s:
4918 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004919 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004920 with socket.socket() as s:
4921 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004922 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004923 with socket.socket() as s:
4924 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004925 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004926 with socket.socket() as s:
4927 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004928 socket.setdefaulttimeout(t)
4929
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004930
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004931@unittest.skipUnless(os.name == "nt", "Windows specific")
4932@unittest.skipUnless(multiprocessing, "need multiprocessing")
4933class TestSocketSharing(SocketTCPTest):
4934 # This must be classmethod and not staticmethod or multiprocessing
4935 # won't be able to bootstrap it.
4936 @classmethod
4937 def remoteProcessServer(cls, q):
4938 # Recreate socket from shared data
4939 sdata = q.get()
4940 message = q.get()
4941
4942 s = socket.fromshare(sdata)
4943 s2, c = s.accept()
4944
4945 # Send the message
4946 s2.sendall(message)
4947 s2.close()
4948 s.close()
4949
4950 def testShare(self):
4951 # Transfer the listening server socket to another process
4952 # and service it from there.
4953
4954 # Create process:
4955 q = multiprocessing.Queue()
4956 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
4957 p.start()
4958
4959 # Get the shared socket data
4960 data = self.serv.share(p.pid)
4961
4962 # Pass the shared socket to the other process
4963 addr = self.serv.getsockname()
4964 self.serv.close()
4965 q.put(data)
4966
4967 # The data that the server will send us
4968 message = b"slapmahfro"
4969 q.put(message)
4970
4971 # Connect
4972 s = socket.create_connection(addr)
4973 # listen for the data
4974 m = []
4975 while True:
4976 data = s.recv(100)
4977 if not data:
4978 break
4979 m.append(data)
4980 s.close()
4981 received = b"".join(m)
4982 self.assertEqual(received, message)
4983 p.join()
4984
4985 def testShareLength(self):
4986 data = self.serv.share(os.getpid())
4987 self.assertRaises(ValueError, socket.fromshare, data[:-1])
4988 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
4989
4990 def compareSockets(self, org, other):
4991 # socket sharing is expected to work only for blocking socket
4992 # since the internal python timout value isn't transfered.
4993 self.assertEqual(org.gettimeout(), None)
4994 self.assertEqual(org.gettimeout(), other.gettimeout())
4995
4996 self.assertEqual(org.family, other.family)
4997 self.assertEqual(org.type, other.type)
4998 # If the user specified "0" for proto, then
4999 # internally windows will have picked the correct value.
5000 # Python introspection on the socket however will still return
5001 # 0. For the shared socket, the python value is recreated
5002 # from the actual value, so it may not compare correctly.
5003 if org.proto != 0:
5004 self.assertEqual(org.proto, other.proto)
5005
5006 def testShareLocal(self):
5007 data = self.serv.share(os.getpid())
5008 s = socket.fromshare(data)
5009 try:
5010 self.compareSockets(self.serv, s)
5011 finally:
5012 s.close()
5013
5014 def testTypes(self):
5015 families = [socket.AF_INET, socket.AF_INET6]
5016 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5017 for f in families:
5018 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005019 try:
5020 source = socket.socket(f, t)
5021 except OSError:
5022 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005023 try:
5024 data = source.share(os.getpid())
5025 shared = socket.fromshare(data)
5026 try:
5027 self.compareSockets(source, shared)
5028 finally:
5029 shared.close()
5030 finally:
5031 source.close()
5032
5033
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005034@unittest.skipUnless(thread, 'Threading required for this test.')
5035class SendfileUsingSendTest(ThreadedTCPSocketTest):
5036 """
5037 Test the send() implementation of socket.sendfile().
5038 """
5039
5040 FILESIZE = (10 * 1024 * 1024) # 10MB
5041 BUFSIZE = 8192
5042 FILEDATA = b""
5043 TIMEOUT = 2
5044
5045 @classmethod
5046 def setUpClass(cls):
5047 def chunks(total, step):
5048 assert total >= step
5049 while total > step:
5050 yield step
5051 total -= step
5052 if total:
5053 yield total
5054
5055 chunk = b"".join([random.choice(string.ascii_letters).encode()
5056 for i in range(cls.BUFSIZE)])
5057 with open(support.TESTFN, 'wb') as f:
5058 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5059 f.write(chunk)
5060 with open(support.TESTFN, 'rb') as f:
5061 cls.FILEDATA = f.read()
5062 assert len(cls.FILEDATA) == cls.FILESIZE
5063
5064 @classmethod
5065 def tearDownClass(cls):
5066 support.unlink(support.TESTFN)
5067
5068 def accept_conn(self):
5069 self.serv.settimeout(self.TIMEOUT)
5070 conn, addr = self.serv.accept()
5071 conn.settimeout(self.TIMEOUT)
5072 self.addCleanup(conn.close)
5073 return conn
5074
5075 def recv_data(self, conn):
5076 received = []
5077 while True:
5078 chunk = conn.recv(self.BUFSIZE)
5079 if not chunk:
5080 break
5081 received.append(chunk)
5082 return b''.join(received)
5083
5084 def meth_from_sock(self, sock):
5085 # Depending on the mixin class being run return either send()
5086 # or sendfile() method implementation.
5087 return getattr(sock, "_sendfile_use_send")
5088
5089 # regular file
5090
5091 def _testRegularFile(self):
5092 address = self.serv.getsockname()
5093 file = open(support.TESTFN, 'rb')
5094 with socket.create_connection(address) as sock, file as file:
5095 meth = self.meth_from_sock(sock)
5096 sent = meth(file)
5097 self.assertEqual(sent, self.FILESIZE)
5098 self.assertEqual(file.tell(), self.FILESIZE)
5099
5100 def testRegularFile(self):
5101 conn = self.accept_conn()
5102 data = self.recv_data(conn)
5103 self.assertEqual(len(data), self.FILESIZE)
5104 self.assertEqual(data, self.FILEDATA)
5105
5106 # non regular file
5107
5108 def _testNonRegularFile(self):
5109 address = self.serv.getsockname()
5110 file = io.BytesIO(self.FILEDATA)
5111 with socket.create_connection(address) as sock, file as file:
5112 sent = sock.sendfile(file)
5113 self.assertEqual(sent, self.FILESIZE)
5114 self.assertEqual(file.tell(), self.FILESIZE)
5115 self.assertRaises(socket._GiveupOnSendfile,
5116 sock._sendfile_use_sendfile, file)
5117
5118 def testNonRegularFile(self):
5119 conn = self.accept_conn()
5120 data = self.recv_data(conn)
5121 self.assertEqual(len(data), self.FILESIZE)
5122 self.assertEqual(data, self.FILEDATA)
5123
5124 # empty file
5125
5126 def _testEmptyFileSend(self):
5127 address = self.serv.getsockname()
5128 filename = support.TESTFN + "2"
5129 with open(filename, 'wb'):
5130 self.addCleanup(support.unlink, filename)
5131 file = open(filename, 'rb')
5132 with socket.create_connection(address) as sock, file as file:
5133 meth = self.meth_from_sock(sock)
5134 sent = meth(file)
5135 self.assertEqual(sent, 0)
5136 self.assertEqual(file.tell(), 0)
5137
5138 def testEmptyFileSend(self):
5139 conn = self.accept_conn()
5140 data = self.recv_data(conn)
5141 self.assertEqual(data, b"")
5142
5143 # offset
5144
5145 def _testOffset(self):
5146 address = self.serv.getsockname()
5147 file = open(support.TESTFN, 'rb')
5148 with socket.create_connection(address) as sock, file as file:
5149 meth = self.meth_from_sock(sock)
5150 sent = meth(file, offset=5000)
5151 self.assertEqual(sent, self.FILESIZE - 5000)
5152 self.assertEqual(file.tell(), self.FILESIZE)
5153
5154 def testOffset(self):
5155 conn = self.accept_conn()
5156 data = self.recv_data(conn)
5157 self.assertEqual(len(data), self.FILESIZE - 5000)
5158 self.assertEqual(data, self.FILEDATA[5000:])
5159
5160 # count
5161
5162 def _testCount(self):
5163 address = self.serv.getsockname()
5164 file = open(support.TESTFN, 'rb')
5165 with socket.create_connection(address, timeout=2) as sock, file as file:
5166 count = 5000007
5167 meth = self.meth_from_sock(sock)
5168 sent = meth(file, count=count)
5169 self.assertEqual(sent, count)
5170 self.assertEqual(file.tell(), count)
5171
5172 def testCount(self):
5173 count = 5000007
5174 conn = self.accept_conn()
5175 data = self.recv_data(conn)
5176 self.assertEqual(len(data), count)
5177 self.assertEqual(data, self.FILEDATA[:count])
5178
5179 # count small
5180
5181 def _testCountSmall(self):
5182 address = self.serv.getsockname()
5183 file = open(support.TESTFN, 'rb')
5184 with socket.create_connection(address, timeout=2) as sock, file as file:
5185 count = 1
5186 meth = self.meth_from_sock(sock)
5187 sent = meth(file, count=count)
5188 self.assertEqual(sent, count)
5189 self.assertEqual(file.tell(), count)
5190
5191 def testCountSmall(self):
5192 count = 1
5193 conn = self.accept_conn()
5194 data = self.recv_data(conn)
5195 self.assertEqual(len(data), count)
5196 self.assertEqual(data, self.FILEDATA[:count])
5197
5198 # count + offset
5199
5200 def _testCountWithOffset(self):
5201 address = self.serv.getsockname()
5202 file = open(support.TESTFN, 'rb')
5203 with socket.create_connection(address, timeout=2) as sock, file as file:
5204 count = 100007
5205 meth = self.meth_from_sock(sock)
5206 sent = meth(file, offset=2007, count=count)
5207 self.assertEqual(sent, count)
5208 self.assertEqual(file.tell(), count + 2007)
5209
5210 def testCountWithOffset(self):
5211 count = 100007
5212 conn = self.accept_conn()
5213 data = self.recv_data(conn)
5214 self.assertEqual(len(data), count)
5215 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5216
5217 # non blocking sockets are not supposed to work
5218
5219 def _testNonBlocking(self):
5220 address = self.serv.getsockname()
5221 file = open(support.TESTFN, 'rb')
5222 with socket.create_connection(address) as sock, file as file:
5223 sock.setblocking(False)
5224 meth = self.meth_from_sock(sock)
5225 self.assertRaises(ValueError, meth, file)
5226 self.assertRaises(ValueError, sock.sendfile, file)
5227
5228 def testNonBlocking(self):
5229 conn = self.accept_conn()
5230 if conn.recv(8192):
5231 self.fail('was not supposed to receive any data')
5232
5233 # timeout (non-triggered)
5234
5235 def _testWithTimeout(self):
5236 address = self.serv.getsockname()
5237 file = open(support.TESTFN, 'rb')
5238 with socket.create_connection(address, timeout=2) as sock, file as file:
5239 meth = self.meth_from_sock(sock)
5240 sent = meth(file)
5241 self.assertEqual(sent, self.FILESIZE)
5242
5243 def testWithTimeout(self):
5244 conn = self.accept_conn()
5245 data = self.recv_data(conn)
5246 self.assertEqual(len(data), self.FILESIZE)
5247 self.assertEqual(data, self.FILEDATA)
5248
5249 # timeout (triggered)
5250
5251 def _testWithTimeoutTriggeredSend(self):
5252 address = self.serv.getsockname()
5253 file = open(support.TESTFN, 'rb')
5254 with socket.create_connection(address, timeout=0.01) as sock, \
5255 file as file:
5256 meth = self.meth_from_sock(sock)
5257 self.assertRaises(socket.timeout, meth, file)
5258
5259 def testWithTimeoutTriggeredSend(self):
5260 conn = self.accept_conn()
5261 conn.recv(88192)
5262
5263 # errors
5264
5265 def _test_errors(self):
5266 pass
5267
5268 def test_errors(self):
5269 with open(support.TESTFN, 'rb') as file:
5270 with socket.socket(type=socket.SOCK_DGRAM) as s:
5271 meth = self.meth_from_sock(s)
5272 self.assertRaisesRegex(
5273 ValueError, "SOCK_STREAM", meth, file)
5274 with open(support.TESTFN, 'rt') as file:
5275 with socket.socket() as s:
5276 meth = self.meth_from_sock(s)
5277 self.assertRaisesRegex(
5278 ValueError, "binary mode", meth, file)
5279 with open(support.TESTFN, 'rb') as file:
5280 with socket.socket() as s:
5281 meth = self.meth_from_sock(s)
5282 self.assertRaisesRegex(TypeError, "positive integer",
5283 meth, file, count='2')
5284 self.assertRaisesRegex(TypeError, "positive integer",
5285 meth, file, count=0.1)
5286 self.assertRaisesRegex(ValueError, "positive integer",
5287 meth, file, count=0)
5288 self.assertRaisesRegex(ValueError, "positive integer",
5289 meth, file, count=-1)
5290
5291
5292@unittest.skipUnless(thread, 'Threading required for this test.')
5293@unittest.skipUnless(hasattr(os, "sendfile"),
5294 'os.sendfile() required for this test.')
5295class SendfileUsingSendfileTest(SendfileUsingSendTest):
5296 """
5297 Test the sendfile() implementation of socket.sendfile().
5298 """
5299 def meth_from_sock(self, sock):
5300 return getattr(sock, "_sendfile_use_sendfile")
5301
5302
Guido van Rossumb995eb72002-07-31 16:08:40 +00005303def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005304 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005305 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005306
5307 tests.extend([
5308 NonBlockingTCPTests,
5309 FileObjectClassTestCase,
5310 UnbufferedFileObjectClassTestCase,
5311 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005312 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005313 UnicodeReadFileObjectClassTestCase,
5314 UnicodeWriteFileObjectClassTestCase,
5315 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005316 NetworkConnectionNoServer,
5317 NetworkConnectionAttributesTest,
5318 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005319 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005320 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005321 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005322 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005323 tests.append(BasicSocketPairTest)
5324 tests.append(TestUnixDomain)
5325 tests.append(TestLinuxAbstractNamespace)
5326 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005327 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005328 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005329 tests.extend([
5330 CmsgMacroTests,
5331 SendmsgUDPTest,
5332 RecvmsgUDPTest,
5333 RecvmsgIntoUDPTest,
5334 SendmsgUDP6Test,
5335 RecvmsgUDP6Test,
5336 RecvmsgRFC3542AncillaryUDP6Test,
5337 RecvmsgIntoRFC3542AncillaryUDP6Test,
5338 RecvmsgIntoUDP6Test,
5339 SendmsgTCPTest,
5340 RecvmsgTCPTest,
5341 RecvmsgIntoTCPTest,
5342 SendmsgSCTPStreamTest,
5343 RecvmsgSCTPStreamTest,
5344 RecvmsgIntoSCTPStreamTest,
5345 SendmsgUnixStreamTest,
5346 RecvmsgUnixStreamTest,
5347 RecvmsgIntoUnixStreamTest,
5348 RecvmsgSCMRightsStreamTest,
5349 RecvmsgIntoSCMRightsStreamTest,
5350 # These are slow when setitimer() is not available
5351 InterruptedRecvTimeoutTest,
5352 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005353 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005354 SendfileUsingSendTest,
5355 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005356 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005357
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005358 thread_info = support.threading_setup()
5359 support.run_unittest(*tests)
5360 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005361
5362if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005363 test_main()